Swing使用Substance外觀包異常問題
問題一: 今天更新我的Java版QQ,在網(wǎng)上找到了Substance外觀包,效果不錯(cuò),直接用了,可是設(shè)置水印問題時(shí)就出現(xiàn)問題,網(wǎng)上有現(xiàn)成的例子
- JFrame.setDefaultLookAndFeelDecorated(true);
- JDialog.setDefaultLookAndFeelDecorated(true);
- try {
- SubstanceImageWatermark watermark = new SubstanceImageWatermark(LoginFrame. class .getResourceAsStream( " /demo/001.jpg " ));
- watermark.setKind(ImageWatermarkKind.SCREEN_CENTER_SCALE);
- SubstanceSkin skin = new OfficeBlue2007Skin().withWatermark(watermark); //初始化有水印的皮膚
- UIManager.setLookAndFeel( new SubstanceOfficeBlue2007LookAndFeel());
- SubstanceLookAndFeel.setSkin(skin); //設(shè)置皮膚
- } catch (UnsupportedLookAndFeelException ex) {
- Logger.getLogger(LoginFrame. class .getName()).log(Level.SEVERE, null , ex);
- }
可是在我導(dǎo)入的包里死活包withWatermark方法不存在,于是就Google,最后看到一哥們說,自從subtance6.0以后就去掉了 withWatermark設(shè)置水印方法,原因貌似是不安全,可是想用水印的效果呢?那你就換成substance5.0版本吧!換了之后果然能用了效果圖:北京比較淡,水印不明顯。
問題二:使用subtance出現(xiàn)異常UIDefaults.getUI() failed: 和org.jvnet.substance.api.UiThreadingViolationException,有一前輩說是包不能識別啥的,就我遇到的問題,只是換了皮膚之后框架布局變了,不在于能不能用的問題,關(guān)鍵還是在代碼上,我遇到的這個(gè)問題就在于我的代碼設(shè)置問題,先把我的部分代碼貼出來分析一下:
- package com.client.frm;
- import java.awt.AWTException;
- import java.awt.Color;
- import java.awt.Component;
- import java.awt.Dimension;
- import java.awt.FlowLayout;
- import java.awt.Image;
- import java.awt.Insets;
- import java.awt.MenuItem;
- import java.awt.PopupMenu;
- import java.awt.SystemTray;
- import java.awt.TrayIcon;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.awt.event.WindowAdapter;
- import java.awt.event.WindowEvent;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Vector;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import javax.swing.DefaultListCellRenderer;
- import javax.swing.DefaultListModel;
- import javax.swing.ImageIcon;
- import javax.swing.JButton;
- import javax.swing.JComboBox;
- import javax.swing.JDialog;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JList;
- import javax.swing.JMenuItem;
- import javax.swing.JOptionPane;
- import javax.swing.JPanel;
- import javax.swing.JPopupMenu;
- import javax.swing.JScrollPane;
- import javax.swing.JTextArea;
- import javax.swing.SwingConstants;
- import javax.swing.SwingUtilities;
- import javax.swing.UIManager;
- import javax.swing.UnsupportedLookAndFeelException;
- import javax.swing.border.LineBorder;
- import org.jvnet.substance.SubstanceLookAndFeel;
- import org.jvnet.substance.api.SubstanceSkin;
- import org.jvnet.substance.api.SubstanceConstants.ImageWatermarkKind;
- import org.jvnet.substance.skin.OfficeBlue2007Skin;
- import org.jvnet.substance.skin.SubstanceOfficeBlue2007LookAndFeel;
- import org.jvnet.substance.watermark.SubstanceImageWatermark;
- import sun.audio.AudioPlayer;
- import sun.audio.AudioStream;
- import tools.PicturePane;
- import data.ChatMessage;
- import data.FriendUser;
- import data.Portrait;
- import data.QQMessage;
- import data.UserState;
- public class UserMainView extends JFrame implements ActionListener {
- /**
- * @author Mackalli
- × 2011/10/3
- */
- private static final long serialVersionUID = 1L;
- private JButton btnPhoto;
- private JComboBox jcbState;
- private JLabel lblNickName;
- private JTextArea areaSignature;
- private JLabel lblLoginBar = new JLabel();
- private JButton btnLoginCancel;
- private JPanel fillWidth = new FillWidth(300, 200,false);
- private JButton btnZone;
- private JButton btnEmail;
- private JButton btnNews;
- private JButton btnShop;
- private JButton btnSkin;
- //Color bgColor = new Color(211, 234, 224);
- private JList listFriend;
- private DefaultListModel listModel = null;
- // Integer存入的類型(K-此映射所維護(hù)的鍵的類型),ChatView對應(yīng)映射(V - 所映射值的類型)
- private HashMap<Integer, ChatView> chat;
- FriendUser friendUser = null;
- private FriendUser selfUser = null;
- private Vector<FriendUser> v;
- private ObjectInputStream ois;
- private ObjectOutputStream oos;
- String QQ_NickName;
- String QQ_Num;
- Integer photo;
- Integer QQ_State;
- String signature;
- JPopupMenu popupMenu;
- JMenuItem itemChat;
- JMenuItem itemDelete;
- JMenuItem itemFriendInfo;
- private JButton btnFind;
- private JButton btnHelp;
- //private SystemTray systemTray=null;
- private SystemTray tray=null;
- static TrayIcon trayIcon=null; // 靜態(tài)托盤圖標(biāo),收到信息閃動(dòng)提醒
- private Image trayImage=null;
- private PopupMenu popupTray=new PopupMenu(); //托盤列表
- private MenuItem itemExit=new MenuItem("退出");
- private MenuItem itemSetSound=new MenuItem("關(guān)閉聲音");
- private PicturePane bgPane=new PicturePane();
- private static SearchView searchView;
- private TrayThread trayThread=null;
- private static boolean isAvailable=true; //設(shè)置聲音默認(rèn)開啟,在托盤中設(shè)置,就兩種形式,故用static
- //ChatView isVisible
- private boolean isShow=false;
- private boolean isOpenMsg=false;
- //if message is new
- private boolean isNewMessage=false;
- private ChatView chatView;
- public UserMainView(ObjectOutputStream oos, ObjectInputStream ois,
- Vector<FriendUser> v) {
- JFrame.setDefaultLookAndFeelDecorated(true);
- JDialog.setDefaultLookAndFeelDecorated(true);
- try {
- SubstanceImageWatermark watermark = new SubstanceImageWatermark(
- UserMainView.class
- .getResourceAsStream("/client/images/backImages/2.jpg "));
- watermark.setKind(ImageWatermarkKind.SCREEN_CENTER_SCALE);
- SubstanceSkin skin = new OfficeBlue2007Skin()
- .withWatermark(watermark); // 初始化有水印的皮膚
- UIManager.setLookAndFeel(new SubstanceOfficeBlue2007LookAndFeel());
- SubstanceLookAndFeel.setSkin(skin); // 設(shè)置皮膚
- } catch (UnsupportedLookAndFeelException ex) {
- Logger.getLogger(UserMainView.class.getName()).log(Level.SEVERE,
- null, ex);
- }
- this.oos = oos;
- this.ois = ois;
- this.v = v;
- setTitle("QQ_li");
- setSize(280, 630);
- setResizable(false);
- // getContentPane().setBackground(bgColor);
- // this.setContentPane(bgPane);
- setLocation(920, 60);
- this.addWindowListener(new WindowAdapter() {
- public void windowIconified(WindowEvent e) {
- setVisible(false);
- }
- });
- addTray();
- initMainView(v);
- setVisible(true);
- this.addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- QQMessage message = new QQMessage();
- message.setType(77);
- message.setObj(selfUser);
- new WriteThread(message).start();
- System.out.println(selfUser.getNickName() + "退出了");
- chat = null;
- UserMainView.this.dispose();
- System.exit(0);
- }
- });
- }
這是一個(gè)類,時(shí)刻要記得UIManager設(shè)置前提,放在構(gòu)造方法的最前面,調(diào)用時(shí)要用到Swing工作線程 SwingUtilities.invokeLater()來調(diào)用,我在LoginView中調(diào)用的方法:
- //userMainView = new UserMainView(oos, ois, v); // 加載用戶信<br> SwingUtilities.invokeLater(new Runnable() {<br> public void run() {
- userMainView = new UserMainView(oos, ois, v); // 加載用戶信息
- userMainView.setVisible(true);
- }
- });
- LoginView.this.setVisible(false);<br>}
當(dāng)你出現(xiàn)上述異常時(shí)是不是直接
- userMainView = new UserMainView(oos, ois, v); // 加載用戶信息
沒有少量一句,SwingUtilities.invokeLater(new Runnable()}這是Swing工作形式,我的最后出來結(jié)果了,和以前系統(tǒng)默認(rèn)的就是大小比例的不同,不再拋出異常,我認(rèn)為是代碼的問題,這是今天的收獲寫出來大家分享一下,希望對一些困惑的朋友有所幫助,我們這一行很多問題就要自己解決,太多的差異網(wǎng)上的東西只能是參考!Good luck,friends!最后感謝Java.net的精英們制作出來這么漂亮的Swing外觀來! GNU-UP UP?。。。。?!對你有所幫助就收藏一下,大家一起分享程序的快樂!
原文鏈接:http://www.cnblogs.com/blog-li/archive/2011/10/03/mackalli.html