2012-02-20 38 views
2

我面臨的問題是設置自定義JComboBox的值。如果我從以下課程的initialize()方法中調用setSelectedItem(),它不會選擇特定的值。JComboxBox setSelectedItem

擴展JComboBox類的是:

public class ThemeComboBox extends JComboBox { 

    private static final long serialVersionUID = 50L; 

    public ThemeComboBox(DefaultComboBoxModel model) { 
     super(model); 
     initialize(); 
     LibraryLogger.initMessage(getClass().getSimpleName()); 
    } 

    public void initialize() { 
     ThemeComboBoxModel model = (ThemeComboBoxModel) getModel(); 
     for(ThemeModel themeModel : model.getThemeModels()) { 
      if(themeModel.getThemeClass().equals(ConfigurationManager.getInstance().getUiManager().getUiProperties().getTheme())) { 
       setSelectedItem(themeModel); 
       System.out.println("========="); 
       break; 
      } 
     } 
     addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent actionEvent) { 
       ThemeComboBox themeComboBox = (ThemeComboBox) actionEvent.getSource(); 
       System.out.println(themeComboBox.getSelectedItem()); 
      } 
     }); 
    } 
} 

而如果我重寫自定義DefaultComboBoxModel則是選擇價值getSelectedItem()而是選擇其他值選擇保持相同或者保持不變。 模型類是:

public class ThemeComboBoxModel extends DefaultComboBoxModel { 

    private static final long serialVersionUID = 51L; 

    private Vector<ThemeModel> themeModels; 

    public ThemeComboBoxModel(Vector<ThemeModel> models) { 
     super(models); 
    } 

    public Vector<ThemeModel> getThemeModels() { 
     return themeModels; 
    } 

    public void setThemeModels(Vector<ThemeModel> themeModels) { 
     this.themeModels = themeModels; 
    } 

    /*@Override 
    public Object getSelectedItem() { 
     for(ThemeModel themeModel : themeModels) { 
      if(themeModel.getThemeClass().equals(ConfigurationManager.getInstance().getUiManager().getUiProperties().getTheme())) { 
       return themeModel; 
      } 
     } 
     return null; 
    }*/ 
} 

我無法理解我在做什麼錯。任何信息對我都很有幫助。

在此先感謝。

+1

爲了更好地幫助越早,張貼[SSCCE(http://sscce.org/)。 – 2012-02-20 17:22:57

回答

2

1)希望主要方法是從invokeLater初始化

2)擺動單線程的,其中輸出到GUI在一個時刻完全完成

3)沒有任何保證所有的事件都得到任何順序,基本上是不是Swing GUI的可能的排序活動,同/特別是在GUI啓動

4)顯示GUI(setVisible(true);),那麼最後的代碼行會JComboBox#setSelectedItem(int or Object),包裹在裏面invokeLater

5)加Listeners僅在需要時,刪除無用Listeners

相關問題