【问题标题】:Java graphics repaint problemJava图形重绘问题
【发布时间】:2011-03-11 10:04:20
【问题描述】:

在 java 中使用简单的画板时遇到问题。让我的清除按钮重绘的问题。数组正在清除但未重新绘制。任何人都可以发现我的问题,或者是否有任何不同的方式为此代码生成清除按钮。

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());      
  }

}

【问题讨论】:

  • 我不明白这个问题。清除后旧形状是否仍然可见?还是没有绘制清除按钮?
  • 如需尽快获得更好的帮助,请发布 SSCCE (pscode.org/sscce.html)。

标签: java swing user-interface repaint graphics2d


【解决方案1】:

如果您忘记调用super.paintComponent(g);,背景不会被清除,因此旧图像仍然可见。并且您添加的所有 JButton 和东西都不会被绘制。要解决此问题,请先让面板自行绘制,然后您可以在其上绘制您的东西。

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

这也有效(除了它不会绘制您使用DrawingPanel.add(..) 添加的小部件)。这是一个肮脏的黑客:

@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);
     }   
  }

在监听器中这就足够了。

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

您不必致电revalidate();

【讨论】:

    【解决方案2】:

    尝试从paintcomponent方法调用super.paintcomponent(g)。还要确保你调用了 JPanel 的 revalidate 和 repaint 方法。

    【讨论】:

      【解决方案3】:

      尝试调用 repaint();你的 JPanel。

      【讨论】:

      • 按下清除按钮会清除已绘制的形状数组,但不会将它们从 jpanel 中清除。我尝试过 revalidate()、repaint() 但无济于事。
      猜你喜欢
      • 2014-06-11
      • 2018-02-06
      • 2018-12-28
      • 1970-01-01
      • 2013-06-02
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多