Программа завершается немедленно, когда задействован графический интерфейс

#java #user-interface #terminate

#java #пользовательский интерфейс #прекратить

Вопрос:

При попытке запустить следующий код в Eclipse он завершается почти сразу без сообщения (только то, что значение выхода равно -1073740940), но любой java-код, который не содержит элементов GUI, работает нормально. При запуске с помощью отладчика он достигает строки «new Runnable», а затем завершается, но окно графического интерфейса никогда не появляется. Графические интерфейсы некоторое время назад работали нормально, но в какой-то момент они перестали работать, и я понятия не имею, почему.

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

Ответ №1:

Код для метода main должен выглядеть следующим образом

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

Просто запустите код пользовательского интерфейса в основном потоке. Используйте отдельные потоки для длительных операций, запущенных из пользовательского интерфейса. См. Руководство по SwingWorker.

Комментарии:

1. Да, происходит то же самое

2. Вы используете неправильный файл или что-то в этом роде. Код правильный.

3. Определенно не запускаю неправильный файл, просто по какой-то причине он ничего не делает. Если я добавлю println перед созданием графического интерфейса, который отображается в консоли, но графический интерфейс по-прежнему отсутствует, поэтому код выполняется.

Ответ №2:

Я поменял местами пару строк в методе инициализации класса Wat и добавил serialVersionUID в класс Wat.

Этот код вызывает графический интерфейс каждый раз, когда я его запускаю.

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