Java 更改Swing L&;F在命令行中不能正常工作
我用一些小部件制作了一个应用程序,在命令行中我想更改它们的外观:Java 更改Swing L&;F在命令行中不能正常工作,java,swing,Java,Swing,我用一些小部件制作了一个应用程序,在命令行中我想更改它们的外观: java -Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel LookAndFeelAppl 但是在调用该命令之后,只有一个小部件进入类构造函数中更改其L&F,但是我创建的其他小部件进入一个单独的方法中却没有!!!同样,JFrame本身不会改变 公共类lookandfeelapl扩展了JFrame { 私人标签; 私人按钮 public Lo
java -Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel LookAndFeelAppl
但是在调用该命令之后,只有一个小部件进入类构造函数中更改其L&F,但是我创建的其他小部件进入一个单独的方法中却没有!!!同样,JFrame本身不会改变
公共类lookandfeelapl扩展了JFrame
{
私人标签;
私人按钮
public LookAndFeelAppl()
{
super("Look And Feel Demo");
setLayout(null);
final UIManager.LookAndFeelInfo plaf[] = UIManager.getInstalledLookAndFeels();
JLabel lable_laf = new JLabel("Choose L&F:");
final JComboBox cb = new JComboBox();
createOtherGUI();
cb.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
int ix = cb.getSelectedIndex();
try
{
UIManager.setLookAndFeel(plaf[ix].getClassName());
SwingUtilities.updateComponentTreeUI(LookAndFeelAppl.this);
}
catch (Exception ex)
{
}
}
});
// HERE IS THE PROBLEM!!!! THIS LOOP GOES BEFORE
// THE ITEMLISTENER BECAUSE WHEN I ADD ITEMS AN ITEMEVENT
// IS RAISED THAT SET AGAIN THE L&F WITH setLookAndFeel!!!
for (int i = 0, n = plaf.length; i < n; i++)
{
cb.addItem(plaf[i].getName());
}
//--------------------------------------------------------
add(lable_laf);
add(cb);
lable_laf.setBounds(10, 10, 150, 25);
cb.setBounds(10, 35, 150, 25);
}
public void createOtherGUI()
{
button = new JButton("BUTTON!!!!");
add(button);
button.setBounds(300, 45, 150, 35);
}
public static void main(String args[])
{
LookAndFeelAppl window = new LookAndFeelAppl();
window.setSize(1000, 700);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
window.setLocationRelativeTo(null);
}
public LookAndFeelAppl()
{
超级(“外观演示”);
setLayout(空);
final UIManager.LookAndFeelInfo plaf[]=UIManager.getInstalledLookAndFeels();
JLabel标签=新JLabel(“选择L&F:”);
最终JComboBox cb=新JComboBox();
createOtherGUI();
cb.addItemListener(新的ItemListener()
{
公共无效itemStateChanged(ItemEvent e)
{
int ix=cb.getSelectedIndex();
尝试
{
UIManager.setLookAndFeel(plaf[ix].getClassName());
SwingUtilities.updateComponentTreeUI(lookandfeelapl.this);
}
捕获(例外情况除外)
{
}
}
});
//问题就在这里!!!!这个循环在前面
//ITEMLISTENER,因为当我添加项时是ITEMEVENT
//用setLookAndFeel再次设置L&F的位置!!!
for(int i=0,n=plaf.length;i
}尝试的事情和问题很少:
main(…)
?试着把它放在JFrame和构建JFrame的单独类中main(…)
(或props文件),然后在创建任何swing组件之前使用UIManager
进行设置-Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel
公共类测试扩展了JFrame{
public Test(){
}
private void createControls(){
}
publicstaticvoidmain(String[]args){
newtest();
}
}
很抱歉,格式设置很奇怪,但您明白了…所以createOtherGUI()不能正常工作?如果我们有它的源代码,它会有所帮助。不编译。您的类是否扩展了
JFrame
,但您忘了将其添加到代码段中?我在Windows中,其他J&Fs也给出了相同的结果。主要是在同一类。我创建了一个应用程序,它对我来说很好。我正在发布另一个答案,这样我就可以得到格式(不知道如何使用这些评论)谢谢,很快我会尝试,然后我会告诉你结果!实际上,我看到的唯一区别是您的代码没有使用布局管理器(看不出这有什么关系),构造函数中的组合框被标记为“final”(不需要是final,除非您在示例中没有使用它),并且组合框直接添加到JFrame而不是内容窗格。我认为JDK会抛出一个运行时错误,因为组件应该被添加到swing组件的内容窗格中。但是,我想告诉您两件事:第一,不管怎样,对于L&F,如果您不使用布局管理器,第二,当您使用add方法时,它会自动将组件添加到内容窗格。请阅读以下内容:。最后,我要感谢你的回答,所以你的答案+1!谢谢你的信息(和+1)!我没有意识到Sun(现在的Oracle ugg)在内容窗格上“软化”了(显示了我使用Java有多长时间了,我不知道它包含在1.5中!)。再次感谢你提供的信息,我很高兴你知道了!
super("Test L&F");
JComboBox box = new JComboBox(new String[] {"One", "Two", "Three"});
getContentPane().add(box, BorderLayout.SOUTH);
createControls();
setSize(300, 300);
setVisible(true);
JComboBox box = new JComboBox(new String[] {"One", "Two", "Three"});
getContentPane().add(box, BorderLayout.NORTH);