JFrame无法正常显示

时间:2015-05-15 13:10:50

标签: java swing constructor

我暂时没有做任何编程,所以我可能会遗漏一些明显的东西。

我正在尝试运行以下代码,该代码应创建一个空的JFrame并将其放在屏幕的中心:

public class MainGUI
{
// This initilizes the main JFrame
  public void MainGUI()
  {
    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame frame = new JFrame("Data Deriver");
    //frame.setContentPane(makeGUI(frame));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300,180);
    frame.setLocationRelativeTo(null);
    frame.setResizable(true);
    frame.setVisible(true);
  }
  public static void main(String[] args)
  {
    new MainGUI();
  }
}

但是,当我编译此代码(使用JDK 8.0_45)并运行它时,没有任何反应。没有窗户打开,没有错误被抛出,字面上没有任何反应。它编译时没有错误,因此代码应该可以工作,但没有显示任何内容。

我真的不确定自己错在哪里。

3 个答案:

答案 0 :(得分:2)

您只是在创建MainGUI类的实例,但是您没有任何显式构造函数,因此您的程序退出。

您必须调用创建并显示框架的MainGUI()方法:

public static void main(String[] args) {
    new MainGUI().MainGUI();
}

或者您可以将MainGUI()方法变为构造函数(这是您在编写new MainGUI()时调用的内容) - 也许这是您的意图:

public MainGUI() {
    JFrame.setDefaultLookAndFeelDecorated(true);
    // ...rest of your code
}

注意:

请注意,您应该在EDT(事件调度线程)中执行所有与swing相关的工作,因此您应该在EDT中运行MainGUI(),如下所示:

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new MainGUI();
        }
    });
}

有关详细信息,请参阅Initial Threads

答案 1 :(得分:0)

编译时没有错误, 这是因为编译器正在为您创建一个默认构造函数,因为您的MainGUI()声明在编译器中显示为一个函数,并带有'void'返回类型。

你想要的(理想情况下)是从MainGUI()中删除返回类型声明,你会得到你期望的。 (在执行时实例化GUI)

答案 2 :(得分:0)

问题在于:

public void MainGUI() {
        ^
}

void 导致它不是构造函数。使用 void ,系统正在创建一个空的(默认)构造函数,该构造函数为空,不会运行任何内容。删除它,它会工作。我们都时不时犯错误:))