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 閱讀(544) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2012年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宁强县| 虞城县| 大城县| 略阳县| 桐乡市| 富源县| 枣阳市| 凤凰县| 霍城县| 台南市| 鸡泽县| 友谊县| 会昌县| 遂昌县| 淳安县| 手游| 博湖县| 甘谷县| 南投市| 泸定县| 尼木县| 海盐县| 清原| 南召县| 平泉县| 浠水县| 许昌县| 都安| 罗江县| 故城县| 淮阳县| 新龙县| 疏附县| 启东市| 长寿区| 开阳县| 肇庆市| 贺州市| 陕西省| 波密县| 钟祥市|