当我将程序设置为全屏时,为什么JPanel无法正确呈现?

我制作了一个将我的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。

问题是你正在创建多个不同的Screen实例,但你完全不知道哪一个实际上在屏幕上可见。

Kingdomcraft#main ,创建一个Screen实例并调用screen.run() ,它创建一个KindomcraftMainMenuScreen的实例……但等等,我们是Screen ,为什么我们需要另一个实例? 然后,您继续向this Screen实例添加内容,将Screen实例留空…

什么是真的很奇怪,你会把screen的实例传递给ifFullscreen (这是空白版本),然后尝试使其全屏…没有任何东西……但ifNotFullscreen实际上使用this ???

什么甚至更奇怪…当您从Screen#run调用MainMenu#run ,您创建了KingdomcraftMainMenuScreen … AGAIN的新实例…

fullscreen按钮被操作时,您将传递您在MainMenu创建的screen的引用,该screen不是具有内容并且应该在屏幕上显示的屏幕…

基本上,您似乎并不了解newfunction以及对象实例之间的差异。 新实例与同一对象的任何其他实例无关…

你应该做的是将Kingdomcraft的引用KingdomcraftScreen ,然后将Screen的引用传递给MainMenu 。 这些类都不应该创建自己的实例或KingdomcraftScreen实例

链中的每个链接都应该能够提供对前一个链接的访问,因此MainMenu应该能够在需要时向Screen请求对Kingdomcraft的引用。

此外,Swing不是线程安全的。 您永远不应该与事件调度线程以外的任何线程中的任何组件进行交互。

有关更多详细信息,请参阅Swing中的并发 。

从外观上看,我认为你需要回归基础并研究对象引用的工作原理……