2012-06-25 4 views
4

Я в настоящее время создаю приложение в Java на Eclipse в качестве справочника самопомощи по основам программирования и базовому программированию на Java, это чисто образовательный и с единственной целью - легко справляться с темами и практиковать мои программы, когда я их изучаю программируя их в это учебное приложение.Правильный способ заполнения JComboBox?

Содержание приложения будет расширяться с течением времени и, как я узнаю больше компонентов программирования.

Итак, мой первый вопрос сводится к правильной форме.

Я использую раскрывающийся список (JComboBox), чтобы выбрать определенные темы из графического интерфейса. Я хотел бы заполнить список и сохранить программу чистой и аккуратной. Поэтому мой вопрос заключается в том, как бы заполнить JComboBox, чтобы ограничить загромождение кода. Возможно, текстовый файл, из которого я мог бы добавлять темы отдельно и редактировать более эффективно? Я после правильной процедуры программирования, в отличие от всех способов, которыми я мог бы это сделать. Я знаю, что могу использовать ArrayList, однако я заинтересован в том, чтобы понять выбор, сделанный при использовании большого количества контента, а не очень мало.

Спасибо,

Simon

ответ

3

Я думаю, что самый чистый способ определить пользовательские ComboBoxModel.

Таким образом, вы можете определить модель данных для вашего поля со списком, отделяя часть, в которой создается combobox из самого управления данными.

Возможно, использование текстового файла - это хорошо, поскольку вам не нужно изменять код при вставке новой записи. Вы можете определить процедуру чтения файла внутри конструктора ComboBoxModel. Таким образом, каждый раз, когда вы запускаете программу, вы найдете обновленное содержимое combobox.

ArrayList не является хорошим выбором, если содержимое не может быть обновлено самим приложением. Если вы жестко кодируете содержимое 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

Самый простой способ заполнения выпадающий (как 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); 

Это, однако, не самый лучший вариант, вы могли бы пойти. Заполнение вашего combobox массивом строк - это не самый лучший вариант, который обеспечивает гибкость и развязку модели/интерфейса. Именно здесь вступает в игру модель MVC. Модель MVC в основном говорит вам использовать модель (в вашем случае ComboBoxModel), чтобы вернуть данные. Наличие модели дает вам возможность и гибкость получения ваших данных из любого места, где вы хотите (файлы, сокеты, веб-сервис ...)

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 { 
    //.... 
}