有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java立即绘制JFrame

我有class LevenbergForm extends JFrame和一个函数calculate()

一般来说,该函数中有一个for循环,在每次迭代中,我都需要创建一个new JFrame,显示它并等待按钮被按下

我遇到的问题是JFrame没有绘制它的组件。里面全是白色的。并且仅在函数calculate()结束时绘制

当我还在for循环中时,如何让JFrame自己绘制

在按下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) 个答案

  1. # 1 楼答案

    不要使用JFrame,它在创建和显示时是非阻塞的。相反,使用一个模式对话框,比如JOptionPane,它会阻止当前线程的流,直到它被处理完毕

    话虽如此,您的程序设计既不方便又可能令人讨厌。为什么不干脆使用Swing计时器来更改显示的JLabel文本的状态呢

  2. # 2 楼答案

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