当涉及GUI时,程序立即终止

时间:2014-06-24 11:14:39

标签: java user-interface terminate

当尝试在Eclipse中运行以下代码时,它几乎立即终止而没有消息(只有退出值为-1073740940),但任何不包含GUI元素的java代码都运行正常。当使用调试器运行它到达'new Runnable'行然后终止,但GUI窗口永远不会出现。 GUI前一段时间工作正常,但他们在某些时候停止工作,我不明白为什么。

import java.awt.*;
import javax.swing.*;

public class Test {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Wat wat = new Wat("Test");
                wat.init();
                System.out.println("wat");
            }
        });
    }
}

@SuppressWarnings("serial")
class Wat extends JFrame {
    public Wat(String title) {
        super(title);
    }

    public void init() {
        JPanel p = new JPanel();
        this.setContentPane(p);

        p.add(new JLabel("Why?"));

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(600, 500);
        this.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:0)

main方法的代码应如下所示

public class Test {
    public static void main(String[] args) {
        Wat wat = new Wat("Test");
        wat.init();
        System.out.println("wat");
    }
}

只需在主线程上运行UI代码即可。从UI启动的长时间运行操作使用单独的线程。请参阅SwingWorker的教程。

答案 1 :(得分:0)

我在Wat类init方法中切换了几行,并在Wat类中添加了一个serialVersionUID。

每次运行时,此代码都会显示一个GUI。

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Wat wat = new Wat("Test");
                wat.init();
                System.out.println("wat");
            }
        });
    }
}

class Wat extends JFrame {

    private static final long   serialVersionUID    = 
            8993350484858673399L;

    public Wat(String title) {
        super(title);
    }

    public void init() {
        JPanel p = new JPanel();
        p.add(new JLabel("Why?"));

        this.setContentPane(p);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(600, 500);
        this.setVisible(true);
    }
}