簡體   English   中英

在命令行更改Swing L&F效果不佳

[英]Change Swing L&F at command line not work well

我用一些小部件創建了一個應用程序,在命令行中我想改變它們的外觀和感覺:

java -Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel LookAndFeelAppl

但是在調用該命令之后,只有類構造器中的小部件會更改其L&F,而我創建為其他方法的其他部件則不會! 此外,JFrame本身也沒有改變。

公共類LookAndFeelAppl擴展了JFrame {private JLabel label; 專用JButton按鈕;

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);
}

}

我在Windows上使用JDK 1.6.0_13在Eclipse(最新版本)中運行了它。 在Eclipse的運行配置(VM參數)中,我使用了-Dswing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel

public class Test extends JFrame {

public Test() {

super("Test L&F");

JComboBox box = new JComboBox(new String[] {"One", "Two", "Three"});

getContentPane().add(box, BorderLayout.SOUTH);

createControls();

setSize(300, 300);
setVisible(true);

}

private void createControls() {

JComboBox box = new JComboBox(new String[] {"One", "Two", "Three"});

getContentPane().add(box, BorderLayout.NORTH);

}

public static void main(String[] args) { new Test(); } }

抱歉,格式化很奇怪,但你明白了......

幾件值得嘗試的問題:

  1. 我看到你正在設置Windows的L&F,所以我假設你在Windows機器上運行它? 我問的原因是我不確定JDK在跨平台L&F方面支持什么,只是需要考慮的事情。
  2. 您是否嘗試過具有相同結果的其他L&F? (例如雨雲)
  3. 這可能會或可能不會做什么,但你在哪里有main(...) 嘗試將其放在JFrame和構造JFrame的單獨類中。
  4. 最糟糕的是你可以隨時將L&F類名作為arg傳遞給main(...) (或道具文件),然后使用UIManager在創建任何swing組件之前設置它。

祝你好運,戴夫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM