简体   繁体   English

Java图形重绘问题

[英]Java graphics repaint problem

Having trouble with a simple paint pad in java. 在java中使用简单的画笔时出现问题。 Issues with getting my clear button to repaint. 让我的清除按钮重绘的问题。 The array is clearing but not repainting. 阵列正在清除,但没有重新绘制。 Can anyone spot my problem or is there any different way of generating a clear button for this code. 任何人都可以发现我的问题,或者是否有任何不同的方法为此代码生成一个清除按钮。

public class DrawingPanel extends JPanel {
  private double x1=0;
  private double x2=0;
  private double y1=0;
  private double y2=0;

  private ArrayList<Shape> myArr = new ArrayList<Shape>();
  //private ArrayList<Shape> clearMyArr = new ArrayList<Shape>();
  ButtonPanel buttonPress;

   public void paintComponent(Graphics g) 
  {
     for (Shape i : myArr)
     {
        Graphics2D g2d = (Graphics2D)g;
        g2d.draw(i);
     }   
         /*for (Shape i : clearMyArr)
     {
        Graphics2D g2d = (Graphics2D)g;
        g2d.draw(i);
     }   */

  }         
    //inner class

   class Listener1 extends MouseAdapter
  {
      public void mousePressed(MouseEvent e)
     {
        x1=e.getX();
        y1=e.getY();
        System.out.println("Mouse Pressed");
     }

      public void mouseReleased(MouseEvent e)
     {
        x2=e.getX();
        y2=e.getY();
        Shape shape = null;
        if (buttonPress.buttonType.equals("Rectangle"))
        {
        // Rectangles cannot have a zero width or height
           if (x1 != x2 || y1 != y2)
           {
              double width = Math.abs(x1 -x2);
              double height = Math.abs(y1-y2);
              shape = new Rectangle2D.Double(Math.min(x1,x2),Math.min(y1,y2), width, height);
           }
        } 
        if (buttonPress.buttonType.equals("Eclipse"))
        {
           double width = Math.abs(x1 -x2);
           double height = Math.abs(y1-y2);
           shape = new Ellipse2D.Double(Math.min(x1,x2),Math.min(y1,y2), width, height);;
       } 
        if (buttonPress.buttonType.equals("Lines"))
        {
           shape = new Line2D.Double(x1, y1, x2, y2);

        } 
            if (buttonPress.buttonType.equals("Clear"))
        {
                for( int i = 0;i <= myArr.size(); i++ )
                {
                System.out.println("ArrayList Size :"+myArr.size());

                myArr.clear(); // clear all elements from arraylist 
                //clearMyArr.addAll(myArr);
                System.out.println("ArrayList Size :"+myArr.size()); 

                //myArr.removeAll();
                revalidate();
                repaint();
                }


        } 

        if (shape != null)
        {
           myArr.add(shape);

        }
        repaint();
     }


  }
//end of inner class

   public DrawingPanel(ButtonPanel reference)
  {
     buttonPress = reference;
     setBorder(BorderFactory.createLineBorder(Color.black,4));
     addMouseListener(new Listener1());      
  }

} }

If you forget to call super.paintComponent(g); 如果忘记调用super.paintComponent(g); the background does not get cleared, so the old image will still be visible. 背景不会被清除,因此旧图像仍然可见。 And all JButton's and stuff you added, will not be drawn. 所有JButton和你添加的东西都不会被绘制出来。 To fix this, let the panel draw itself first, then you can draw your stuff on top of it. 要解决这个问题,让面板首先绘制自己,然后你可以在它上面绘制你的东西。

@Override
protected void paintComponent(Graphics g) {
     super.paintComponent(g);// <-- let panel draw itself
     Graphics2D g2d = (Graphics2D)g;
     for (Shape i : myArr)
     {
        g2d.draw(i);
     }   
  }

This works too (except that it does not draw widgets you added with DrawingPanel.add(..) ). 这也有效(除了它不会绘制您使用DrawingPanel.add(..)添加的小部件)。 It's a dirty hack: 这是一个肮脏的黑客:

@Override
protected void paintComponent(Graphics g)
     Graphics2D g2d = (Graphics2D)g;
     g2d.setColor(Color.grey);
     g2d.fillRect(0,0,this.getWidth(),this.getHeight()); //<-- clear the background
     for (Shape i : myArr)
     {
        g2d.draw(i);
     }   
  }

In the listener this would be enough. 在听众中这就足够了。

if (buttonPress.buttonType.equals("Clear"))
{
   myArr.clear();
   repaint();
}

You shouldn't have to call revalidate(); 你不应该调用revalidate(); .

Try to call super.paintcomponent(g) from the paintcomponent method. 尝试从paintcomponent方法调用super.paintcomponent(g)。 And also make sure you are calling the revalidate and repaint method of JPanel. 并确保您正在调用JPanel的revalidate和重绘方法。

Try to call repaint(); 尝试调用repaint(); of your JPanel. 你的JPanel。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM