现在,首先,我会告诉你什么你”在这里做错了 - JFrame
不是JComponent
,并且没有paintComponent
供您覆盖。你的代码可能永远不会被调用。除此之外,drawRect
只画一个矩形 - 它确实是而不是填充一个。
但是,我相信有一个正确的方法来做到这一点。
由于您使用的是JFrame
,你应该通过JFrame.getLayeredPane
利用容器的分层窗格的。
分层窗格是一个容器,其深度使得重叠的组件可以相互重叠。关于分层窗格的一般信息在How to Use Layered Panes。本节讨论根面板如何使用分层窗格的细节。
根窗格覆盖在How to Use Root Panes,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);
“框架”是否扩展了“JFrame”? – Jeffrey
这真是奇怪的代码,因为我同意Jeffrey的看法,你好像试图重写一个不应该发生的JFrame类的'paintComponent(...)'方法。请在'paintComponent(...)'方法之前放置'@ Override'。确保你重写'paintComponent(...)'和** not **'paintComponents(...)',因为有一个** big **的区别。如果您可以发布[sscce](http://sscce.org)让我们亲眼看到并亲身体验您的问题,那就太好了。 –
好吧,我编辑了这篇文章,这只是一个示例代码,我很快输入了不是我的实际项目 – Ewen