在JFrame中连续绘制

时间:2015-10-23 13:13:42

标签: java swing

据我所知,在JFrame中绘图的工作原理如下:

  • 扩展JPanel并覆盖其paint(Graphics g)方法
  • add(panel)它到你的JFrame

是否可以

  1. 画一条线
  2. 显示该行
  3. 然后添加第二行
  4. 显示新的结果图片
  5. ...

2 个答案:

答案 0 :(得分:2)

是的,您需要使用

repaint()

每次画完新内容后,都会在屏幕上显示修改内容。在重新绘制时,整个屏幕会重新绘制,因此您需要确保再次绘制想要保留的所有内容。

关于保留以前的内容,此question可能会帮助您。

答案 1 :(得分:1)

AuroMetal向我指出this tutorial并且我提​​取了JPanel不知道,它已经绘制了什么,所以你必须保持ArrayList所有要绘制的东西并循环它通过每repaint()

import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Canvas extends JPanel implements LinePrinter {

    private static final long serialVersionUID = 1L;
    private ArrayList<Line> lines = new ArrayList<Line>();

    public Canvas(String title) {
        // Just generating a JFrame to display this JPanel
        JFrame frame = new JFrame(title);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 425);
        frame.setVisible(true);
        frame.add(this);
    }

    @Override
    public void addLine(Line line) {
        lines.add(line);
        this.repaint();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        for (Line line : lines) {
            g.drawLine(line.A.x, line.A.y, line.B.x, line.B.y);
        }
    }

}

我的自定义 Line

public class Line {

    public final Point A, B;

    public Line(Point A, Point B) {
        this.A = A;
        this.B = B;
    }

}

我的自定义 Point类是

public class Point {

    public final int x;
    public final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

}