我正在尝试用Java将一些JButton对象添加到我的GUI程序中,并将它们添加到JPanel(这是程序的主文件)中,但它出现在错误的位置。它在点[0,0]处显示op,并且与其链接的动作发生在正确的位置。面板上的其余元素是图像,因此非常经常调用重绘方法。
private void init()
{
setLayout(null);
setBackground(new Color(r, g, b));
addMouseListener(this);
addMouseMotionListener(this);
setSize(681, 700);
setPreferredSize(new Dimension(681, 700));
Insets insets = getInsets();
//wrong spot (click at [302, 5])
undoButton = new JButton("Undo");
undoButton.addActionListener(this); //button 1
undoButton.setActionCommand("undo");
undoButton.setVisible(true);
add(undoButton);
pause = new JButton("pause");
pause.addActionListener(this);
pause.setActionCommand("pause"); //button 2
pause.setVisible(true);
pause.setEnabled(true);
add(pause);
Dimension size = undoButton.getPreferredSize();
undoButton.setBounds(100 + insets.left, 15 + insets.top, size.width, size.height);
size = pause.getPreferredSize();
pause.setBounds(100 + insets.left + undoButton.getPreferredSize().width, 15 + insets.top, size.width, size.height);
try{
undoButton.setMultiClickThreshhold(500);
}
catch (Exception e)
{}
//... more code ...
}
public void paint (Graphics g)
{
//...paint the rest of the elements...
undoButton.update(g);
pause.update(g);
}
"暂停"按钮显示在撤消按钮顶部的原点,但点击是在正确的位置。 2个按钮应该显示在蓝色框的位置,而所有其他卡都是图像。
答案 0 :(得分:2)
你不应该覆盖paint
,你应该覆盖paintComponent
。如果您的组件已添加到面板中,他们将自行更新:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
//...paint the rest of the elements...
//undoButton.update(g); BAD!
//pause.update(g); BAD!
}
您不必担心按钮的更新方式,如果您正确使用按钮,面板将为您处理。也不要使用setLayout(null)
。出于某种原因,我们有布局管理器,使用具有您需要的功能或编写自己的功能。
答案 1 :(得分:0)
因为有些组件被移动并需要经常重新绘制
我认为绝对没有理由移动"撤消"和"暂停"纽扣。应使用Flow Layout将这些按钮添加到面板中。然后将面板添加到框架的北部。
摆脱空格局。
删除setPreferredSize()语句。布局管理器将确定按钮的大小。
所以我需要覆盖paint()。
您永远不应该覆盖JFrame的paint()方法。此方法的默认实现负责绘制已添加到框架中的组件。
阅读How to Use Buttons上Swing教程中的部分,了解工作示例以及构建代码的更好方法。
编辑:
你不应该覆盖框架上的paint()。
如果您想进行自定义绘画,请覆盖paintComponent(...)
的{{1}}并将面板添加到相框中。
如果您想在此面板中添加一些按钮,则可以执行以下操作:
JPanel