当我将程序设置为全屏时,为什么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()
,它创建一个Kindomcraft
, MainMenu
和Screen
的实例……但等等,我们是Screen
,为什么我们需要另一个实例? 然后,您继续向this
Screen
实例添加内容,将Screen
实例留空…
什么是真的很奇怪,你会把screen
的实例传递给ifFullscreen
(这是空白版本),然后尝试使其全屏…没有任何东西……但ifNotFullscreen
实际上使用this
???
什么甚至更奇怪…当您从Screen#run
调用MainMenu#run
,您创建了Kingdomcraft
, MainMenu
和Screen
… AGAIN的新实例…
当fullscreen
按钮被操作时,您将传递您在MainMenu
创建的screen
的引用,该screen
不是具有内容并且应该在屏幕上显示的屏幕…
基本上,您似乎并不了解new
function以及对象实例之间的差异。 新实例与同一对象的任何其他实例无关…
你应该做的是将Kingdomcraft
的引用Kingdomcraft
给Screen
,然后将Screen
的引用传递给MainMenu
。 这些类都不应该创建自己的实例或Kingdomcraft
或Screen
实例
链中的每个链接都应该能够提供对前一个链接的访问,因此MainMenu
应该能够在需要时向Screen
请求对Kingdomcraft
的引用。
此外,Swing不是线程安全的。 您永远不应该与事件调度线程以外的任何线程中的任何组件进行交互。
有关更多详细信息,请参阅Swing中的并发 。
从外观上看,我认为你需要回归基础并研究对象引用的工作原理……