如何“刷新”JFrame

时间:2017-05-10 14:27:17

标签: java swing jframe jbutton

我目前的计划存在此问题;我根本无法弄清楚如何“刷新”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);
        }


    }
}

2 个答案:

答案 0 :(得分:1)

  1. 整个代码的结构是错误的。无论何时使用静态变量和方法,您都知道存在设计问题。

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

  3. 无论何时更改类绘制中使用的属性值,您都需要调用repaint()

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

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

答案 1 :(得分:-2)

您需要在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的主要目的是回答用户的具体问题,我的答案旨在解决这个问题。