我有一个包含3个JPanel的JFrame;选项,菜单,画布。在选项中,有许多表示形状的JButton。目的是单击形状(例如矩形)的JButton,然后在画布上单击任意位置,然后将在此处绘制形状。由于某种原因,形状并不总是被绘制,仅当我单击画布左上方区域中的某个位置时才绘制形状。此外,形状似乎会随我单击的位置而随机改变大小。
这是我的一些代码片段,这可能是一个小错误,但是我似乎找不到它。
形状:
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); } }
帆布:
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); }
我不得不覆盖canvas类的paint方法。在canvas类中调用super.paint并分别重新绘制每个形状
public void paint(Graphics g){ super.paint(g); for(int i=0;i<shapeList.size();i++){ ((Shape)shapeList.get(i)).paint(g); } }