Eth*_*per 4 java swing background jframe setbackground
我有两个类文件:
屏幕https://gist.github.com/3020101
JMain https://gist.github.com/3020107
我试图让它全屏显示5秒并显示背景(或者,此时,甚至是前景)但是当我运行它时全屏显示5秒钟,但是它只是一个空白的浅灰色屏幕.
我究竟做错了什么?最终我将使用图像作为背景,我想确保我没有搞砸到某个地方.
多谢你们!
编辑:当我在我的JMain类的末尾添加它时,字体颜色与前景色相同,但无论我在程序中将其更改为什么颜色,背景总是黑色.
public void paint(Graphics g) {
g.drawString("This is gonna be awesome", 200, 200);
}
Run Code Online (Sandbox Code Playgroud)
来自github的代码
import java.awt.*;
import javax.swing.JFrame;
public class JMain extends JFrame {
private JFrame frame = new JFrame();
public static void main(String[] args) {
DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
JMain m = new JMain();
m.run(dm);
}
public void run(DisplayMode dm) {
this.getContentPane().setBackground(Color.RED);
frame.setForeground(Color.BLACK);
frame.setFont(new Font("Arial", Font.PLAIN, 24));
Screen s = new Screen();
try {
s.setFullScreen(dm, this);
try {
Thread.sleep(5000);
} catch (Exception ex) {
}
} finally {
s.restoreScreen();
}
}
}
Run Code Online (Sandbox Code Playgroud)
和
import java.awt.*;
import javax.swing.JFrame;
public class Screen {
private GraphicsDevice vc;
public Screen() {
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
vc = env.getDefaultScreenDevice();
}
public void setFullScreen(DisplayMode dm, JFrame window) {
window.setUndecorated(true);
window.setResizable(false);
vc.setFullScreenWindow(window);
if (dm != null && vc.isDisplayChangeSupported()) {
try {
vc.setDisplayMode(dm);
} catch (Exception ex) {
}
}
}
public Window getFullScreenWindow() {
return vc.getFullScreenWindow();
}
public void restoreScreen() {
Window w = vc.getFullScreenWindow();
if (w != null) {
w.dispose();
}
vc.setFullScreenWindow(null);
}
}
Run Code Online (Sandbox Code Playgroud)
mKo*_*bel 11
不要扩展a JFrame
,而是创建一个局部JFrame
变量并使用它.
你不能绘制JFrame
背景颜色,但你可以为JFrame contentPane
(通常是a JPanel
)执行此操作.执行此操作的代码示例如下:
this.getContentPane()的setBackground(Color.RED).
永远不要Thread.sleep(int)
在Swing事件线程中调用的代码中使用,因为这将完全阻止此线程,从而阻止它执行绘制GUI和与用户交互的必要操作,并在线程休眠时有效地冻结应用程序.
使用 Swing Timer代替Thread.sleep(...)
更换:
setBackground(Color.RED);
Run Code Online (Sandbox Code Playgroud)
附:
getContentPane().setBackground(Color.RED);
Run Code Online (Sandbox Code Playgroud)
另外,您应该尝试将图形相关代码放在SwingUtilities.invoke中......因为如果从主线程使用图形相关类,您可能会遇到意外问题.如果你做了这个改变,一定要避免SwingUtilities.invoke中的睡眠...因为它会阻止你的绘画.