Java设置背景不工作
我正在用Java制作一个游戏,目前背景设置不起作用,但前景设置可以起作用。以下是我的主类代码:Java设置背景不工作,java,swing,graphics,jframe,setbackground,Java,Swing,Graphics,Jframe,Setbackground,我正在用Java制作一个游戏,目前背景设置不起作用,但前景设置可以起作用。以下是我的主类代码: import java.awt.*; import javax.swing.*; public class Sam extends JFrame{ public static void main(String[] args) { DisplayMode dm = new DisplayMode(1920, 1080, 32, 60); Sam s = new Sam();
import java.awt.*;
import javax.swing.*;
public class Sam extends JFrame{
public static void main(String[] args) {
DisplayMode dm = new DisplayMode(1920, 1080, 32, 60);
Sam s = new Sam();
s.run(dm);
}
public void run(DisplayMode dm){
this.setBackground(Color.PINK);
this.setForeground(Color.BLACK);
setFont(new Font("Arial", Font.PLAIN, 24));
Screen s = new Screen();
try{
s.setFullScreen(dm, this);
try{
Thread.sleep(5000);
}catch(Exception ex){ex.printStackTrace();}
}finally{
s.restoreScreen();
}
}
public void paint(Graphics g){
g.drawString("THIS IS GUNNA BE AWESOME", 200, 200);
}
}
下面是我的Screen类的代码:
import java.awt.*;
import javax.swing.*;
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){ex.printStackTrace();}
}
}
public Window getFullScreenWindow(){
return vc.getFullScreenWindow();
}
public void restoreScreen(){
Window w = vc.getFullScreenWindow();
if(w != null){
w.dispose();
}
vc.setFullScreenWindow(null);
}
}
JFrame
是一个复合组件,它实际上由许多其他组件组成
(来自)
因此,当您调用setBackground
时,您只更改底层框架的背景色,而不是位于其上的contentPane
相反,您应该使用getContent().setBackground(…)
“但是,setForegound
为什么起作用呢?”我在这里问你
这是因为您已经覆盖了JFrame
的paint
,它预先配置了frame的前台
属性(而不是内容窗格
)
现在,说了这么多
JFrame
)进行扩展,原因如下paint
。您应该从一个组件开始,从类似JPanel
的东西扩展,并覆盖它的paintComponent
方法绘制时出错的内容,并且它们不是双缓冲的,因此更新它们会导致闪烁
例子。。。
getContent()不起作用,getContentPane()起作用,但它仍然不改变颜色背景你去掉了paint
方法了吗,你打破了绘制链合同了吗,我去掉了它,但是如何添加文本呢?创建一个JPanel
,覆盖它的paintComponent
,在那里添加自定义绘画(可能还将面板的背景色设置为所需颜色),将其添加到框架中…正如我所说,我在重写的类中有paintComponent方法,但如何将其添加到框架中;
import java.awt.Color;
import java.awt.DisplayMode;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Sam extends JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
DisplayMode dm = new DisplayMode(1920, 1080, 32, 60);
Sam s = new Sam();
s.run(dm);
}
});
}
public Sam() {
add(new MainView());
}
public void run(DisplayMode dm) {
Screen s = new Screen();
s.setFullScreen(dm, this);
Timer timer = new Timer(5000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
s.restoreScreen();
}
});
timer.start();
}
public class MainView extends JPanel {
public MainView() {
this.setBackground(Color.PINK);
this.setForeground(Color.BLACK);
setFont(new Font("Arial", Font.PLAIN, 24));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
String text = "THIS IS GUNNA BE AWESOME";
FontMetrics fm = g.getFontMetrics();
int x = (getWidth() - fm.stringWidth(text)) / 2;
int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
g.drawString(text, x, y);
}
}
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) {
ex.printStackTrace();
}
}
}
public Window getFullScreenWindow() {
return vc.getFullScreenWindow();
}
public void restoreScreen() {
Window w = vc.getFullScreenWindow();
if (w != null) {
w.dispose();
}
vc.setFullScreenWindow(null);
}
}
}