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(300, 200,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(280, 630);  
  149.         setResizable(false);  
  150.         // getContentPane().setBackground(bgColor); 
  151.         // this.setContentPane(bgPane); 
  152.         setLocation(920, 60);  
  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!!!!!!

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

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-08-01 06:09:00

Swing使用Substance外观包异常问题的相关文章

Swing本地外观与Substance外观之间的切换问题及解决方案

Swing应用程序如果是在开源的Look&&Feel 之间切换,感觉很容易,但是如果把应用程序在开源外观下切换到系统默认的或者JDK自带的外观时,问题就来了.不是没有标题栏,就是标题栏的外观没有改变,用的是系统的窗口装饰.这些是因为在应用程序启动时在main方法里添加了这样一句代码造成的: JFrame.setDefaultLookAndFeelDecorated(true); 目前解决这个问题的办法就是先将 原来的JFrame dispose掉 ,然后在new一个 JFrame ,让原来

怎样导入外观包才可以用

问题描述 小女不才下载了好看的外观包就是不知道要放哪儿才可以用或者说怎样导入下载的外观包 解决方案 解决方案二:放到编译路径里解决方案三:http://blog.csdn.net/justinavril/archive/2008/08/07/2783182.aspx一般开发软件都有导入外包的功能,上面是eclipse导入外包的操作.解决方案四:如果是swing的,有专门的加载外观的函数解决方案五:你可以把它复制到lib文件夹下试试解决方案六:美女额,难得难得,介个包是想放哪??解决方案七:放编译

xmpp-Smack4.1 android 找不到包异常(NoClassDefFoundError)

问题描述 Smack4.1 android 找不到包异常(NoClassDefFoundError) 想使用最新的Smack4.1.0 在我的项目当中,就先搞一个单独的,希望能跑起来.结果就是简单的都弄不起来.导入所有包后,可以编译通过. 但是一使用到它的包,就抛个异常给我.整了半天也没弄明白是包的原因还是哪配置的问题. 在网上找到这个资料:https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guid

Java swing 使用substance后怎么改变颜色?

问题描述 做Javaswing的时候,当使用substance改变外观后所有组件和窗体都可以美化,例如:添加这句代码后所有窗体和组件都将变成浅蓝色UIManager.setLookAndFeel(newSubstanceOfficeBlue2007LookAndFeel());现在我的问题是,包括JTextField.JTextPane.JPanel都变成浅蓝色的了,我希望输入框JTextField和JTextPane的颜色是白色的,但是不论怎么设置都没用,好像Color.white和newCo

高级Synth:有了最新的Swing外观,定制UI不在话下

简介:本文将深入透视 Synth 外观,它是 Java 5.0 中为 Swing 引入的最 新 内容.通过为 Java UI 编程引入"皮肤"的概念,Synth 使开发人员可以为应 用 程序创建和部署定制的外观.软件工程师 Michael Abernethy 将带您从头开始 逐 步构建一个具有 synth 外观的应用程序,让您充分了解 Synth 的概念.阅读本 文之后,您应该可以在短时间内创建具有专业外观的 UI. 就在 Sun 一如既往地试图"再次引入 Java Desk

Java Swing 非常漂亮外观Nimbus的使用方法实例_java

Java Swing界面外观的一种,在Java 6 Update 10中首次亮相.当 Swing 古老的 Metal界面外观 首次发布时,其主要的美感竞争来自 Windows 95 界面.在十年前的图形用户界面条件下,Metal 界面 相对于当时的其他普通界面来说是一种很有吸引力的高雅的选择.Java SE 5 中更新的 Ocean 主题帮助 Metal 成为目前可行的选择,但是修改 Swing 跨平台界面外观也已是当务之急.进入 Nimbus 界面外观,可以看到崭新的基于 合成 的现代外观.N

substance的使用示例(转)

可以使用substance改变界面的皮肤和主题,让Java制作的界面"炫"起来 . 可以下载substance.jar文件 在代码中你可以用:  Java代码   static {           try {               try {                   UIManager.setLookAndFeel(new SubstanceLookAndFeel());               } catch (UnsupportedLookAndFeelE

一个HBase异常的解决方法

HBase异常:hbase-default.xml file seems to be for and old version of HBase的解决方法 近期在使用HBase Java Client连接HBase服务端创建Configuration对象时,遇到了hbase-default.xml file seems to be for and old version of HBase的异常,经过查找资料及阅读HBase相关源码,对这类异常的解决方法做一下总结. 异常出现的原因 HBase客户端

Swing程序最佳架构设计—以业务对象为中心的MVC模式(转)

  前言: 我打算写一系列关于Swing程序开发的文章.这是由于最近我在做一个Swing产品的开发.长期做JavaEE程序,让我有些麻木了.Swing是设计模式的典范,是一件优雅的艺术品,是一件超越时代的产品! 有机会作Swing软件的开发,让我非常有感觉! 呵呵,希望有机会能够用Java3D编写软件,那种感觉一定更棒! Java和Swing都是杰作.我这个人对别人一向很挑剔的,能够得到我由衷地赞誉,可想而知它们有多优秀了.奇怪的是,它们居然一直都无法占领桌面市场.有人说这是技术的原因.我认为这