我知道有一个与Matlab相关的类似问题,但对于Java并没有帮助。我正在为一个程序编写GUI,其中一个GUI框架的结果对另一个GUI框架是必要的-我已将我的问题简化为以下内容:
我有一个带有JTextField的GUI JFrame,当按下按钮时,返回字段内容作为字符串。
在静态main方法中,此字符串用于其他方法-尽管在此演示中仅将其放入打印语句中。
我遇到的问题是,代码在继续执行下一条语句之前没有等待GUI完成(即等待某人按下按钮并触发事件)-因此,在这个演示问题中,它会导致“null”被打印,在我的更大的问题中,它会导致null传递给其他JFrames(并引发异常)。
我在线上学到的是,这是由Swing的“多线程”性质引起的-每次创建Swing组件时,它都在自己的线程中运行,以使其余代码可以继续运行-但在这种情况下,我不希望其余代码继续运行,我想我想要的是(我可能错了),所有其他线程都等待当前的Swing线程完成并给出可以在程序中进一步使用的结果。
我可以使用哪些代码来使代码暂停,直到单击GUI的JButton?
我知道解决此问题的一个方法是在代码的ActionListener部分中“嵌套”依赖代码,但在较大的项目中,这会给我带来大量嵌套的代码,这似乎不是一件好事。
主方法的演示问题代码在此处:
我有一个带有JTextField的GUI JFrame,当按下按钮时,返回字段内容作为字符串。
在静态main方法中,此字符串用于其他方法-尽管在此演示中仅将其放入打印语句中。
我遇到的问题是,代码在继续执行下一条语句之前没有等待GUI完成(即等待某人按下按钮并触发事件)-因此,在这个演示问题中,它会导致“null”被打印,在我的更大的问题中,它会导致null传递给其他JFrames(并引发异常)。
我在线上学到的是,这是由Swing的“多线程”性质引起的-每次创建Swing组件时,它都在自己的线程中运行,以使其余代码可以继续运行-但在这种情况下,我不希望其余代码继续运行,我想我想要的是(我可能错了),所有其他线程都等待当前的Swing线程完成并给出可以在程序中进一步使用的结果。
我可以使用哪些代码来使代码暂停,直到单击GUI的JButton?
我知道解决此问题的一个方法是在代码的ActionListener部分中“嵌套”依赖代码,但在较大的项目中,这会给我带来大量嵌套的代码,这似乎不是一件好事。
主方法的演示问题代码在此处:
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();
}
}
非常抱歉问题这么长,代码块也很大 - 谢谢!