Java Swing GUI不使用多个类显示

时间:2018-08-05 15:38:39

标签: java swing user-interface

我正在使用gridbaglayout制作GUI类,这很好。我想做一个该类的对象,并从我的主类中“派生”它。但是,当我上主课时,什么也没有发生。当我运行GUI类时,将显示GUI。这是怎么回事?

public class GUI extends JFrame {

    JButton btnStart;
    JPanel pnlRadio, pnlMain;
    JLabel lblUsername, lblPassword, lblHerb;
    JTextField txtUsername, txtPassword;
    ButtonGroup btngrHerbs;
    JRadioButton rdbHarralander, rdbRanarr, rdbToadflax;
    GridBagConstraints gbc;

    public GUI() {
        pnlMain = new JPanel();
        pnlMain.setLayout(new GridBagLayout());
        gbc = new GridBagConstraints();

        pnlRadio = new JPanel();

        btnStart = new JButton("Start");
        lblUsername = new JLabel("Username");
        lblPassword = new JLabel("Password");
        txtUsername = new JTextField();
        txtPassword = new JTextField();
        btngrHerbs = new ButtonGroup();
        rdbHarralander = new JRadioButton("Harralander");
        rdbRanarr = new JRadioButton("Ranarr");
        rdbToadflax = new JRadioButton("Toadflax");

        // Some layout stuff for gridbagconstraints, etc

        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.gridwidth = 2;
        pnlMain.add(btnStart, gbc);

        btnStart.addActionListener(e ->{
            synchronized(Main.lock){
                Main.lock.notify();
            }
            this.setVisible(false);
        });

    }

    public JPanel getUI() {
        return pnlMain;
    }

    public static void main(String[] args) throws InvocationTargetException, InterruptedException {

        JFrame frame = new JFrame("Example");
        frame.getContentPane().add(new GUI().getUI());
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);
        frame.pack();

    }
}

然后是主要类:

public class Main {

    static Object lock = new Object();
    static GUI gui = new GUI();

    public static void main(String[] args) {

        synchronized(lock) {
            try {
                lock.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println("A");

    }
}

因此,当我运行GUI类时,什么也没有发生。 GUI会按预期显示,但是当我单击按钮时当然不会发生任何事情。当我启动主类时,GUI甚至都没有出现,我也没有在控制台上打印“ A”。所以似乎在等待那个锁对象被卡住了?

我想要的是主要类,等待按钮被按下,然后将GUI可见设置为false,并将一些值保存在变量中。我该如何实现?

2 个答案:

答案 0 :(得分:1)

要做的第一件事是使您的GUI类完整,因此它显示一个JFrame

    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    add(pnlMain);      //need to add the panel to make it show
    pack();
    setVisible(true);  //need to make frame visible 

应在构造函数中调用(作为构造函数的最后一行添加),并通过

进行测试
public static void main(String[] args) {
    new GUI();
}

答案 1 :(得分:0)

首先,最好在一个线程中问一个问题。

mainGUI类的Main方法是不同的。您还需要JFrame类的那些Main创建代码。

您的第二个问题对我来说还不清楚。