问题描述
问题是您正在创建多个不同的实例,Screen
但您完全不知道屏幕上实际可见哪个实例。
Kingdomcraft#main
,创建实例Screen
和调用screen.run()
,它创建的实例Kindomcraft
,MainMenu
以及Screen
......别急,我们Screen
,为什么我们需要另一个实例?然后,您继续向的this
实例添加内容Screen
,而将实例保留为screen
空白…
真正奇怪的是,您要将的实例传递screen
给ifFullscreen
(这是空白版本),然后将其尝试使其全屏显示…上面没有任何内容…但ifNotFullscreen
实际上使用了this
???
甚至更奇怪…当您MainMenu#run
从调用时Screen#run
,您创建的新实例Kingdomcraft
,MainMenu
然后Screen
…再次…
当fullscreen
按钮被付诸行动,你传递给它的引用screen
您创建的MainMenu
,这是不是有它的内容,哪些应该在屏幕上显示一个…
基本上,您似乎不了解做什么new
以及对象实例之间的区别。一个新实例与同一对象的任何其他实例都没有关系…
你应该做的是路过的参考Kingdomcraft
来Screen
,然后传递的参考Screen
来MainMenu
。这些类都不应该创建自己的实例或实例Kingdomcraft
或Screen
链中的每个链接都应该能够提供对前一个链接的访问,因此MainMenu
应该能够请求对它Screen
的引用Kingdomcraft
。
另外,Swing也不是线程安全的。除了事件调度线程以外,您永远不应与任何线程中的任何组件进行交互。
有关更多详细信息,请参见Swing中的并发。
从事物的外观来看,我认为您需要回到基础知识,并研究对象引用的工作原理…
解决方法
我做了一个将我的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渲染不正确?
我的意思是说,在我的黑色背景上有一个很大的灰色JPanel,没有JButton呈现。