每次在NetBeans上运行时,我的用户界面上的对象都会更改外观。为什么?

时间:2015-07-03 18:36:43

标签: java netbeans

我在NetBeans上编写了一个非常基本的用户界面,它有一个Frame,一个标签作为框架中的标题,以及一个面板。该面板将包含标签和文本字段。我在面板中编写了前两个标签(Employee IDID Number)和文本字段(txtempidtxtidno),但现在我的问题是每次运行要测试它的应用,有时标签和文字字段都会显示,有时只显示Employee ID个展示,没有其他内容,其他时间只显示Employee IDtxtempid,或者只显示txtidno显示或一切显示正常。每次运行应用程序时,该面板中的对象都会以上述方式之一显示。我检查了我的编码,没有错误或警告,这一切似乎都是100%。可能导致这种现象的原因是什么?

以下是此界面的编码:

import java.awt.*;
import javax.swing.*;

public class empManUI  
{
    public empManUI()
    { }

    public void layout ()
    {
        JFrame empManipulate = new javax.swing.JFrame();
        empManipulate.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        empManipulate.setSize(720,520);
        empManipulate.setVisible(true);
        JPanel panel = new javax.swing.JPanel();
        panel.setLocation(230, 80);
        panel.setSize(450,310);
        panel.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        panel.setLayout(null);
        panel.setVisible(true);
        empManipulate.add(panel);
        empManipulate.setLayout(null);

        JLabel lbltitle = new javax.swing.JLabel();
        lbltitle.setText("Employees");
        lbltitle.setFont(new java.awt.Font("Excelerate", 1, 42));
        lbltitle.setBounds(60, 0, 620, 70);
        lbltitle.setForeground(Color.RED);
        empManipulate.add(lbltitle);
        JLabel lblemp = new javax.swing.JLabel();
        lblemp.setText("Employee ID: ");
        lblemp.setFont(new java.awt.Font("Alexis", 1, 18));
        lblemp.setBounds(20, 30, 170, 13);
        lblemp.setVisible(true);
        panel.add(lblemp);
        JTextField txtempid = new javax.swing.JTextField();
        txtempid.setBounds(200, 20, 230, 30);
        txtempid.setVisible(true);
        panel.add(txtempid);        
        JLabel lblidno = new javax.swing.JLabel();
        lblidno.setText("ID Number: ");
        lblidno.setFont(new java.awt.Font("Alexis", 1, 18));
        lblidno.setBounds(20, 60, 170, 13);
        lblidno.setVisible(true);
        panel.add(lblidno);
        JTextField txtidno = new javax.swing.JTextField();
        txtidno.setBounds(200, 50, 230, 30);
        txtidno.setVisible(true);
        panel.add(txtidno);
    }

    public static void main (String[]args)
    {
        empManUI empUI = new empManUI();
        empUI.layout();
    }
}

1 个答案:

答案 0 :(得分:2)

尝试使用以下内容替换main

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            empManUI empUI = new empManUI();
            empUI.layout();
        }
    });
}

看看它是否更好。

Swing 特殊。您不能像运行命令行程序一样从main运行它。您需要以这样的方式启动它,即GUI操作在AWT事件队列中排队并由Dispatch线程处理。您可以通过拨打javax.swing.SwingUtilities.invokeLater(...)java.awt.EventQueue.invokeLater(...)

来执行此操作