在执行我的java程序时我的Jframe是不可见的。在我调整框架大小后,所有字段都是可见的

时间:2016-02-01 12:09:24

标签: java swing

我的Jframe在执行我的java程序时是不可见的。在我调整帧后,所有字段都是可见的。我从eclipse运行java文件后,输出只显示空帧然后我调整窗口的大小所有字段都是可见。

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.table.JTableHeader;

public class DBtoExcel extends JFrame { 

    JLabel l1, l2, l3, l4, l5, l6, l7, l8, l9;
    JTextField tf1, tf2,tf3, tf4, tf5, tf6;
    JButton btn1, btn2, upload ,saveAsExcel;
    //JPasswordField p1, p2;
    JTextArea tf7;
    JTable table;
    JScrollPane scrollPane;
    Vector columnNamesVector;
    Vector dataVector;
    JComboBox combo = new JComboBox();
    JScrollPane pane = new JScrollPane(table);
    Vector<String> v = new Vector<String>();
    DBtoExcel(){
        combo.setEditable(true);
        pack();
        //setContentPane(pane);
        setLocationByPlatform(true);
        setResizable(true);
        setVisible(true);
        setSize(600, 800);

        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("CUSTOMER INFO");

        l1 = new JLabel("Add customer details");
        l1.setForeground(Color.blue);
        l1.setFont(new Font("Serif", Font.BOLD, 20));

        l2 = new JLabel("Firstname:");
        l3 = new JLabel("Secondname:");
        l4 = new JLabel("Contact No:");
        l5 = new JLabel("Email-ID:");
        l6 = new JLabel("Country:");
        l7 = new JLabel("State:");
        l8 = new JLabel("Description:"); 
        l9 = new JLabel("Config upload:"); 
        tf1 = new JTextField();
        tf2 = new JTextField();
        tf3 = new JTextField();
        tf4 = new JTextField();
        //p1 = new JPasswordField();
        //p2 = new JPasswordField();
        tf5 = new JTextField();
       tf6 = new JTextField();
        tf7 = new JTextArea();









            //create table with data
            JTable table = new JTable(dataVector, columnNamesVector);
            JTableHeader header = table.getTableHeader();
            //;





        btn1 = new JButton("Submit");
        btn2 = new JButton("Clear");
        upload = new JButton("Browse");
        saveAsExcel = new JButton("Save as Excel");
       /* btn1.addActionListener(this);
        btn2.addActionListener(this);
        upload.addActionListener(this);
        saveAsExcel.addActionListener(this);*/
        l1.setBounds(100, 30, 400, 30);
        l2.setBounds(80, 70, 200, 30);
        l3.setBounds(80, 110, 200, 30);
        l4.setBounds(80, 150, 200, 30);
        l5.setBounds(80, 190, 200, 30);
        l6.setBounds(80, 230, 200, 30);
        l7.setBounds(80, 270, 200, 30);
        l8.setBounds(80, 310, 200, 30);
        l9.setBounds(80, 400, 200, 30);
        tf1.setBounds(300, 70, 200, 30);
        tf2.setBounds(300, 110, 200, 30);
        tf3.setBounds(300, 150, 200, 30);
        tf4.setBounds(300, 190, 200, 30);
        //p1.setBounds(300, 150, 200, 30);
        //p2.setBounds(300, 190, 200, 30);
        //tf5.setBounds(300, 235, 200, 30);
        //combo.setBounds(300, 235, 200, 30);
        tf6.setBounds(300, 270, 200, 30);
        tf7.setBounds(300, 310, 200, 70);



        upload.setBounds(300, 400, 100, 30);



        btn1.setBounds(170, 450, 100, 30);
        btn2.setBounds(280, 450, 100, 30);
        saveAsExcel.setBounds(450, 450, 150, 30);
        header.setBounds(80, 500, 800, 30);
        table.setBounds(80, 530, 800, 250);
        table.setBackground(Color.pink);
        add(l1);
        add(l2);
        add(tf1);
        add(l3);
        add(tf2);
        //add(l4);
        //add(p1);
        //add(l5);
        //add(p2);
        add(l4);
        add(tf3);
        add(l5);
        add(tf4);
        add(l6);
        //add(tf5);
        add(l7);
        add(tf6);
        add(l8);
        add(tf7);
        add(l9);
        add(btn1);
        add(upload);
        add(btn2);
        add(saveAsExcel);
        add(header);
        add( table );
       //add(pane);


      }
    public static void main(String args[]){
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        }
        catch (Exception ex){
         ex.printStackTrace();
        }
        System.out.println("enter");
    //new Registration();
        new DBtoExcel();
    }
}`

1 个答案:

答案 0 :(得分:3)

尽管已经设置了组件的边界,但组件未显示的原因是因为您以错误的方式并以错误的顺序实现GUI。

  • 首先,除非您有正当理由这样做,否则不建议将类扩展到JFrame,而是可以扩展到JPanel并将自定义JPanel添加到JFrame。您很少需要定制的JFrame。

  • 现在,组件未显示的主要原因是您首先设置JFrame的大小,然后添加组件。 Java绘图管理器在检测到状态更改(例如调整大小/鼠标悬停)时重新绘制JFrame中的所有组件。因此,当您设置JFrame的大小时,它将重新绘制所有组件(在此阶段,在您的情况下,尚未添加任何组件,因此不显示任何组件)。

  • 由于您在设置大小后添加了组件,因此在手动鼠标悬停或调整JFrame大小之前,您无法看到它。您可以在添加所有组件后尝试设置大小,然后您将看到我的意思。 (现在会显示组件,但这不能解决问题的根源。)

你可以有这样的结构:

class MainPanel extends JPanel
{
    //Add your members and components in here..
}

public class MainClass{
    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new MainPanel());
        frame.pack();  //resize, thus repaint will occur here
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

最后但并非最不重要的一点是,您可能希望为容器使用布局。为简单和清楚起见,示出了上述代码。您可能希望在事件调度线程中运行UI。