gpt4 book ai didi

JAVA 有调用方法等待 JFrame 中的 Activity 完成

转载 作者:行者123 更新时间:2023-11-29 05:01:53 26 4
gpt4 key购买 nike

目前我正在调用一个方法 (showFrames),它会弹出一个包含许多可编辑文本字段的 JFrame。我将这些文本字段的值存储在我需要在调用方法中使用的列表 (editedFields) 中。我的问题是我的调用方法没有等待用户在继续之前选择确定/取消,因此当我尝试对其执行操作时不会填充列表。我试图通过使用模态对话框来解决这个问题,但没有成功。方法在这里被调用...

...
showFrames(longToShortNameMap);
if (editedFields != null) {
for (JTextField field : editedFields) {
System.out.println(field.getText());
}
}
...

showFrames 方法实现为:

private static void showFrames(Map<String, String> longToShortNameMap) {
final ToolDialog frame = new ToolDialog("Data Changed");
frame.setVisible(true);
frame.setModal(true);
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(400, 500);
frame.setResizable(true);
frame.setLocationRelativeTo(null);

JPanel panel = new JPanel(new GridLayout(0, 2));
JPanel buttonPanel = new JPanel(new GridLayout(2, 0));
List<String> keys = new ArrayList(longToShortNameMap.keySet());
final List<JTextField> textFields = new ArrayList<>();
for (String key : keys) {
JLabel label = new JLabel(key);
JTextField textField = new JTextField(longToShortNameMap.get(key));
panel.add(label);
panel.add(textField);
textFields.add(textField);
}
JButton okButton = new JButton("OK"); //added for ok button
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
editedFields = textFields;
frame.setVisible(false);
frame.dispose();

}
});
JButton cancelButton = new JButton("Cancel");//added for cancel button
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.setVisible(false);
frame.dispose();

}
});
okButton.setVisible(true);//added for ok button
cancelButton.setVisible(true);//added for cancel button
buttonPanel.add(okButton);//added for ok button
buttonPanel.add(cancelButton);//added for cancel button
JScrollPane scrollPane = new JScrollPane(panel);

scrollPane.setVisible(true);
scrollPane.setSize(500, 500);
frame.add(scrollPane, BorderLayout.CENTER);
frame.add(buttonPanel, BorderLayout.SOUTH);
}

我观察到的当前行为是,当弹出 JFrame 时,所有字段将立即打印出来,而不是等待用户单击“确定”。实际上,这意味着我在文本字段中收到默认值,而不是编辑后的值。

注意:ToolDialog 扩展了 JDialog

最佳答案

您遇到的基本问题是您首先实例化对话框,使其可见,然后向其添加字段。

这基本上是不正确的。在实例化框架/对话框时,最好在构造函数调用中将所有对象添加到其中。然后,当一切准备就绪时,您可以让它可见。

当然,您可以在已经显示后向框架添加新字段,但这通常是基于某些事件完成的,例如,当用户单击“添加新号码”时,然后您添加新的文本字段,等等。

因此,您的修复很简单,将添加按钮、列表、面板等的逻辑移至构造函数,然后使该窗口可见。

关于JAVA 有调用方法等待 JFrame 中的 Activity 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31859453/

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