当我们创建一个组件时,该组件会获取一些初始值,并且它将根据活动的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();
}
}
}
这个问题不能得到一个完整的答案(相信我,当我说它太复杂,我从头开始实施一个,现在是4个月,我甚至不知道我是否接近称之为!)。
我的问题是,这些外观是否能够“更改 - 覆盖”默认组件的这些初始值
是的和不,他们可以改变这些属性,但是他们有责任尊重他们。加上大多数初始值首先是显示外观和感觉值,here this will give you a hint about what happend at your first println
真正的答案是检查你问的那个ComponentUI
实现。
你是一个程序员,所以你发现它们可以改变的内容与它原始包中的任何代码一样(因为代码是代码!!)并不是一件令人震惊的事。
我已经使用Java的外观,我的系统外观(Windows 10)和Nimbus测试了之前的值(JButton.horizontalAlignment)。价值似乎保持不变。但是其他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)
(或类似的东西)没有文字将是
所以简短回答你的问题'屏幕上的每件事'。