在我的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.
}
答案 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
。
这是由此代码生成的
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上的。我不确定这个,但试一试。