java - 单击 JPanel 绘制形状

标签 java swing graphics drawing jpanel

我有一个包含 3 个 JPanel 的 JFrame;选项、菜单、 Canvas 。在选项中有许多代表形状的 JButton。目的是单击形状的 JButton,例如矩形,然后单击 Canvas 上的任意位置,形状将绘制在那里。 由于某种原因,形状并不总是被绘制,只有当我单击 Canvas 左上角区域的某个位置时才会绘制形状。而且形状似乎会根据我点击的位置随机改变大小。

这是我的一些代码片段,这可能是一个小错误,但我似乎找不到它。

形状:

public class Shape extends JPanel {

    protected int xLocation;
    protected int yLocation;
    protected int numberOfSides; 
    protected String areaInfo; 
    protected String perimeterInfo; 

    public int getXLocation() {
        return xLocation;
    }

    public void setXLocation(int xLocation) {
        this.xLocation = xLocation;
    }

    public int getYLocation() {
        return yLocation;
    }

    public void setYLocation(int yLocation) {
        this.yLocation = yLocation;
    }

    public int getNumberOfSides() {
        return numberOfSides;
    }

    public Shape(int xLocation, int yLocation, int numberOfSides) {
        this.xLocation = xLocation;
        this.yLocation = yLocation;
        this.numberOfSides = numberOfSides;
    }
}

矩形:

import java.awt.Color;
import java.awt.Graphics;


public class Rectangle extends Shape {

    private int width;
    private int height;

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public Rectangle(int xLocation, int yLocation, int width, int height ) {
        super(xLocation, yLocation, 4);
        this.width = width;
        this.height = height;
        this.areaInfo = "Multiply width * height";
        this.perimeterInfo = "Add the lengths of each side";
    }

    public void paint(Graphics g){
        g.setColor(Color.BLACK);        
        g.fillRect(xLocation, yLocation, width, height);
    }
}

Canvas :

public class DrawingCanvas extends JPanel implements Serializable{

    private ArrayList<Shape> shapeList;
    OptionsPanel options;

    public void addShape(Shape shape){
        shapeList.add(shape);
        this.add(shape);
        this.repaint();
    }

    public DrawingCanvas(){
        shapeList = new ArrayList<Shape>();
    }

}

框架:

public class DrawingFrame extends JFrame implements MouseListener, MouseMotionListener {

    private OptionsPanel options;
    private DrawingCanvas canvas;
    private MenuBar menu;
    Shape s; //shape to be manipulated

    public DrawingFrame(){
        options = new OptionsPanel();
        canvas = new DrawingCanvas();
        menu = new MenuBar();

        //options.setBounds(0, 0, 100, 500);
        options.setBackground(Color.GREEN);
        canvas.setBackground(Color.yellow);
        menu.setSize(1000,200);
        menu.setBackground(Color.magenta);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(1000,500);
        this.setTitle("Drawing Application");

        this.setLayout(new BorderLayout());
        this.getContentPane().add(options, BorderLayout.WEST);
        this.getContentPane().add(canvas, BorderLayout.CENTER);
        this.getContentPane().add(menu, BorderLayout.PAGE_START);
        this.setVisible(true);

        options.createRectangleButton.addMouseListener(this);
        options.createSquareButton.addMouseListener(this);
        options.createCircleButton.addMouseListener(this);
        options.createTriangleButton.addMouseListener(this);
        options.clearButton.addMouseListener(this);
        canvas.addMouseListener(this);
        canvas.addMouseMotionListener(this);

    }




    @Override
    public void mouseClicked(MouseEvent e) {
        boolean createShape = true;

        if(e.getSource().equals(options.createRectangleButton)){
            createShape = true;
            s = new Rectangle(50,50,400,200);
            s.addMouseListener(this);
            s.addMouseMotionListener(this); 
        }

        if (e.getSource().equals(canvas) && createShape == true){
            s.setXLocation(e.getX());
            s.setYLocation(e.getY());
            createShape = false;
            canvas.addShape(s);
        }

最佳答案

缺少 complete example ,很难说。我希望您的 DrawingCanvas 重写 paintComponent() 以便渲染 shapeList 中累积的 Shape 实例。您可以将您的方法与 GaphPanel 中显示的方法进行比较,引用 here .

image

关于java - 单击 JPanel 绘制形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12954541/

相关文章:

java - 如何解决 Swing GUI 错误?

c++ - 我可以在进入 gpu 之前从视频游戏中记录图形数据吗?

java - 无法使用 getGraphics 绘制到 JPanel

java - 如何从java servlet发送数据到android客户端

java - Ant、NetBeans 平台项目 - 如何通过 System.getProperties 传递命令行参数和访问?

java - 从 JPanel/JFrame 的 JTextfields 添加到商店

java - 将外部 URL 添加到 JLabel

java - 在调用paint方法之前获取字体规范

java - Jackson TypeFactory 静态方法已弃用使用什么?

java - 按顺序执行两个 Action