画线,圈任何东西(Java)

时间:2014-06-14 16:18:15

标签: java swing draw

所以我是stackoverflow的新手。

我即将创建一条线,一条三角形,但我只是专注于线条和良好的面向对象编程。

所以我创建了Point2D类:

    package draw;

/**
 *
 * @author Pedro
 */
public class Point2D {
    private int x,y;

    // Construtores
    public Point2D(){
        this(0,0);
    }

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

    // Set's e Get's
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }

稍后我使用class point2D创建类行以获得起点和终点

    package draw;

/**
 *
 * @author Pedro
 */
public class Linha extends Figura{
    private Point2D pinicial;
    private Point2D pfinal;

    //construtores    
    public Linha(int xinicial, int yinicial, int xfinal, int yfinal){
        pinicial=new Point2D(xinicial, yinicial);
        pfinal=new Point2D(xfinal, yfinal);
    }
    public Linha(Point2D pinicial, Point2D pfinal){
        this.pinicial=pinicial;
        this.pfinal=pfinal;
    }
    //Get's e Set's
    public Point2D getPinicial() {
        return pinicial;
    }
    public void setPinicial(Point2D pinicial) {
        this.pinicial = pinicial;
    }
    public Point2D getPfinal() {
        return pfinal;
    }
    public void setPfinal(Point2D pfinal) {
        this.pfinal = pfinal;
    }

}

然后我用一个名为“line”的按钮创建了一个Jframe,并在jFrame中放置了一个面板,该面板将用于绘制线条。

问题是......我不知道如何绘制线条或者我应该如何计算它。

你能帮助我吗?

2 个答案:

答案 0 :(得分:4)

简单地说,在您的JPanel类ovverride paintComponent()方法中:

JPanel panel = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g)
        g.drawLine(x1, y1, x2, y2);
    }
}

x1y1x2y2是您线路的线索。 如果您只想在按下按钮后绘制线条,请在主类中创建一个全局boolean变量,按下该按钮时,将其设置为true,然后在创建JPanel时执行:< / p>

JPanel panel = new JPanel() {
        @Override
        protected void paintComponent(Graphics g) {
            if (myBoolean) {
                super.paintComponent(g)
                g.drawLine(x1, y1, x2, y2);
            }
        }
    }

答案 1 :(得分:1)

虽然在另一个答案中给出的建议太好了,但是却无法阻止自己,只要添加一两个字,就像为了进行绘画一样,你需要调用{{ 1}},来自附加到repaint()的{​​{1}}内部。

正如@camickr所说,在扩展类中使用actionPerformed进行绘制,这将提供一个有效的临时区域,需要完成绘图。这个example也可能在这个方向上有所帮助。

此外,如果你想保留迄今为止在JButton上绘制的所有行,那么你只需将它们存储在getPreferredSize()中并迭代Board每当要绘制新线时,再次绘制它们。

一个简单的例子如下:

List