gpt4 book ai didi

java - 如何从另一个 ActionListener 访问一个 ActionListener 中的 Array List 元素?

转载 作者:行者123 更新时间:2023-11-30 11:20:51 28 4
gpt4 key购买 nike

我在一个主类中有两个 Action Listener 内部类。每一个都对应于它自己的按钮。其中一个 Action 监听器被编码为生成数组列表。另一个只是将该数组列表写入文本字段。

我的问题是如何从其他 Action Listener 引用/访问该数据?下面的代码可以编译,但是当我从第二个 Action Listener 检查 Array List 的内容时,它是空的 ([])。

我猜这与调用另一个 Action Listener 的 actionPerformed 方法时 Array List 重新实例化有关。我该如何解决这个问题? (这里的代码只是 2 个 Action 监听器)。


// Create a Button Listener Inner Class for Input Route Button.
class InputRouteButtonHandler implements ActionListener {

List<String> routeStopList = new ArrayList<String>();

public void actionPerformed(ActionEvent event) {

String city1 = (String) cityCombo1.getSelectedItem();
String city2 = (String) cityCombo2.getSelectedItem();

if (city1.equals(city2)) {
JOptionPane.showMessageDialog(null, "Invalid route chosen. Please choose two different cities.");
} else {
routeStopList.add(city1); //Add city1 to start of array.
int dialogResult;

do {
String routeStop = JOptionPane.showInputDialog("Enter a stop between the 2 cities:");
routeStopList.add(routeStop);
dialogResult = JOptionPane.showConfirmDialog(null, "Add another stop?");
} while (dialogResult.equals(JOptionPane.YES_OPTION));

routeStopList.add(city2); //Add city2 to end of array.
System.out.println(routeStopList); //Just checking ArrayList contents
}
}
}

// Create a Button Listener Inner Class for Route Button.
class RouteButtonHandler extends InputRouteButtonHandler implements ActionListener {

public void actionPerformed(ActionEvent event) {

String city1 = (String) cityCombo1.getSelectedItem();
String city2 = (String) cityCombo2.getSelectedItem();

System.out.println(routeStopList); //Just checking ArrayList contents

if (city1.equals(city2)) {
JOptionPane.showMessageDialog(null, "Invalid route chosen. Please choose two different cities.");
} else {
for (int i = 0; i < routeStopList.size(); i++) {
String addedRoute = routeStopList.get(i);
adminPanelTextArea.append(addedRoute + "\n");
}
}
}
}

最佳答案

你是对的,你的问题是由于你创建了两个 ArrayLists,除了持有相同类型的对象和具有相同的名称之外,它们之间绝对没有任何关系。一种解决方案是创建一个由两个 ActionListener 类共享的模型类,并在该模型类中包含您的 ArrayList。然后为您的 ArrayList 类提供一个 setModel(Model model) 方法或构造函数,并将对单个 Model 对象的引用传递给两个 ActionListeners。


另一个考虑是使用单个 Control 类来处理您的监听器类型代码,然后让您的 Control 类包含一个 Model 字段。


顺便说一句,这是一段危险的代码:

if (city1 == city2) {

不要使用 == 比较字符串。请改用 equals(...)equalsIgnoreCase(...) 方法。了解 == 检查两个 objects 是否相同,这不是您感兴趣的。另一方面,方法检查两个字符串是否相同字符以相同的顺序排列,这就是这里的重点。


例如,假设您有两个想要操作 JList 的按钮,一个想要添加文本,另一个想要清除它,那么您可以将 JList 的模型传递给两个按钮处理程序。示例程序可能如下所示:

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class ShareList extends JPanel {
private static final String PROTOTYPE_CELL_VALUE = "ABCDEFGHIJKLMNOP";
private static final int VISIBLE_ROW_COUNT = 10;
private JTextField textField = new JTextField(10);
private DefaultListModel<String> listModel = new DefaultListModel<>();
private JList<String> myList = new JList<>(listModel);

public ShareList() {
myList.setPrototypeCellValue(PROTOTYPE_CELL_VALUE);
myList.setVisibleRowCount(VISIBLE_ROW_COUNT);
myList.setFocusable(false);

JPanel buttonPanel = new JPanel();
AddHandler addHandler = new AddHandler(listModel, this);
textField.addActionListener(addHandler);
buttonPanel.add(new JButton(addHandler));
buttonPanel.add(new JButton(new ClearHandler(listModel)));

JPanel rightPanel = new JPanel(new BorderLayout());
rightPanel.add(textField, BorderLayout.NORTH);
rightPanel.add(buttonPanel, BorderLayout.CENTER);

setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
add(new JScrollPane(myList));
add(rightPanel);
}

public String getText() {
textField.selectAll();
return textField.getText();
}

private static void createAndShowGui() {
JFrame frame = new JFrame("ShareList");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new ShareList());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}

}

@SuppressWarnings("serial")
class AddHandler extends AbstractAction {
private DefaultListModel<String> listModel;
private ShareList shareList;

public AddHandler(DefaultListModel<String> listModel, ShareList shareList) {
super("Add");
putValue(MNEMONIC_KEY, KeyEvent.VK_A);
this.listModel = listModel;
this.shareList = shareList;
}

public void actionPerformed(ActionEvent e) {
String text = shareList.getText();
listModel.addElement(text);
};
}

@SuppressWarnings("serial")
class ClearHandler extends AbstractAction {
private DefaultListModel<String> listModel;

public ClearHandler(DefaultListModel<String> listModel) {
super("Clear");
putValue(MNEMONIC_KEY, KeyEvent.VK_C);
this.listModel = listModel;
}

public void actionPerformed(ActionEvent e) {
listModel.clear();
};
}

关于java - 如何从另一个 ActionListener 访问一个 ActionListener 中的 Array List 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22547753/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com