我正在使用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,并将一些值保存在变量中。我该如何实现?
答案 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)
首先,最好在一个线程中问一个问题。
main
和GUI
类的Main
方法是不同的。您还需要JFrame
类的那些Main
创建代码。
您的第二个问题对我来说还不清楚。