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

}

尝试的事情和问题很少:

  • 我看到您正在为windows设置L&F,所以我假设您正在windows机箱上运行此操作?我问的原因是我不确定JDK在跨平台L&Fs方面支持什么,只是需要考虑一下
  • 您是否尝试过其他L&F,结果相同?(例如灵气)
  • 这可能做什么,也可能不做什么,但您在哪里有
    main(…)
    ?试着把它放在JFrame和构建JFrame的单独类中
  • 更糟糕的是,您可以始终将L&F类名作为参数传递给
    main(…)
    (或props文件),然后在创建任何swing组件之前使用
    UIManager
    进行设置
  • 祝你好运, Dave

    我在Eclipse(最新版本)中使用JDK1.6.0_13在windows上运行了这个程序。在Eclipse的运行配置(VM参数)中,我使用了
    -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);