【问题标题】:Draw lines, circles anything (Java)画线,圈出任何东西(Java)
【发布时间】:2014-06-14 16:18:14
【问题描述】:

所以我是 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;
    }

稍后我使用类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 内的一个面板,这是它要绘制线条的地方。

问题是......我不知道如何画线或我应该如何计算它。

你能帮帮我吗?

【问题讨论】:

标签: java swing draw


【解决方案1】:

简单地说,在您的 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 时执行:

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

【讨论】:

  • 1+ 但请不要忘记提醒 OP 在您的 JPanel 扩展类中的 paintComponent(Graphics g) 覆盖内调用超级的 paintComponent(g) 方法
  • 还有一个建议,即尽可能地为被覆盖的方法保持访问说明符相同。这是protected 而不是public :-)
  • 另外,您需要覆盖面板的getPreferredSize() 方法,否则大小将为 (0, 0) 并且面板可能不会出现,具体取决于所使用的布局管理器。
  • @camickr 你能编辑我的答案,然后添加吗?我不明白你的意思,我以前从未遇到过 getPreferredSize() 的问题。谢谢。
  • @Victor2748,尝试使用 BorderLayout.NORTH 将自定义组件添加到框架中。 NORTH 尊重组件的高度。由于高度为 0,因此没有可绘制的内容。如果您将组件添加到框架的 CENTER,那么是的,绘画将起作用,因为组件会自动调整大小以占用框架的所有可用空间。
【解决方案2】:

虽然另一个答案中给出的建议太好了,但就是无法阻止自己,在相同的地方添加一两个词,例如,为了进行绘画,您需要致电@987654322 @,从附加到JButtonactionPerformed 内部。

正如@camickr 所述,在绘图的扩展类中使用getPreferredSize(),这将提供一个有效的暂存区域,需要在其中完成绘图。这个example 也可能在这个方向上有所帮助。

此外,如果您想保持迄今为止在Board 上绘制的所有线条完好无损,那么您可以简单地将它们存储在List 中并在此List 上迭代以再次绘制它们, 每当要绘制新线时。

一个简单的例子如下:

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.*;

public class LineExample {

    private DrawingBoard board;
    private JButton drawLineButton;

    private Random random;

    private ActionListener buttonAction = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            int width = board.getWidth();
            int height = board.getHeight();
            Line line = new Line(random.nextInt(width),
                                random.nextInt(height),
                                random.nextInt(width),
                                random.nextInt(height));
            board.setValues(line);
        }    
    };

    public LineExample() {
        random = new Random();
    }

    private void displayGUI() {
        JFrame frame = new JFrame("Drawing Lines Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel(new BorderLayout(5, 5));
        board = new DrawingBoard(400, 400);
        contentPane.add(board, BorderLayout.CENTER);

        drawLineButton = new JButton("LINE");
        drawLineButton.addActionListener(buttonAction);
        contentPane.add(drawLineButton, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                new LineExample().displayGUI();
            }    
        };
        EventQueue.invokeLater(runnable);
    }
}

class DrawingBoard extends JPanel {

    private int width;
    private int height;

    private  List<Line> lines;

    public DrawingBoard(int w, int h) {
        width = w;
        height = h;
        lines = new ArrayList<Line>();
    }

    public void setValues(Line line) {
        lines.add(line);
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }    

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Line line : lines) {
            int xs = line.getXStart();
            int ys = line.getYStart();
            int xe = line.getXEnd();
            int ye = line.getYEnd();
            g.drawLine(xs, ys, xe, ye);
        }
    }    
}

class Line {

    private Point startPoint;
    private Point endPoint;

    public Line(int xs, int ys, int xe, int ye) {
        startPoint = new Point(xs, ys);
        endPoint = new Point(xe, ye);
    }

    public int getXStart() {
        return startPoint.getX();
    }

    public int getYStart() {
        return startPoint.getY();
    }

    public int getXEnd() {
        return endPoint.getX();
    }

    public int getYEnd() {
        return endPoint.getY();
    }
}

class Point {

    private int x;
    private int y;

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

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多