【问题标题】:Java Swing GUI not showing using multiple classesJava Swing GUI 未显示使用多个类
【发布时间】:2018-08-05 15:38:39
【问题描述】:

我正在使用 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 并将一些值保存在变量中。我怎样才能做到这一点?

【问题讨论】:

  • 调用pack() 之前 setVisible(); event dispatch thread 上构造和操作 Swing GUI 对象。
  • 摆脱所有同步/锁定逻辑。没必要。

标签: java swing user-interface


【解决方案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();
}

【讨论】:

    【解决方案2】:

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

    GUIMain 类中的 main 方法不一样。您还需要那些 JFrameMain 类中创建代码。

    你的第二个问题我不清楚。

    【讨论】:

      猜你喜欢
      • 2022-07-12
      • 1970-01-01
      • 2016-02-16
      • 2012-04-18
      • 2011-06-24
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多