不同的外观和感觉能够使用不同的初始组件属性吗?

问题描述 投票:0回答:1

当我们创建一个组件时,该组件会获取一些初始值,并且它将根据活动的Look & Feel进行相应的样式设置。例如,JButton将以水平对齐等于0(可能是SwingConstants.CENTER)开始。

我的问题是,这些外观和感觉是否能够“改变 - 覆盖”默认组件的这些初始值(我不是在谈论NimbusButton extends JButton)。同样,我只是指所有组件都具有的这种属性,而不是样式和外观(即使其中一些属性影响组件的外观)。

我用Java的外观,系统的外观和感觉(Windows 10)和Nimbus测试了之前的值(JButton.horizontalAlignment)。价值似乎保持不变。但是其他LAF或其他组件的其他值呢?

可以说,我的问题也可以表达为“外观和感觉能够改变”?

public class LookAndFeels {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            // No look and feel
            System.out.println(new JButton().getHorizontalAlignment());

            // Nimbus
            setNimbusLAF();
            System.out.println(new JButton().getHorizontalAlignment());

            setSystemLAF();
            System.out.println(new JButton().getHorizontalAlignment());
        });
    }

    private static void setSystemLAF() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException
                | UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
    }

    private static void setNimbusLAF() {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
java swing awt look-and-feel
1个回答
1
投票

这个问题不能得到一个完整的答案(相信我,当我说它太复杂,我从头开始实施一个,现在是4个月,我甚至不知道我是否接近称之为!)。

我的问题是,这些外观是否能够“更改 - 覆盖”默认组件的这些初始值

是的和不,他们可以改变这些属性,但是他们有责任尊重他们。加上大多数初始值首先是显示外观和感觉值,here this will give you a hint about what happend at your first println

真正的答案是检查你问的那个ComponentUI实现。

你是一个程序员,所以你发现它们可以改变的内容与它原始包中的任何代码一样(因为代码是代码!!)并不是一件令人震惊的事。

我已经使用Java的外观,我的系统外观(Windows 10)和Nimbus测试了之前的值(JButton.horizo​​ntalAlignment)。价值似乎保持不变。但是其他L&F或其他组件的其他价值呢?

每个ui对象都有一个名为installUI(JComponent c)的方法,这个问题的答案就是围绕这个方法,当你改变ui时调用这个方法,并根据它们的实现,它们会改变一些属性以适应它们的需要(例如,采取任何黑暗的方法)以L&F为例,它们对AbstractButton ui的实现必须将背景设置为深色,将前景设置为亮色,这样文本就会出现,因为它们是暗的。

“外观和感觉能够改变”

很多人认为ui控制着一小部分组件,但实际上它来自ui !!例如AbstractButton有文字,许多人认为ui不负责显示它,但它是另一种方式!,如果ui没有在他们的Graphics.drawString(AbstractButton.getText(),x,y)方法的某个地方调用paint(Graphics g,JComponent c)(或类似的东西)没有文字将是

所以简短回答你的问题'屏幕上的每件事'。

© www.soinside.com 2019 - 2024. All rights reserved.