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

Swing应用程序如果是在开源的Look&&Feel 之间切换,感觉很容易,但是如果把应用程序在开源外观下切换到系统默认的或者JDK自带的外观时,问题就来了。不是没有标题栏,就是标题栏的外观没有改变,用的是系统的窗口装饰。这些是因为在应用程序启动时在main方法里添加了这样一句代码造成的:

JFrame.setDefaultLookAndFeelDecorated(true);

目前解决这个问题的办法就是先将 原来的JFrame dispose掉 ,然后在new一个 JFrame ,让原来的frame 指向这个新的JFrame。不多说,看代码比较直观, 核心代码如下:

初始化应用,initComponents()方法是NetBeans IDE生成的,就不贴了。

    private static JFrame config;
    private Rectangle savedBounds;

    /** Creates new form Config */
    public SkinChangeDemo() {
        initComponents();
    }

    public SkinChangeDemo(boolean decor) {
        setUndecorated(decor);
        initComponents();
    }

下面就是核心代码:

 private void saharaButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
        LookAndFeel old = UIManager.getLookAndFeel();
        SubstanceSkin skin = new SaharaSkin();
        if (old instanceof SubstanceLookAndFeel) {
            SubstanceLookAndFeel.setSkin(skin);
        } else {   //如果不是Substance的外观则切换为Substance外观
                changSkin(skin);
        }
    }                                           

    private void nimbusButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            
        try {
            UIManager.setLookAndFeel(new NimbusLookAndFeel());
            savedBounds = getBounds();
            dispose();
            config = null;
            config = new SkinChangeDemo(false);
            config.setBounds(savedBounds);
            config.setVisible(true);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(SkinChangeDemo.class.getName()).log(Level.SEVERE, null, ex);
        }
        SwingUtilities.updateComponentTreeUI(this);

    }                                           

    private void businessButtonActionPerformed(java.awt.event.ActionEvent evt) {                                              
        LookAndFeel old = UIManager.getLookAndFeel();
        SubstanceSkin skin = new BusinessSkin();
        if (old instanceof SubstanceLookAndFeel) {
            SubstanceLookAndFeel.setSkin(skin);
        } else {    //如果不是Substance的外观则切换为Substance外观
            changSkin(skin);
        }
    }                                             

    /**
     *用于将非Substance 外观的界面该为Substance外观。
     * @param skin
     */
    private void changSkin(SubstanceSkin skin) {
        savedBounds = getBounds();
        dispose();
        config = new SkinChangeDemo(true);
        config.getRootPane().setWindowDecorationStyle(JRootPane.FRAME);  //这句是关键代码,自己看API体会吧
        config.setBounds(savedBounds);  //保持变换皮肤时位置不变
        SubstanceLookAndFeel.setSkin(skin);
        config.setVisible(true);
        config.getRootPane().updateUI();
        SwingUtilities.updateComponentTreeUI(this);

    }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索private
, 代码
, 切换
, config
skin
swing substance、java swing substance、swing substance 下载、swing substance 文档、java swing 外观美化,以便于您获取更多的相关知识。

时间: 2024-12-21 21:07:09

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

Swing使用Substance外观包异常问题

问题一:今天更新我的Java版QQ,在网上找到了Substance外观包,效果不错,直接用了,可是设置水印问题时就出现问题,网上有现成的例子 JFrame.setDefaultLookAndFeelDecorated(true);   JDialog.setDefaultLookAndFeelDecorated(true);   try  {               SubstanceImageWatermark watermark  =   new  SubstanceImageWater

java swing中设置界面的外观风格

在java中  界面外观的管理是由UIManager这个类来管理的 . 不同的系统上安装的外观不一样 ,默认的是java的跨平台外观  ,下面示例 描述如何 获取系统所有安装的外观 以及 设置界面外观 . 1.  获取系统所有外观 .  每个外观都对应一个类名字 我们可以通过类名来设置外观 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MyWindow1  extends  JFram

nutch 代理 本地ip与代理ip之间转换

问题描述 nutch 代理 本地ip与代理ip之间转换 我用的是Nutch1.9版本的,在爬去网站过程中好像因为同一ip访问频繁然后ip被封了,正在尝试用代理,但是如果代理ip被封了的话,nutch会使用本机的ip继续进行爬去吗?然后等本机ip被封的时候又转代理ip进行爬去?这样循环转换..... 解决方案 http://fuliang.iteye.com/blog/148999

Windows 8 如何在本地账户和微软账号之间切换

  故障现象: Windows 8 如何在本地账户和微软账号之间切换 解决方案: 首先,将鼠标移动到桌面的右上角或者右下角,在超级菜单中选择"设置",如下图所示: Windows 8本地账户和微软账号切换 在弹出的菜单中选择"更改电脑设置",如下图 : 在打开的"电脑设置"中,在左面的大类中选择"用户",后选择"切换到Microsoft账户";可参考下图顺序A-B 在新打开的界面中输入您的Microsoft

如何在图形界面和控制台(字符界面)之间来回切换?

如何在图形界面和控制台(字符界面)之间来回切换? 1 图形界面到控制台:Ctr+Alt+Fn(n=1,2,3,4,5,6): 2 各控制台之间切换:Alt+Fn(n=1,2,3,4,5,6): 3 控制台到图形:Alt+F7

采用C#泛型实现数据库之间的切换

最近做的一个项目,我最开始选用的是 MySql 5.0 数据库,项目提交之后,对方要求换成 MS SQLServer 2000,还好数据层操作基本采用的是标准的SQL语句,也未使用存储过程,于是将原有的数据接入层代码改写成泛型类,只改了不到一百行代码,具体的SQL操作语句一句未动,便实现了数据库之间的切换.下面简述: 数据库不是很复杂,因此我采用了两个类: (1) DataProvider 泛型类 public class DataProvider<ConnType, CmdType> whe

用Swift完成不同View Controller之间的切换

之前用objective-c开发时,页面之间的切换很容易.其实用swift没有很大的变化,如果你是用storyboard完成的界面,基本上是同样的方式,只不过在代码部分写成swift风格的就行了. 今天在实验开发一个简单的小程序时,却遇到了一些bug,后来还是求助stackoverflow上的大神解决了问题,在此做下记录. 我的程序结构是这样的,在一个页面A中有个按钮,然后点击按钮以后,切换到另一个页面B.A和B都在同一个storyboard中. 这里先说下通用的方法: 手动用代码建好的view

【ANDROID游戏开发之五】游戏注册界面DEMO-实现两个ACTIVITY之间的切换与数据交互!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/301.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

视频通话两个surfaceview之间互相切换

问题描述 视频通话两个surfaceview之间互相切换 50C 最近在在公司做视频通话的时候.界面有两个surfaceView,对方的全屏显示,在RelativeLayout中,我的视频在RelativeLayout右下角.提出一个功能,点击小的surfaceView,内容会切换.目前自己尝试:1.直接切换内容,只切换了Callback,没成功2.在布局中,用代码写出来,点击小的,会让属性.位置发生变化,但出现一个问题,层级关系,下面的怎么都挪不上来. 大神能不能给个demo,我给你冲10个q