java重绘阻止了jbutton

时间:2012-08-24 23:14:35

标签: java swing graphics jbutton jcomponent

在我的paintComponent()方法中,我有一个绘制jpanel背景的drawRect()。但由于在调用paintComponent()方法之前在屏幕上绘制了jbutton,因此drawRect会阻止jbutton。有谁知道如何解决这一问题?我的猜测是在重新调用之前添加jbutton,但我不知道该怎么做?

一些代码:

public Frame(){
  add(new JButton());
}

public void paintComponent(Graphics g){
  super.paintComponent(g);
  g.drawRect(0,0,screenwidth,screenheight); //paints the background with a color 
                                            //but blocks out the jbutton.
}

3 个答案:

答案 0 :(得分:6)

现在,首先,我会在这里告诉你你做错了什么 - JFrame不是JComponent,并且没有paintComponent供您覆盖。您的代码可能永远不会被调用。除此之外,drawRect只绘制一个矩形 - 它填充一个矩形。


但是,我相信有一种正确的方法可以做到这一点。

由于您使用的是JFrame,因此您应该通过JFrame.getLayeredPane利用容器的分层窗格

  

分层窗格是具有深度的容器,使得重叠的组件可以一个在另一个上面。有关分层窗格的常规信息位于How to Use Layered Panes。本节讨论根窗格如何使用分层窗格的详细信息。

根窗格包含在{3}中,它是Java教程的一部分。分层窗格是根窗格的子窗口,JFrame作为顶级容器使用基础JRootPane

无论如何,由于您对创建背景感兴趣,请参阅下图,了解分层窗格通常如何在顶级容器中查看:

  

下表描述了每个图层的预期用途,并列出了与每个图层对应的JLayeredPane常量:

     

图层名称 - - 说明

     

FRAME_CONTENT_LAYER - new Integer(-30000) - 根窗格将菜单栏和内容窗格添加到此深度的分层窗格中。

由于我们要在内容后面指定背景,我们首先将其添加到同一层(How to Use Root Panes),如下所示:

final JComponent background = new JComponent() {

  private final Dimension size = new Dimension(screenwidth, screenheight);

  private Dimension determineSize() {
    Insets insets = super.getInsets();
    return size = new Dimension(screenwidth + insets.left + insets.right,
        screenheight + insets.bottom + insets.top);
  }

  public Dimension getPreferredSize() {
    return size == null ? determineSize() : size;
  }

  public Dimension getMinimumSize() {
    return size == null ? determineSize() : size;
  }

  protected void paintComponent(final Graphics g) {
    g.setColor(Color.BLACK);
    g.fillRect(0, 0, screenwidth, screenheight);
  }
};
final JLayeredPane layeredPane = frame.getLayeredPane();
layeredPane.add(background, JLayeredPane.FRAME_CONTENT_LAYER);

现在,为了确保我们在内容之前绘制背景,我们使用JLayeredPane.FRAME_CONTENT_LAYER

layeredPane.moveToBack(background);

答案 1 :(得分:5)

我做了这个非常快速的测试。正如HovercraftFullOfEels所指出的那样。 JFrame没有paintComponent,因此我改为使用JPanel

Can you see me

这是由此代码生成的

public class PanelTest extends JPanel {

    private JButton button;

    public PanelTest() {

        setLayout(new GridBagLayout());

        button = new JButton("Can you see me ?");
        add(button);

    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        Rectangle bounds = button.getBounds();
        bounds.x -= 10;
        bounds.y -= 10;
        bounds.width += 20;
        bounds.height += 20;

        g.setColor(Color.RED);
        ((Graphics2D)g).fill(bounds);

    }

}

我尝试使用paintComponents上的JFrame来复制问题,我看不到矩形。即使我在paint上覆盖JFrame,矩形仍然会在按钮下面绘制(不是我建议做的)。

问题是,你没有给我们足够的代码来知道出了什么问题

ps - drawRect不会“填充”任何内容

答案 2 :(得分:1)

之前我遇到过这个问题,虽然不是专门的jframe,而不是你所拥有的那种场景。试试这段代码,

    this.getContentPane.repaint();
你的jframe上的

。我不确定这个,但试一试。