【发布时间】:2014-05-22 11:29:14
【问题描述】:
我知道有一个关于 Matlab 的类似问题,但它对 Java 没有帮助。我正在为一个程序编写一个 GUI,其中一个 GUI 框架的结果对于另一个 GUI 框架是必需的 - 我已将我的问题简化为以下问题:
我有一个带有 JTextField 的 GUI JFrame ,当按下按钮时,它会以字符串形式返回字段的内容。
在静态 main 方法的下方,此字符串用于其他方法 - 尽管在此演示中它只是放入了一个 print 语句。
我遇到的问题是代码在继续执行下一条语句之前没有等待 GUI 完成(也就是有人按下按钮并触发事件) - 因此在这个演示问题中它导致“null”要打印,在我更大的问题中,它会导致 null 被传递给其他 JFrame(并引发异常)。
我在网上了解到的是,这是由于 Swing 的“多线程”特性——每次我创建一个 Swing 组件时,它都会在自己的线程中运行,以使其余代码能够继续运行——但是在这种情况下,我不希望其余代码继续,我想我想要的(我可能错了)是所有其他线程等待当前 Swing 线程完成并给出可以是的结果在程序中进一步使用。
我可以使用什么代码来暂停代码直到 GUI 的 JButton 被点击?
我知道对此的一种解决方案是将依赖代码“嵌套”在代码的 ActionListener 部分中,但在较大的项目中,这给了我大量的嵌套代码,这似乎不是一件好事。
main方法的demo问题代码在这里:
public class Testing {
public static void main(String[] args) {
Testing runningClass = new Testing();
String message = null;
JGetString getString = new JGetString();
message = runningClass.initiateListener(getString);
System.out.println(message); // How can I make this wait until getString
// has closed?
}
private String initiateListener(JGetString window) {
buttonListener listener = new buttonListener(window);
window.addActionListener(listener);
return listener.returning;
}
public class buttonListener implements ActionListener {
JGetString getString;
String returning;
public buttonListener(JGetString getString) {
this.getString = getString;
}
@Override
public void actionPerformed(ActionEvent e) {
String returning = getString.returnString();
this.returning = returning;
getString.setVisible(false);
}
}
}
我的 GUI 扩展 JFrame 的代码在这里:
public class JGetString extends JFrame {
private JTextField textField;
private JButton btnGet = new JButton("Get");
public JGetString() {
textField = new JTextField();
getContentPane().add(textField, BorderLayout.CENTER);
getContentPane().add(btnGet, BorderLayout.SOUTH);
setVisible(true);
pack();
}
public void addActionListener(ActionListener act) {
btnGet.addActionListener(act);
}
public String returnString() {
return textField.getText();
}
}
对于这么长的问题和大量的代码,我们深表歉意 - 非常感谢!
【问题讨论】:
-
你可能使用内置方法输入JOptionPane.showInputDialog
标签: java eclipse multithreading swing user-interface