【问题标题】:Program terminates immediately when GUI's are involved当涉及 GUI 时程序立即终止
【发布时间】:2018-10-22 21:52:17
【问题描述】:

当尝试在 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);
    }
}

【问题讨论】:

    标签: java user-interface terminate


    【解决方案1】:

    main方法的代码应该是这样的

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

    简单地说,在主线程上运行 UI 代码。对从 UI 开始的长时间运行的操作使用单独的线程。请参阅SwingWorker 的教程。

    【讨论】:

    • 是的,完全一样的事情发生
    • 您正在运行错误的文件或其他内容。代码是正确的。
    • 肯定没有运行错误的文件,只是出于某种原因它什么也没做。如果我在创建显示在控制台中的 GUI 之前添加一个 println,但 GUI 仍然没有,那么代码正在运行。
    【解决方案2】:

    我在 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多