编程语言
首页 > 编程语言> > java-保持绘制图形-删除super.paintComponent

java-保持绘制图形-删除super.paintComponent

作者:互联网

我有一个名为Foo的类,该类扩展了一个名为Bar的类,该类扩展了JPanel并实现了ActionListener.当选择“圆”并单击“绘制”按钮时,将绘制一个圆,当按矩形并单击“绘制”时,它将擦除先前的形状并绘制一个矩形.

但是,我希望将所有形状保留在JPanel上,直到选择单击“擦除”按钮.因此,我删除了super.paintComponent(g)并使其工作,但是它也导致Bar类的按钮以小故障的方式重新出现.如何停止重新绘画按钮?
我当时在考虑不扩展Bar并使Foo扩展JPanel.

  public class Bar extends JPanel implements ActionListener
    {
    public void actionPerformed(ActionEvent e)
    {

        if (e.getActionCommand() == "Draw")
        {
            this.requestDraw = true;
            repaint();
        }
            if (e.getActionCommand() == "Circle")
            {
                requestRectangle = false;
                requestTriangle = false;
                requestCircle = true;
            }
            if (e.getActionCommand() == "Rectangle")
            {
                requestCircle = false;
                requestTriangle = false;
                requestRectangle = true;
            }
            if (e.getActionCommand() == "Right Triangle")
            {
                requestCircle = false;
                requestRectangle = false;
                requestTriangle = true;
            }
    }


    public class Foo extends Bar
    {    
        @Override
        public void paintComponent(Graphics g)
        {
            //super.paintComponent(g);
            if(RequestDraw())
            {

                if(RequestCircle())
                    circle.draw(g);
                if(RequestRectangle())
                    rectangle.draw(g);
                if(RequestTriangle())
                    rightTriangle.draw(g);



            }

            if(!RequestDraw())
            {                    


                g.setColor(getBackground());
                g.fillRect(0,0,getWidth(), getHeight());
            }        
        }
    }
}

解决方法:

建议:

>不要删除super.paintComponent(g),因为它具有必要的重要作用.
>相反,为什么不绘制到BufferedImage,然后在paintComponent(…)方法重写中绘制该BufferedImage.
>然后,如果要删除绘制的图像,只需创建一个新的BufferedImage或在其上绘制.

顺便说一句,不要使用==比较字符串.请改用equals(…)或equalsIgnoreCase(…)方法.理解==会检查两个对象是否相同,这不是您感兴趣的对象.另一方面,方法会检查两个Strings是否具有相同顺序的相同字符,这就是这里的要点.所以代替

if (fu == "bar") {
  // do something
}

做,

if ("bar".equals(fu)) {
  // do something
}

要么,

if ("bar".equalsIgnoreCase(fu)) {
  // do something
}

标签:repaint,paintcomponent,java,graphics,swing
来源: https://codeday.me/bug/20191011/1890373.html