鼠标绘图程序Java

时间:2012-07-11 20:02:20

标签: java graphics drawing jpanel

我不得不在一个项目上工作,我必须实现一系列几个类,最终形成一个功能性的绘图程序。我的问题是,当我运行测试程序时,绘图无法正常工作。为了给你一个基本的想法,我实现了形状MyLine, MyRectangle, MyOval的子类,所有这些都在超类MyShape下。这些子类中的每一个都实现了自己的draw方法,该方法将Graphics参数作为参数。然后,我实现了两个类来设计可以使用鼠标绘制这些形状的界面。这两个类DrawPanelDrawFrame分别扩展JPanelJFrame

我感觉错误出现在paintComponent被覆盖的DrawPanel方法中,或者调用repaint()方法的方式。运行程序时会发生的情况是整个窗口都显示正确的所有菜单等,但当我尝试绘制一个形状时,会发生以下两种情况之一:

  1. 屏幕上什么也没发生。
  2. 如果我快速移动鼠标,我可能会得到一些带有正确颜色和形状的小涂鸦。
  3. 另外,我注意到如果我添加super.paintComponent(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();
        }
    }
    }
    

    感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您永远不会遍历数组来绘制数组所持有的Shapes。您更改了shapeCount变量,但如果您不使用它来获取数组中的一个Shapes,则它本身不会执行任何操作。如果这是你的目标,我建议你尝试这样做。

实际上,您可能不应该更改paintComponent中的shapeCount变量,因为这会清除您的绘图。