我有class LevenbergForm extends JFrame
和一个函数calculate()
。
一般来说,在该函数中有一个for
循环,在每次迭代时我需要创建一个new JFrame
,显示它并等到按下按钮。
我得到的问题是JFrame
没有绘制它的组件。里面都是白色的。只有当函数calculate()
结束时才会绘制。
如果我仍然在JFrame
循环中,for
如何绘制自己?
如何在按下button
之前停止它? (可选)
void calculate(boolean stepByStep) {
for (int i = 0; i < n; ++i) {
//...
graph = new JFrame();
graph.setContentPane(chartPanel);
graph.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
graph.pack();
graph.setVisible(true);
graph.setLocationRelativeTo(null);
//Draw JFrame and stop for loop until button pressed
//...
}
}
答案 0 :(得分:7)
不要使用在创建和显示时非阻塞的JFrame。而是使用模式对话框,例如JOptionPane,执行阻止当前线程的流程,直到它被处理完毕。
话虽如此,你的程序设计不方便且可能很烦人。为什么不简单地使用Swing Timer来改变显示的JLabel文本的状态?
答案 1 :(得分:0)
您还可以考虑在EDT以外的线程上运行计算。您可以使用类似这样的代码(未经测试)
public static void main(String[] args) {
calculate();
}
public static void calculate() {
for ( int i=0; i<n; i++ ) {
// calculations go here... not on EDT!!
SwingUtilities.invokeLater(()->{
// create and show JFrame
});
}
}
也许更好:
public static void main(String[] args) {
SwingUtilities.invokeLater(()->{
// create and show JFrame
});
calculate();
}
public static void calculate() {
for ( int i=0; i<n; i++ ) {
// calculations go here... not on EDT!!
SwingUtilities.invokeLater(()->{
// update JFrame
});
}
}
此解决方案不会阻止用户输入,但会在计算方法完成之前显示JFrame。如果您希望通过按钮来控制计算,那么我建议您反转控制:让按钮按下会触发一个执行计算步骤的事件。