作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Java 新手并试图了解如何在这种情况下正确使用枚举;
用户从组合框下拉列表中选择他的模型,例如
comboBox1.setModel(new DefaultComboBoxModel<>(new String[] {
...
Focus,
Mondeo,
Fiesta,
...
}));
然后我需要找到一种方法来获取用户在我的枚举中选择的字符串的 carId:
public enum Ford{
...
FOCUS("Focus", 26),
MONDEO("Mondeo", 6),
FIESTA("Fiesta", 13),
...
;
private final String name;
private final int carId;
}
我正在考虑使用某种比较器循环,它会尝试将收集到的字符串与 Ford.name 进行匹配,如果匹配,则返回 carId:
public String getCarId() {
String selectedItem = comboBox1.getSelectedItem().toString();
for (Ford c : Ford.values()) {
if (c.name().equals(selectedItem)) {
return c.carId
}
}
return false;
}
但是我不确定如何继续/解决我的问题。
我的逻辑是完全错误还是我在正确的轨道上?
最佳答案
保留对 enum object 的引用由用户选择,而不是对枚举对象显示名称字符串的引用。
// 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框架,例如 combobox由对象的数据模型支持。也许您正在使用 Swing?我不再记得 Swing 如何工作的细节,而是扫了一眼 this documentation ,看起来您可以使用对象支持组合框并使用自定义渲染器。
JComboBox< Ford >
, 不是 JComboBox< String >
制作 JComboBox
拥有 Ford
对象,而不是String
对象。您可以通过调用 values()
获取所有枚举值的数组。 .那个方法很奇怪,没有列在 Enum
的 JavaDoc 中尽管在 Enum.valueOf
中提到方法文档 – 这是一个“隐式”方法,但我认为我们不关心那里的技术细节。
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() ) ;
}
您的自定义渲染器调用枚举 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 号的整数,也不仅仅是其显示名称的字符串。这使您的代码更加 self 记录,提供 type-safety ,并确保有效值。Enum
的一个子集对象,使用 EnumSet
或 EnumMap
类。这些是 Set
的高性能低内存实现。和 Map
接口(interface)。Enum
仅当域(所有可能值的集合)在编译时已知时才适用。添加或消除任何汽车意味着编辑您的 Ford
枚举类并重新编译。
Ford
cars 在运行时,或消除任何,那么你不能使用 Enum
.你会做 Ford
常规类而不是 Enum
的子类,并会像我们做任何POJO一样实例化它们和 collect them .关于java - 如何正确使用具有多个值的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53715052/
我是一名优秀的程序员,十分优秀!