如何 "refresh" JFrame

How to "refresh" a JFrame

我当前的程序有这个问题;我根本不知道如何 "refresh" JFrame 以便它正确显示对变量 vangle 的更改。我当然导入了所有正确的文件。使用 JPanel 而不是 JFrame 有什么优势吗?请全力以赴! :)

public class projekt {
    static int vangle = 20;
        public static void main(String args[]) {new FractalTree().setVisible(true);

        JFrame frame = new JFrame();
        JButton b1 = new JButton();
        frame.setSize(200, 100);
        b1.setSize(20, 20);
        b1.setVisible(true);
        b1.setText("vinklen + 10");
        frame.add(b1);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //stoppe når jframen bliver lukket lukker begge jframes
            b1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

                    vangle = vangle + 10;
                    System.out.println("angle:" + vangle);


                }
            });
    }



    public static class FractalTree extends JFrame {
        public FractalTree() {
            super("Fractal Tree");
            setBounds(100, 100, 800, 600);
            setResizable(true);
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); /* stopper når den lukker, lukker begge Jframes */
        }

        public static void drawTree(Graphics g, int x1, int y1, double angle, int depth) {
            if (depth == 0) return;
            int x2 = x1 + (int) (Math.cos(Math.toRadians(angle)) * depth * 10.0); /* skifter størelsen på den */
            int y2 = y1 + (int) (Math.sin(Math.toRadians(angle)) * depth * 10.0);
            g.drawLine(x1, y1, x2, y2);
            drawTree(g, x2, y2, angle - vangle, depth - 1); /* skifter vinklen */
            drawTree(g, x2, y2, angle + vangle, depth - 1);


        }

        @Override
        public void paint(Graphics g) {
            g.setColor(Color.blue); /* skifter farven */
            drawTree(g, 400, 500, -90, 9);
        }


    }
}

您需要在 FractalTree 上调用 repaint();。为此,您需要对其进行引用,例如

    final FractalTree tree = new FractalTree();
    tree.setVisible(true);

然后你的方法变成:-

        public void actionPerformed(ActionEvent e) {
            vangle = vangle + 10;
            System.out.println("angle:" + vangle);
            tree.repaint();
        }

最后一点,您需要先清除之前绘制的树,否则您的新树将绘制在旧树的顶部。

编辑:OP 的代码显然有很多问题,可以完全重写;但是我的理解(根据 https://meta.stackexchange.com/questions/266572/answer-question-or-improve-code )是 SO 的主要目的是回答用户的特定问题,我的回答旨在做到这一点。

  1. 你整个代码的结构是错误的。只要您使用静态变量和方法,您就知道您遇到了设计问题。

  2. 您不应覆盖 JFrame 上的 paint()。相反,您应该覆盖 JPanel 上的 paintComponent() 并将面板添加到框架中。

  3. 任何时候你改变一个属性的值用于class你需要调用repaint().

我建议您重新开始并阅读 Custom Painting 上的 Swing 教程部分以获取更多信息和工作示例。

从工作示例开始,根据您的要求修改代码。该示例将向您展示如何在实际执行绘画的 class 中定义控制绘画属性的变量。