现在,首先,我会告诉你你在这里做错了什么——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);