我注意到以下代码中我认为奇怪的东西:
public class QuestionFour extends JFrame {
private JTextArea txta1;
private JTextField txt1;
private JButton btnSort;
private JButton btnShuffle;
private JButton btnReverse;
private JPanel pnl1;
private JLabel lbl1;
private LinkedList linkedList;
public QuestionFour() {
super();
this.setLocationRelativeTo(null);
this.setSize(500, 200);
this.setVisible(true);
this.setLayout(new FlowLayout());
txt1 = new JTextField(); // 1
lbl1 = new JLabel("Enter a number: "); // 2
this.add(lbl1);
}
public static void main(String args[]) {
QuestionFour ob = new QuestionFour();
}
}
正在发生的问题是,当我运行代码时,JLabel没有出现但是如果我注释掉键入1作为注释的行,则出现JLabel,我认为这是奇怪的,因为我只实例化了TextField但是没有t将它添加到JFrame。
有人可以向我解释一下吗?
答案 0 :(得分:0)
可能是由于在UI线程之外调用setVisible(true)
引起的异常。试试这个:
public QuestionFour()
{
setLocationRelativeTo(null);
this.setSize(500, 200);
setLayout(new FlowLayout());
this.txt1 = new JTextField(); // 1
this.lbl1 = new JLabel("Enter a number: "); // 2
this.add(this.lbl1);
javax.swing.SwingUtilities.invokeLater(() -> setVisible(true));
}
注意:必须在Event Dispatching Thread(UI线程)中完成对任何UI组件(例如JTextField
等)的读/写访问。 SwingUtilities
为您提供了方便的方法。您也应该在EDT中调用setVisible()
。
另一个问题是,您在开始时调用setVisible(true)
,然后添加UI组件。这表示"写访问"到UI组件("你要在主面板中添加一些内容")。您的类构造函数不在EDT中运行,因此在这种情况下,您必须将this.add(this.lbl1)
封装到SwingUtilities
的方法中。但是,当您首先构建整个UI然后最终将其设置为可见时,它会更好。
有关Swing库和线程安全的更多信息,请查看以下内容:https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html