【问题标题】:Temporarily change look and feel defaults in Java Swing [duplicate]临时更改 Java Swing 中的外观默认值 [重复]
【发布时间】:2014-09-04 15:23:35
【问题描述】:

我有一系列的 JComponents 遵循外观,然后我希望临时设置一个新外观,以便在将其恢复为原始组件之前添加一些新组件。下面的代码显示了三个 JButton 的示例,其中“按钮 1”和“按钮 3”的外观应该相同,而“按钮 2”则不同。提供的代码确实恢复了整体外观,但是手动设置的lookandfeeldefaults(即字体字体)丢失了。干杯。

编辑:对不起,这个问题有点误导:所有的外观变化都发生在面板显示之前,如示例代码中所示。这个问题不同于建议的重复项,因为这里的问题是重新加载手动设置 (UIManager.getLookAndFeelDefaults().put(...)) 属性,而不是整体外观。这个问题的根本原因是我需要在面板中添加一个具有填充背景颜色的 JButton,并且 setBackground 在使用 windows look and feel 时仅设置 JButton 的边框,而 cross platform look and feel 填充背景。

更新:解决方案是使用UIManager.getLookAndFeelDefaults().putAll(previousLF); 而不是 setLookAndFeel。代码已相应更新。

import java.awt.Color;
import java.awt.Font;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;

public class test {
    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                //Set initial look and feel.
                try{
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                    UIManager.getLookAndFeelDefaults().put("Button.font", new Font("Arial", Font.PLAIN, 20));
                } catch (Exception e){}
                JButton button1 = new JButton("1");

                //change look and feel for button two.
                UIDefaults previousLF = UIManager.getLookAndFeelDefaults();
                try {
                    UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
                    UIManager.getLookAndFeelDefaults().put("Button.background", Color.BLUE);
                } catch (Exception e) {}
                JButton button2 = new JButton("2");

                //Revert look and feel.
                try {
                    UIManager.getLookAndFeelDefaults().putAll(previousLF);
                } catch (Exception e) {}
                JButton button3 = new JButton("3");

                //Add buttons to panel and display for testing purposes.
                JPanel testPanel = new JPanel();
                testPanel.add(button1);
                testPanel.add(button2);
                testPanel.add(button3);
                JOptionPane.showMessageDialog(null, testPanel);
            }
        });
    }
}

【问题讨论】:

    标签: java swing user-interface look-and-feel jcomponent


    【解决方案1】:

    UIManager.setLookAndFeel(lnfName);
    SwingUtilities.updateComponentTreeUI(frame);
    frame.pack();
    
    • 在您的情况下,也应使用 JButton 的局部变量(而不是 JFrame)(通过使用 MetalLookAndFeel、WindowsLookAndFeel 对部分 JComponents 有效)

    • for example

    【讨论】:

    • 您好 mKorbel 感谢您的回复。由于所有组件(无论外观或感觉)都在显示之前添加到框架中,因此更新组件树似乎没有什么区别;相反,我希望有一种类似于UIManager.setLookAndFeelDefaults(...) 的方法,尽管我似乎找不到。
    • @btrs20 JButton 有arrays of Colors,例如List of Colors from JButton 在 javax.swing.plaf.ColorUIResource 中为键 Button.background 定义为 Color
    • 我有点困惑,这和我对罗密欧的反应有关吗?如果是这样,那么您是否建议我编写自己的按钮类以填充背景颜色?
    【解决方案2】:

    我不认为 PLAF 旨在为不同的挥杆组件分配不同的外观和感觉。

    您不使用以下内容的原因是什么?

    button2.setBackground(bg);
    

    【讨论】:

    • 嗨罗密欧,很遗憾我必须更改外观,因为使用窗口外观设置 JButton 的背景颜色只会改变其边框的外观,而不是整个按钮。跨度>
    • 好吧对不起,幸运的是你得到了比我更好的答案;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多