Swing Class,JLabel外观不寻常

时间:2017-07-30 08:38:37

标签: java swing user-interface

我注意到以下代码中我认为奇怪的东西:

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。

有人可以向我解释一下吗?

1 个答案:

答案 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