我被困在一个项目中,我不得不实现一系列几个类,最终形成一个功能性绘图程序。我的问题是,当我运行测试程序时,绘图不能正常工作。为了给你一个基本的想法,我实现了形状的子类MyLine,MyRectange,MyOval
所有这些都在超类MyShape
下。这些子类中的每一个都实现了自己的绘制
方法,该方法以Graphics参数作为参数。然后我实现了两个类来设计可以使用鼠标绘制这些形状的界面。这两个类DrawPanel
和DrawFrame
分别扩展了JPanel
和JFrame
。
我有一种感觉,错误是在DrawPanel
的重写画布组件
方法中,或者在调用repaint()
方法的方式中。当我运行程序时,整个窗口会正确显示所有菜单等,但是当我尝试绘制形状时,会发生以下两种情况之一:
此外,我注意到,如果我添加super. pintComponent(g2)
命令,我会得到适当的白色背景,我可以看到形状被快速拖出,但它们实际上从未停留在屏幕上。
这是我的DrawPanel
代码,我很确定这就是错误发生的地方:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.plaf.basic.BasicTabbedPaneUI.MouseHandler;
public class DrawPanel extends JPanel {
private MyShape[] shapes;
private int shapeCount;
private int shapeType;
private MyShape currentShape;
private Color currentColor;
private boolean filledShape;
private JLabel statusLabel;
private Graphics gTest;
DrawPanel(JLabel P){
shapes= new MyShape[100];
shapeCount=0;
statusLabel=P;
currentColor= Color.black;
currentShape=null;
setBackground(Color.white);
shapeType=1;
Mouse handler= new Mouse();
addMouseListener(handler);
addMouseMotionListener(handler);
}
@Override
protected
void paintComponent(Graphics g2){
super.paintComponent(g2);
while(shapeCount>1 && currentShape!=null)
{
currentShape.draw(g2);
shapeCount--;
}
}
//set methods
void setColor(Color c){
currentColor=c;
}
void setFill(boolean f){
filledShape= f;
}
void setShape(int s){
shapeType=s;
}
void clearLastShape(){
if(shapeCount==0)
System.out.print("There are no more shapes to clear");
else
shapeCount--;
repaint();
}
void clearDrawing(){
shapeCount=0;
repaint();
}
class Mouse extends MouseAdapter implements MouseMotionListener{
@Override
public
void mousePressed(MouseEvent e){
if(shapeType==1)
currentShape= new MyLine();
else if(shapeType==2)
currentShape= new MyRectangle();
else
currentShape= new MyOval();
currentShape.setX1(e.getX());
currentShape.setY1(e.getY());
currentShape.setColor(currentColor);
if(shapeType==2 || shapeType==3){
((MyBoundedShape) currentShape).setFill(filledShape);
}
}
@Override public void mouseReleased(MouseEvent e){
currentShape.setX2(e.getX());
currentShape.setY2(e.getY());
shapes[shapeCount]=currentShape;
shapeCount++;
currentShape=null;
repaint();
}
@Override
public void mouseMoved(MouseEvent e){
statusLabel.setText("("+e.getX()+","+e.getY()+")");
}
@Override
public void mouseDragged(MouseEvent e){
mouseMoved(e);
currentShape.setX2(e.getX());
currentShape.setY2(e.getY());
repaint();
}
}
}
感谢任何帮助。
你永远不会遍历数组来绘制数组持有的形状。你改变了shapeCount变量,但是如果你不使用它来获取数组中的一个形状,它本身什么也做不了。我建议你尝试这样做,如果这是你的目标。
事实上,您可能不应该更改画布组件内的shapeCount变量,因为这将清除您的绘图。