我正在尝试为游戏创建标题屏幕。到目前为止,一切都很顺利,除了这个JFrame拒绝关闭的事实。我在不同的JFrame中使用不同JPanel中的JButton。我收到了错误
“无法对非静态方法进行静态引用 来自Window“
类型的setVisible(boolean)
package ZombieFunTimeGo;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SuperZombieFunTimeGo extends JFrame{
private TitleScreen ts;
boolean visible;
public SuperZombieFunTimeGo() {
add(new TitleScreen());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(1280, 720);
ts = new TitleScreen();
Container pane = getContentPane();
pane.add(ts);
setContentPane(ts);
setLocationRelativeTo(null);
setTitle("Super Zombie Fun Time Go!");
setResizable(false);
setVisible(true);
}
public void pullThePlug() {
WindowEvent wev = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(wev);
}
public static void main(String[] args) {
new SuperZombieFunTimeGo();
}
}
答案 0 :(得分:1)
您说的错误是编译错误,而不是运行时错误。你甚至无法编译文件。您似乎正在执行代码的先前编译版本。你可以发布抛出此错误的行吗?如果是这样,我可以改进我的答案。当您尝试访问静态上下文中的某个非静态成员时会发生此错误,因为您无法更改静态成员内的对象状态,因为静态成员属于类,而不属于对象。你在代码中做了一些奇怪的事情...你在JFrame中添加了一个TitleScreen,但在此之后你再次(通过内容窗格)完成了它并将TitleScreen设置为框架的内容窗格。看来你是Swing的新手。我是对的吗?
答案 1 :(得分:1)
是的,您在问题中发布的代码完全无关紧要。您在评论中发布的代码是导致问题的代码
startButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ new theActualGame(); SuperZombieFunTimeGo.setVisible(假); } });
问题是您调用setVisible
方法,因为它是static method,但事实并非如此。您应该只在SuperZombieFunTimeGo
实例上调用该方法。在这种情况下,您的ActionListener
将需要对该实例的引用,并在该实例上调用setVisible
。像
SuperZombieFunTimeGo titleScreen = ...;
...
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new theActualGame();
titleScreen.setVisible(false); }
});