Java — Что не так с этой простой программой?

#java #swing #jframe

#java #swing #jframe

Вопрос:

 import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Test extends JFrame{

    JLabel label = new JLabel("Leann will come again");
    JButton yesButton = new JButton("Yes");
    JButton noButton = new JButton("Yes");
    JPanel panel = new JPanel();

    public Test(){

        panel.add(label);
        panel.add(yesButton);
        panel.add(noButton);
        add(panel);
        //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addAction();

    }

    public void addAction(){
        yesButton.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent arg0) {
                JOptionPane.showMessageDialog(null, "Are you sure?");               
            }

        });

        noButton.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent arg0) {
                JOptionPane.showMessageDialog(null, "Too bad!");                
            }

        });
    }

    public static void main(String args[]){
        Test app = new Test();

    }

}
  

когда я запускаю это на своем компьютере Ubuntu с eclipse, оно останавливается (завершается) без каких-либо ошибок. В консоли также нет ошибок. И никаких синтаксических ошибок.

Что не так? Это потому, что я запускаю openjdk?

Ответ №1:

Вы не устанавливаете свой фрейм на видимый setVisible(true)

Вам следует ознакомиться с этим руководством:http://download.oracle.com/javase/tutorial/uiswing/components/frame.html

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

1. 1 за самую важную информацию во всех ответах: ссылка на руководство.

Ответ №2:

Вы создаете экземпляр Test, но это все. На самом деле вы никогда не пытаетесь показать это.

При вызове app.setVisible(true) она отобразится, а вызов заблокируется.

Ответ №3:

Вам нужно вызвать setVisible (true) в вашем тестовом экземпляре. Также лучше всего запускать этот код в другом потоке.

 public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            Test app = new Test();
            app.setVisible(true);
        }
    }
}
  

Ответ №4:

Добавьте эту строку в конец вашего конструктора:

 setVisible(true);
  

В противном случае JFrame никогда не отображается и программа завершается. Возможно, вы также захотите раскомментировать setDefaultCloseOperation бит, хотя это не имеет отношения к вашей проблеме.