5

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

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

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

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

谢谢,

西蒙

4

3 回答 3

4

我认为最干净的方法是定义一个自定义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);
于 2012-06-25T09:29:47.553 回答
2

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

但是,这不是您可以选择的最佳选择。使用字符串数组填充组合框并不是提供灵活性和模型/UI 解耦的最佳选择。这就是 MVC 模型发挥作用的地方。MVC 模型基本上告诉您使用模型(在您的情况下为 a ComboBoxModel)来备份您的数据。拥有一个模型为您提供了从您想要的任何地方(文件、套接字、Web 服务......)获取数据的可能性和灵活性

于 2012-06-25T09:49:33.663 回答
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 {
    //....
}
于 2012-06-25T10:09:25.537 回答