2012-06-25 40 views
4

我目前在Eclipse上构建了一个Java应用程序,作为编程基础和基本Java编程的自助指南,这纯粹是教育性的,只是为了能够轻松地引用主题并实践我的编程,将它们编程到本教程应用程序中填充JComboBox的正确方法是什么?

应用程序的内容将随着时间的推移而扩大,并且随着我学习更多编程组件。

所以我的第一个问题归结为正确的形式。

我正在使用下拉框(JComboBox),以便从GUI中选择特定主题。我想填写清单并保持程序干净整洁。所以我的问题是如何填充JComboBox以限制混乱的代码。也许是一个文本文件,我可以从中分别添加主题并更有效地进行编辑?我遵循正确的编程程序,而不是我可以做到的所有方式。我知道我可以使用ArrayList,但我很想理解使用大量内容时所采取的选择,而不是非常少。

感谢,

西蒙

回答

3

我认为最干净的方法是定义一个定制ComboBoxModel

通过这种方式,您可以为组合框定义数据模型,从数据管理本身中分离创建组合框的部分。

可能使用文本文件是一件好事,因为插入新条目时不必修改代码。您可以在ComboBoxModel构造函数中定义读取文件过程。这种方式每次运行程序时都会发现更新的组合框的内容。

如果内容不能被应用程序本身更新,ArrayList不是一个好的选择。如果对硬编码列表的内容进行硬编码,则每次需要添加新条目时都会被迫修改代码。

一个小例子:

class YourModel implements ComboBoxModel{ 

//implements all interface methods required... 
@override 
public YourModel(String filename) 
{ 
    comboBoxItemList = new ArrayList<String>(); 
    // open your file 
    // add every entry to the the list 
} 
@override 
public Object getElementAt(int index) 
{ 
    return comboBoxItemList.get(index); 
} 
List<String> comboBoxItemList; 
} 

一旦写入你需要什么,你就不会再对修改代码。你也可以为几个不同的JComboBox使用相同的模型。

YourModel model = new YourModel("path_to_a_file"); 
JComboBox box1 = new JComboBox(); 
box1.setModel(model); 
JComboBox box2 = new JComboBox(); 
box2.setModel(model); 
+0

谢谢你的确很有帮助。 –

+0

考虑使用已实现有用方法的'DefaultComboBoxModel'。 – naXa

1

填充ComboBox的最简单的方法是(作为Java documentation状态)是:

String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; 
//Create the combo box, select item at index 4. 
//Indices start at 0, so 4 specifies the pig. 
JComboBox petList = new JComboBox(petStrings); 

然而这是不是你可以去最好的选择。用字符串数组填充组合框不是提供灵活性和模型/ UI解耦的最佳选择。这就是MVC模型的作用。 MVC模型基本上告诉你使用一个模型(在你的情况下,一个ComboBoxModel)来支持你的数据。拥有一个模型为您提供了从任意位置获取数据的可能性和灵活性(文件,套接字,Web服务...)

0

使用自定义ComboBoxModel的替代方法是使用JGoodies Binding将视图绑定到一个视图模型。这样做你的视图模型不包含任何视图特定的代码,但使用标准的Java bean机制(例如,属性更改支持)按需更新视图,并通过bean属性自动接收所有视图更新。在显示的数据实际来自(在这个例子中它直接来自java枚举)的地方与视图实现无关。这里是一个例子:

class View { 
    private JComboBox chatPresenceCombo = new JComboBox(); 

    public bind(ViewModel viewModel) { 
     BeanAdapter<ViewModel> beanAdapter = new BeanAdapter<ViewModel>(viewModel, true); 
     Bindings.bind(chatPresenceCombo, new SelectionInList<ChatPresence>(viewModel.getChatPresenceValues(), 
       beanAdapter.getValueModel(ViewModel.PROPERTY_CHAT_PRESENCE))); 
    } 
} 

class ViewModel 
{ 
    private ChatPresence chatPresence; 

    private final PropertyChangeSupport changeSupport = new PropertyChangeSupport(this); 

    public static final String PROPERTY_CHAT_PRESENCE = "chatPresence"; 

    public ChatPresence getChatPresence() { 
     return chatPresence; 
    } 

    public void setChatPresence(ChatPresence chatPresence) { 
     ChatPresence old = this.chatPresence; 
     this.chatPresence = chatPresence; 
     changeSupport.firePropertyChange(PROPERTY_CHAT_PRESENCE, old, chatPresence); 
    } 

    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     changeSupport.addPropertyChangeListener(listener); 
    } 

    public void removePropertyChangeListener(PropertyChangeListener listener) { 
     changeSupport.removePropertyChangeListener(listener); 
    } 

    public ChatPresence[] getChatPresenceValues() { 
     return ChatPresence.values(); 
    } 
} 

public enum ChatPresence { 
    //.... 
} 
相关问题