qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

Swing使用Substance外观包异常问题

  问题一:今天更新我的Java版QQ,在网上找到了Substance外观包,效果不错,直接用了,可是设置水印问题时就出现问题,网上有现成的例子

  1. JFrame.setDefaultLookAndFeelDecorated(true);  
  2. JDialog.setDefaultLookAndFeelDecorated(true);  
  3. try  {  
  4.             SubstanceImageWatermark watermark  =   new  SubstanceImageWatermark(LoginFrame. class .getResourceAsStream( " /demo/001.jpg " ));  
  5.             watermark.setKind(ImageWatermarkKind.SCREEN_CENTER_SCALE);  
  6.             SubstanceSkin skin  =   new  OfficeBlue2007Skin().withWatermark(watermark);   //初始化有水印的皮肤 
  7.             UIManager.setLookAndFeel( new  SubstanceOfficeBlue2007LookAndFeel());  
  8.             SubstanceLookAndFeel.setSkin(skin);  //设置皮肤 
  9.              
  10.         }  catch  (UnsupportedLookAndFeelException ex) {  
  11.             Logger.getLogger(LoginFrame. class .getName()).log(Level.SEVERE,  null , ex);  
  12.         }

  可是在我导入的包里死活包withWatermark方法不存在,于是就Google,最后看到一哥们说,自从subtance6.0以后就去掉了withWatermark设置水印方法,原因貌似是不安全,可是想用水印的效果呢?那你就换成substance5.0版本吧!换了之后果然能用了效果图:背景比较淡,水印不明显。

  问题二:使用subtance出现异常UIDefaults.getUI() failed: 和org.jvnet.substance.api.UiThreadingViolationException,有一前辈说是包不能识别啥的,就我遇到的问题,只是换了皮肤之后框架布局变了,不在于能不能用的问题,关键还是在代码上,我遇到的这个问题就在于我的代码设置问题,先把我的部分代码贴出来分析一下:

  1. package com.client.frm;  
  2. import java.awt.AWTException;  
  3. import java.awt.Color;  
  4. import java.awt.Component;  
  5. import java.awt.Dimension;  
  6. import java.awt.FlowLayout;  
  7. import java.awt.Image;  
  8. import java.awt.Insets;  
  9. import java.awt.MenuItem;  
  10. import java.awt.PopupMenu;  
  11. import java.awt.SystemTray;  
  12. import java.awt.TrayIcon;  
  13. import java.awt.event.ActionEvent;  
  14. import java.awt.event.ActionListener;  
  15. import java.awt.event.MouseAdapter;  
  16. import java.awt.event.MouseEvent;  
  17. import java.awt.event.WindowAdapter;  
  18. import java.awt.event.WindowEvent;  
  19. import java.io.IOException;  
  20. import java.io.ObjectInputStream;  
  21. import java.io.ObjectOutputStream;  
  22. import java.util.HashMap;  
  23. import java.util.List;  
  24. import java.util.Vector;  
  25. import java.util.logging.Level;  
  26. import java.util.logging.Logger;  
  27. import javax.swing.DefaultListCellRenderer;  
  28. import javax.swing.DefaultListModel;  
  29. import javax.swing.ImageIcon;  
  30. import javax.swing.JButton;  
  31. import javax.swing.JComboBox;  
  32. import javax.swing.JDialog;  
  33. import javax.swing.JFrame;  
  34. import javax.swing.JLabel;  
  35. import javax.swing.JList;  
  36. import javax.swing.JMenuItem;  
  37. import javax.swing.JOptionPane;  
  38. import javax.swing.JPanel;  
  39. import javax.swing.JPopupMenu;  
  40. import javax.swing.JScrollPane;  
  41. import javax.swing.JTextArea;  
  42. import javax.swing.SwingConstants;  
  43. import javax.swing.SwingUtilities;  
  44. import javax.swing.UIManager;  
  45. import javax.swing.UnsupportedLookAndFeelException;  
  46. import javax.swing.border.LineBorder;  
  47. import org.jvnet.substance.SubstanceLookAndFeel;  
  48. import org.jvnet.substance.api.SubstanceSkin;  
  49. import org.jvnet.substance.api.SubstanceConstants.ImageWatermarkKind;  
  50. import org.jvnet.substance.skin.OfficeBlue2007Skin;  
  51. import org.jvnet.substance.skin.SubstanceOfficeBlue2007LookAndFeel;  
  52. import org.jvnet.substance.watermark.SubstanceImageWatermark;  
  53. import sun.audio.AudioPlayer;  
  54. import sun.audio.AudioStream;  
  55. import tools.PicturePane;  
  56. import data.ChatMessage;  
  57. import data.FriendUser;  
  58. import data.Portrait;  
  59. import data.QQMessage;  
  60. import data.UserState;  
  61. public class UserMainView extends JFrame implements ActionListener {  
  62.       
  63.     /** 
  64.      * @author Mackalli 
  65.  × 2011/10/3 
  66.      */ 
  67.     private static final long serialVersionUID = 1L;  
  68.     private JButton btnPhoto;  
  69.     private JComboBox jcbState;  
  70.     private JLabel lblNickName;  
  71.     private JTextArea areaSignature;  
  72.     private JLabel lblLoginBar = new JLabel();  
  73.     private JButton btnLoginCancel;  
  74.     private JPanel fillWidth = new FillWidth(300200,false);  
  75.     private JButton btnZone;  
  76.     private JButton btnEmail;  
  77.     private JButton btnNews;  
  78.     private JButton btnShop;  
  79.     private JButton btnSkin;  
  80.     //Color bgColor = new Color(211, 234, 224); 
  81.     private JList listFriend;  
  82.     private DefaultListModel listModel = null;  
  83.     // Integer存入的类型(K-此映射所维护的键的类型),ChatView对应映射(V - 所映射值的类型) 
  84.     private HashMap<Integer, ChatView> chat;  
  85.     FriendUser friendUser = null;  
  86.     private FriendUser selfUser = null;  
  87.     private Vector<FriendUser> v;  
  88.     private ObjectInputStream ois;  
  89.     private ObjectOutputStream oos;  
  90.     String QQ_NickName;  
  91.     String QQ_Num;  
  92.     Integer photo;  
  93.     Integer QQ_State;  
  94.     String signature;  
  95.     JPopupMenu popupMenu;  
  96.     JMenuItem itemChat;  
  97.     JMenuItem itemDelete;  
  98.     JMenuItem itemFriendInfo;  
  99.       
  100.     private JButton btnFind;  
  101.     private JButton btnHelp;  
  102.       
  103.     //private SystemTray systemTray=null; 
  104.     private SystemTray tray=null;   
  105.     static TrayIcon trayIcon=null;    // 静态托盘图标,收到信息闪动提醒 
  106.     private Image trayImage=null;  
  107.       
  108.     private PopupMenu popupTray=new PopupMenu();  //托盘列表 
  109.     private MenuItem itemExit=new MenuItem("退出");  
  110.     private MenuItem itemSetSound=new MenuItem("关闭声音");  
  111.       
  112.       
  113.     private PicturePane bgPane=new PicturePane();  
  114.       
  115.     private static SearchView searchView;  
  116.     private TrayThread trayThread=null;  
  117.       
  118.     private static boolean isAvailable=true;  //设置声音默认开启,在托盘中设置,就两种形式,故用static 
  119.     //ChatView isVisible 
  120.     private boolean isShow=false;  
  121.     private boolean isOpenMsg=false;  
  122.     //if message is new 
  123.     private boolean isNewMessage=false;  
  124.       
  125.     private ChatView chatView;  
  126.       
  127.     public UserMainView(ObjectOutputStream oos, ObjectInputStream ois,  
  128.             Vector<FriendUser> v) {  
  129.         JFrame.setDefaultLookAndFeelDecorated(true);  
  130.         JDialog.setDefaultLookAndFeelDecorated(true);  
  131.         try {  
  132.             SubstanceImageWatermark watermark = new SubstanceImageWatermark(  
  133.                     UserMainView.class 
  134.                             .getResourceAsStream("/client/images/backImages/2.jpg "));  
  135.             watermark.setKind(ImageWatermarkKind.SCREEN_CENTER_SCALE);  
  136.             SubstanceSkin skin = new OfficeBlue2007Skin()  
  137.                     .withWatermark(watermark); // 初始化有水印的皮肤 
  138.             UIManager.setLookAndFeel(new SubstanceOfficeBlue2007LookAndFeel());  
  139.             SubstanceLookAndFeel.setSkin(skin); // 设置皮肤 
  140.         } catch (UnsupportedLookAndFeelException ex) {  
  141.             Logger.getLogger(UserMainView.class.getName()).log(Level.SEVERE,  
  142.                     null, ex);  
  143.         }  
  144.         this.oos = oos;  
  145.         this.ois = ois;  
  146.         this.v = v;  
  147.         setTitle("QQ_li");  
  148.         setSize(280630);  
  149.         setResizable(false);  
  150.         // getContentPane().setBackground(bgColor); 
  151.         // this.setContentPane(bgPane); 
  152.         setLocation(92060);  
  153.         this.addWindowListener(new WindowAdapter() {  
  154.             public void windowIconified(WindowEvent e) {  
  155.                 setVisible(false);  
  156.             }  
  157.         });  
  158.         addTray();  
  159.         initMainView(v);  
  160.         setVisible(true);  
  161.         this.addWindowListener(new WindowAdapter() {  
  162.             public void windowClosing(WindowEvent e) {  
  163.                 QQMessage message = new QQMessage();  
  164.                 message.setType(77);  
  165.                 message.setObj(selfUser);  
  166.                 new WriteThread(message).start();  
  167.                 System.out.println(selfUser.getNickName() + "退出了");  
  168.                 chat = null;  
  169.                 UserMainView.this.dispose();  
  170.                 System.exit(0);  
  171.             }  
  172.         });  
  173.     }



  这是一个类,时刻要记得UIManager设置前提,放在构造方法的最前面,调用时要用到Swing工作线程 SwingUtilities.invokeLater()来调用,我在LoginView中调用的方法:

  1. //userMainView = new UserMainView(oos, ois, v); // 加载用户信<br> SwingUtilities.invokeLater(new Runnable() {<br> public void run() {   
  2.     userMainView = new UserMainView(oos, ois, v); // 加载用户信息  
  3.  userMainView.setVisible(true);   
  4.      }   
  5.      });   
  6.     LoginView.this.setVisible(false);  
  7. }

  当你出现上述异常时是不是直接

  1. userMainView = new UserMainView(oos, ois, v);   
  2. // 加载用户信息  
  3. 没有少量一句,SwingUtilities.invokeLater(new Runnable()  
  4. }

  这是Swing工作形式,我的最后出来结果了,和以前系统默认的就是大小比例的不同,不再抛出异常,我认为是代码的问题,这是今天的收获写出来大家分享一下,希望对一些困惑的朋友。

  有所帮助,我们这一行很多问题就要自己解决,太多的差异网上的东西只能是参考!Good luck,friends!

  最后感谢Java.net的精英们制作出来这么漂亮的Swing外观来! GNU-UP UP!!!!!!

  对你有所帮助就收藏一下,大家一起分享程序的快乐!

posted on 2012-01-20 09:56 顺其自然EVO 阅读(536) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 
<2012年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜