0

在我的paintComponent() 方法中,我有一个绘制jpanel 背景的drawRect()。但是因为在调用paintComponent() 方法之前jbutton 是在屏幕上绘制的,所以jbutton 被drawRect 挡住了。有谁知道如何解决这一问题?我的猜测是在调用 repaint 之前添加 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.
}
4

3 回答 3

6

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


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

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

分层窗格是一个具有深度的容器,这样重叠的组件可以一个在另一个之上。有关分层窗格的一般信息在如何使用分层窗格中。本节讨论根窗格如何使用分层窗格的细节。

Java 教程的一部分如何使用根窗格中介绍了根窗格。分层窗格是根窗格的子窗格,而JFrame作为顶级容器的JRootPane.

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

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

图层名称--描述

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

由于我们要指定我们的背景在内容的后面,所以我们首先将其添加到同一层(JLayeredPane.FRAME_CONTENT_LAYER),如下:

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.moveToBack

layeredPane.moveToBack(background);
于 2012-08-24T23:46:23.860 回答
5

我做了这个非常快速的测试。正如 HovercraftFullOfEels 指出的那样。JFrame 没有 a paintComponent,所以我用 aJPanel代替。

你可以看到我吗

这是由这段代码产生的

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不会“填充”任何东西

于 2012-08-24T23:38:07.953 回答
1

我以前遇到过这种情况,尽管不是专门针对 jframe 的,也不是您所拥有的那种场景。试试这个代码,

    this.getContentPane.repaint();

在你的 jframe 上。我不确定这一点,但试一试。

于 2012-08-25T08:29:31.430 回答