gpt4 book ai didi

java - 面板上不需要的按钮绘画

转载 作者:行者123 更新时间:2023-11-30 03:55:09 25 4
gpt4 key购买 nike

所以我正在制作一个简单的绘画程序,并且我有两个面板。第一个面板位于右中,是 Canvas 。另一个位于右侧,用于容纳工具按钮,但目前只有一个透明按钮。问题是,当我开始单击 Canvas 时,结果会在其上绘制清除按钮。知道我缺少什么吗?

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

Canvas :

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 上下文中。

每次调用 paintComponent 时,都会调用 super.paintComponent

在 Swing 中绘制是破坏性的,也就是说,每当调用 paintComponent 时,您都需要重新绘制组件的整个状态。

关于java - 面板上不需要的按钮绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23416202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com