静态setVisible JFrame

时间:2012-07-29 01:47:43

标签: java swing static jframe

我正在尝试为游戏创建标题屏幕。到目前为止,一切都很顺利,除了这个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();
    }
}

2 个答案:

答案 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); } 
});