选中JComboBox船舶后如何从ArrayList加载指定字段到对应JTextField
实现步骤
1. 先创建船舶实体类
你需要先定义一个Ship实体类来存储单条船舶的所有属性,方便后续从ArrayList存取数据:
public class Ship { // 对应CSV列:名称、国籍、建造年份、型宽、吃水、长度 private String name; private String flag; private int year; private int beam; private int draft; private int length; // 构造方法、getter、setter public Ship(String name, String flag, int year, int beam, int draft, int length) { this.name = name; this.flag = flag; this.year = year; this.beam = beam; this.draft = draft; this.length = length; } public String getName() { return name; } public String getFlag() { return flag; } public int getYear() { return year; } public int getBeam() { return beam; } public int getDraft() { return draft; } public int getLength() { return length; } }
你之前加载CSV到ArrayList的时候,直接把每行数据转成Ship对象存入List<Ship> shipList即可,这个列表要作为ShipGUI的成员变量,方便监听器访问。
2. 修改itemStateChanged逻辑
注意ItemListener的itemStateChanged会在选中、取消选中时各触发一次,所以要先判断是选中状态再执行逻辑,完整代码如下:
SelectShipBox = new JComboBox(); SelectShipBox.addItemListener(new ItemListener(){ public void itemStateChanged(ItemEvent ie) { // 只处理选中事件,避免重复执行 if (ie.getStateChange() == ItemEvent.SELECTED) { String selectedShipName = (String)ie.getItem(); // 遍历全量船舶列表 for (Ship ship : shipList) { // 匹配船舶名称 if (ship.getName().equals(selectedShipName)) { // 匹配到后填充对应文本框 nameText.setText(ship.getName()); flagText.setText(ship.getFlag()); yearText.setText(String.valueOf(ship.getYear())); beamText.setText(String.valueOf(ship.getBeam())); draftText.setText(String.valueOf(ship.getDraft())); lengthText.setText(String.valueOf(ship.getLength())); // 匹配到直接终止遍历 break; } } } }});
补充说明
- 数值类型的属性(年份、型宽等)转成字符串再给
JTextField赋值即可 - 如果你加载CSV的时候还没转成
Ship对象列表,也可以临时存成List<String[]>,遍历的时候取数组下标0匹配名称,下标1到5对应各属性赋值即可,不过用实体类更规范易维护
内容的提问来源于stack exchange,提问作者joker5309
相关产品推荐
相关产品推荐

