调用重绘后,JButton出现在错误的位置

时间:2015-04-21 20:18:27

标签: java swing jpanel jbutton repaint

我正在尝试用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个按钮应该显示在蓝色框的位置,而所有其他卡都是图像。 enter image description here

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