Отслеживать объект перечисления, а не его метку
Сохранять ссылку на объект перечисления , выбранный пользователем, а не ссылку на строку отображаемого имени объекта перечисления.
// Display combobox
// User picks an item.
// Your event-handling code reacts by remembering which *object* not *string* was select.
Ford fordSelectedByUser = … ; // You pull reference from the data model backing your widget.
Я не знаю, какой виджет со списком вы используете.Например, в фреймворке Vaadin комбобокс поддерживается моделью данных объектов.Возможно, вы используете Swing?Я больше не вспоминаю детали того, как работает Swing, но, взглянув на эту документацию , похоже, что вы можете создать задний выпадающий список с объектами и использовать пользовательский рендер.
JComboBox< Ford >
, а неJComboBox< String >
Создайте JComboBox
, который содержит Ford
объектов , а не String
объектов.Вы можете получить массив всех ваших значений перечисления, вызвав values()
.Этот метод является странным и не указан в JavaDoc Enum
, хотя упоминается в Enum.valueOf
метод doc - это «неявный» метод, но я недумаю, что мы заботимся о кровавых технических деталях.
Ford[] fords = Ford.values() ; // Get array of all the objects defined by this enum.
JComboBox< Ford > fordsComboBox = new JComboBox( fords );
Отслеживание выбранного Ford
выбранного объекта, а не его отображаемого имени.
public void actionPerformed( ActionEvent e ) {
JComboBox cb = ( JComboBox )e.getSource() ;
Ford selectedFord = ( Ford )cb.getSelectedItem() ; // Is casting still needed, or is Swing Generics-aware? Maybe: Ford selectedFord = ( JComboBox< Ford > )e.getSource().getSelectedItem() ;
updateLabel( selectedFord.getDisplayName() ) ;
}
Ваш пользовательский рендерер вызывает enum Ford
объект getDisplayName
метод, который вы напишите.
package com.basilbourque.example;
public enum Ford {
FOCUS( "Ford" , 26 ),
MONDEO( "Mondeo" , 6 ),
FIESTA( "Fiesta" , 13 );
private final String displayName;
private final int id;
// Constructor
Ford ( String name , int carId ) {
this.displayName = name;
this.id = carId;
}
// Getters
public String getDisplayName ( ) {
return this.displayName;
}
public int getId ( ) {
return this.id;
}
// `Object` methods
@Override
public String toString ( ) {
return "Ford{ " +
"id=" + id +
", displayName='" + displayName + '\'' +
" }";
}
}
Советы:
- Во всей вашей кодовой базе используйте
Ford
объекты, а не просто целое число его ID-номерани просто строка его отображаемого имени.Это делает ваш код более самодокументируемым, обеспечивает безопасность типов и обеспечивает допустимые значения. - Чтобы собрать подмножество
Enum
объектов, используйте EnumSet
или EnumMap
классы.Это высокопроизводительные реализации интерфейсов Set
и Map
с малым объемом памяти. - Помните, что
Enum
подходит, только если домен, набор всех возможных значений, известен при компиляции.время.Добавление или удаление любого из автомобилей означает редактирование класса Ford
enum и повторную компиляцию. - Напротив, если ваше приложение может добавить больше
Ford
машин во время выполнения или исключить их, вы не можете использовать Enum
.Вы бы сделали Ford
обычным классом, а не подклассом Enum
, и создали бы их экземпляры, как мы делаем любые POJO и собираем их .