立即绘制JFrame

时间:2015-11-15 19:21:26

标签: java swing

我有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          
        //...   
    }
}

2 个答案:

答案 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。如果您希望通过按钮来控制计算,那么我建议您反转控制:让按钮按下会触发一个执行计算步骤的事件。