gpt4 book ai didi

java - 重绘时复制了 JButton?

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:55 24 4
gpt4 key购买 nike

我有一个 JFrame,里面有 2 个 JPanel:一个 PaintPanel(有一个 paint() 方法) 和一个 ButtonPanel(带有按钮)。当我调用 PaintPanelrepaint()(但单击按钮)时,ButtonPanel 的按钮正在绘制在 绘画面板!它不可点击或任何东西,它就在那里。

我尝试用这段代码重现问题:

public class Main {

public static void main(String[] args) {
JFrame frame = new JFrame("frame");
frame.setSize(400,400);
frame.setLayout(new GridLayout(2,1));
PaintPanel paint = new PaintPanel();
ButtonPanel buttons = new ButtonPanel(paint);
frame.add(paint);
frame.add(buttons);
frame.setVisible(true);
}
}

public class PaintPanel extends JPanel{
public void paint(Graphics g){
g.drawRect(10, 10, 10, 10);
}
}

public class ButtonPanel extends JPanel implements ActionListener{

private PaintPanel paintPanel;

public ButtonPanel(PaintPanel paintPanel){
this.paintPanel=paintPanel;
JButton button = new JButton("button");
button.addActionListener(this);
add(button);
}

@Override
public void actionPerformed(ActionEvent arg0) {
paintPanel.repaint();
}
}

这将重现我遇到的问题(抱歉奇怪的代码标记,似乎无法正确处理)。

我真的希望你们中的一个知道这里发生了什么,因为我不知道...

最佳答案

首先,您应该覆盖 paintComponent() 而不是 paint()。在进行某些面板自定义时,它是 Swing 中最佳实践的一部分。

其次,这是对我有用的代码(我不知道为什么你的代码不行 :S):

public class Main {

public static void main(String[] args) {

JFrame frame = new JFrame("frame");
frame.setSize(400, 400);
// frame.setLayout(new GridLayout(2, 1));
PaintPanel paint = new PaintPanel();
ButtonPanel buttons = new ButtonPanel(paint);
// frame.add(paint);
// frame.add(buttons);
frame.setVisible(true);

JPanel pan = new JPanel(new BorderLayout());
pan.add(paint);
pan.add(buttons, BorderLayout.SOUTH);
frame.add(pan);

}
}

class PaintPanel extends JPanel {

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(new Color(new Random().nextInt()));
g.drawRect(10, 10, 10, 10);
}
}

class ButtonPanel extends JPanel implements ActionListener {

private final PaintPanel paintPanel;

public ButtonPanel(PaintPanel paintPanel) {

this.paintPanel = paintPanel;
JButton button = new JButton("button");
button.addActionListener(this);
add(button);
}

@Override
public void actionPerformed(ActionEvent arg0) {
if (getParent() != null) {
getParent().repaint();
}
}
}

关于java - 重绘时复制了 JButton?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12222053/

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