Поэтому я делаю простую программу рисования, и у меня две панели. Первая панель находится в центре справа и является холстом. Другой, состыковавшийся справа и удерживающий кнопки инструментов, но в настоящее время он имеет только четкую кнопку. Дело в том, когда я нажимаю на холст, в результате на нем нарисована кнопка очистки. Любая идея, что мне не хватает?
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
- это общие ресурсы, то есть каждый компонент, который окрашивается во время цикла рисования, использует один и тот же контекст Graphics
.
Одна из задач paintComponent
- подготовить контекст Graphics
для рисования компонентом, не получив вызов super.paintComponent
КАЖДЫЙ ВРЕМЯ paintComponent
вызывается тем, что когда-либо ранее было написано в контексте Graphics
в такте.
Вызовите super.paintComponent
каждый раз, когда вызывается paintComponent
.
Картина в Swing является разрушительной, т.е. Вы должны перекрасить все состояние вашего компонента при вызове paintComponent
.