填充JComboBox的正确方法是什么?

我目前正在Eclipse上用Java构建一个应用程序作为编程基础和基本java编程的自助指南,这纯粹是教育性的,其唯一目的是能够轻松地引用主题并练习我的编程,因为我通过编程来学习它们进入本教程应用程序。

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

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

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

谢谢,

西蒙

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

这样,您可以为combobox定义数据模型,将创建combobox的部分与数据管理本身分开。

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

如果应用程序本身无法更新内容,则ArrayList不是一个好的选择。 如果您对arraylist的内容进行硬编码,则每次需要添加新条目时都将强制修改代码。

一个小例子:

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

一旦编写了您需要的内容,您将不再修改代码。 并且您也可以为几个不同的JComboBox使用相同的模型。

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

填充Combobox的最简单方法是(如Java文档所述):

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

但是,这不是您可以选择的最佳选择。 使用字符串数组填充combobox并不是提供灵活性和模型/ UI分离的最佳选择。 这是MVC模型发挥作用的地方。 MVC模型基本上告诉您使用模型(在您的情况下为ComboBoxModel )来支持您的数据。 拥有一个模型为您提供从任何地方获取数据的可能性和灵活性(文件,套接字,Web服务……)

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

 class View { private JComboBox chatPresenceCombo = new JComboBox(); public bind(ViewModel viewModel) { BeanAdapter beanAdapter = new BeanAdapter(viewModel, true); Bindings.bind(chatPresenceCombo, new SelectionInList(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 { //.... }