Нежелательная кнопка рисования на панели

1

Поэтому я делаю простую программу рисования, и у меня две панели. Первая панель находится в центре справа и является холстом. Другой, состыковавшийся справа и удерживающий кнопки инструментов, но в настоящее время он имеет только четкую кнопку. Дело в том, когда я нажимаю на холст, в результате на нем нарисована кнопка очистки. Любая идея, что мне не хватает?

public class Paint extends JFrame implements ActionListener {

    private Canvas canvas;
    private JButton clear;
    private JPanel tools;

    Paint(){
        canvas= new Canvas();
       add(canvas,BorderLayout.CENTER);
         clear= new JButton("Clear");
         clear.addActionListener(this);
         tools= new JPanel();
         tools.add(clear);
         add(tools,BorderLayout.WEST);

    }

    public void actionPerformed(ActionEvent e){
       if(e.getSource()==clear){
           canvas.clear();
       }
    }

    public static void main(String[] args) {
        Paint paint=new Paint();
        paint.setSize(1000,800);
        paint.setVisible(true);
        paint.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }   
}

Холст:

public class Canvas extends JPanel {
    private int x= -10;
    private int y= -10;
    private boolean clear=false; 
    Canvas(){
      addMouseListener(new MouseAdapter(){
            @Override
            public void mousePressed(MouseEvent e){
                x=e.getX();
                y=e.getY();
                draw();
            }
        });

        addMouseMotionListener(new MouseMotionAdapter(){
          @Override
          public void mouseDragged(MouseEvent e){
              x=e.getX();
              y=e.getY();
              draw();
           } 
        });
    }

    @Override
    public void paintComponent(Graphics g){
       if(clear){
           super.paintComponent(g);
           clear=false;
       }
       else{
           g.fillOval(x,y,4,4);
       }


    }

    public void draw(){
        this.repaint();
    }

    public void clear(){
        clear=true;
        repaint();
    }
}
Теги:
graphics
swing
jpanel
paint

1 ответ

2
Лучший ответ

Graphics - это общие ресурсы, то есть каждый компонент, который окрашивается во время цикла рисования, использует один и тот же контекст Graphics.

Одна из задач paintComponent - подготовить контекст Graphics для рисования компонентом, не получив вызов super.paintComponent КАЖДЫЙ ВРЕМЯ paintComponent вызывается тем, что когда-либо ранее было написано в контексте Graphics в такте.

Вызовите super.paintComponent каждый раз, когда вызывается paintComponent.

Картина в Swing является разрушительной, т.е. Вы должны перекрасить все состояние вашего компонента при вызове paintComponent.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню