我制作了一个将我的JFrame设置为全屏的JButton:
add(fullscreen);
fullscreen.setSize(100, settings.getHeight());
fullscreen.setLocation(settings.getX() + (settings.getWidth() / 2) - 50, light.getY() + 35);
fullscreen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(isFullscreen) {
isFullscreen = false;
screen.ifNotFullscreen();
}
if(!isFullscreen) {
isFullscreen = true;
screen.ifFullscreen(screen);
}
mm.revalidate();
}
});
这是JFrame:
public class Screen extends JFrame {
private Kingdomcraft kd;
private MainMenu mm;
private Screen screen;
private Dimension min = new Dimension(800, 600);
private ImageIcon img;
public void run() {
kd = new Kingdomcraft();
mm = new MainMenu();
screen = new Screen();
img = new ImageIcon("assets/textures/items/ItemSwordIron.png");
this.add(kd);
this.setContentPane(mm);
this.setLocationRelativeTo(null);
this.setTitle("Kingdomcraft");
this.setIconImage(img.getImage());
this.setBackground(Color.BLACK);
this.pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mm.setOpaque(false);
mm.run();
if (mm.isFullscreen) {
ifFullscreen(screen);
}
if (!mm.isFullscreen) {
ifNotFullscreen();
}
}
public void ifFullscreen(Screen screen) {
this.screen = screen;
this.setVisible(true);
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(screen);
repaint();
}
public void ifNotFullscreen() {
this.setMinimumSize(min);
this.setResizable(true);
this.setVisible(true);
repaint();
}
}
为什么当我运行游戏并选择JButton全屏时,JPanel呈现错误?
就此而言,我的意思是在我的黑色背景上有一个没有JButton的大灰色JPanel。
答案 0 :(得分:1)
问题是你正在创建多个不同的Screen
实例,但你完全不知道哪一个实际上在屏幕上可见。
Kingdomcraft#main
,创建Screen
的实例并调用screen.run()
,这会创建Kindomcraft
,MainMenu
和Screen
的实例。但是等等,我们是Screen
,为什么我们需要另一个实例?然后,您继续向this
的{{1}}实例添加内容,将Screen
的实例留空......
真的很奇怪,你会将screen
的实例传递给screen
(这是空白版本),然后尝试将其全屏显示......没有任何内容......但ifFullscreen
实际使用ifNotFullscreen
???
甚至更奇怪......当您从this
致电MainMenu#run
时,您创建了Screen#run
,Kingdomcraft
和MainMenu
的新实例...... AGAIN ...
当Screen
按钮被操作时,您传递的是您在fullscreen
中创建的screen
的引用,该引用不是包含内容且应显示的内容的MainMenu
在屏幕上......
基本上,您似乎不了解new
的作用以及对象实例之间的差异。新实例与同一对象的任何其他实例无关......
您应该做的是将Kingdomcraft
的引用传递给Screen
,然后将Screen
的引用传递给MainMenu
。这些类都不应该创建自己的实例或Kingdomcraft
或Screen
链中的每个链接都应该能够提供对上一个链接的访问权限,以便MainMenu
能够在需要时Screen
询问Kingdomcraft
的引用。
另外,Swing不是线程安全的。您永远不应该与事件调度线程以外的任何线程中的任何组件进行交互。
有关详细信息,请参阅Concurrency in Swing。
从外观上看,我认为你需要回归基础并研究对象引用的工作原理......