2016-12-18 86 views
1

这是我使用swing创建窗口的代码。为什么我的组件不可见?

我可以看到已定义大小的窗口,但窗口中没有任何组件。为什么组件不可见?

我有单独的方法用于创建,初始化和添加组件。这些方法是从构造函数调用的。标题和定义大小的窗口在输出中可见。我错过了什么?

package swing_basics; 

import java.awt.FlowLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 

public class MySwingDemo extends JFrame { 

    JLabel lblName, lblPassword; //Declaration of variables 
    JTextField txtfName; 
    JPasswordField pwdfPassword; 
    JButton btnSubmit, btnCancel, btnReset; 

    public void createComponents(){ //method to initialise the components 

     lblName = new JLabel(); 
     lblPassword = new JLabel(); 
     txtfName = new JTextField(); 
     pwdfPassword = new JPasswordField(); 
     btnSubmit = new JButton(); 
     btnCancel = new JButton(); 
     btnReset = new JButton(); 
    } 

    public void setComponents(){ //method to set the components 
     setVisible(true); 
     setSize(400, 400); 
     setTitle("My Swing Demo"); 
     setLayout(new FlowLayout()); 

     lblName.setText("Name"); 
     lblPassword.setText("Password"); 

     txtfName.setText("Name");// try 

     pwdfPassword.setText("Password"); 

     btnSubmit.setText("Submit"); 
     btnCancel.setText("Cancel"); 
     btnReset.setText("Reset"); 
    } 

    public void addComponents(JFrame frame){ //method to add the components 
     frame.add(lblName); 
     frame.add(txtfName); 

     frame.add(lblPassword); 
     frame.add(pwdfPassword); 

     frame.add(btnSubmit); 
     frame.add(btnCancel); 
     frame.add(btnReset); 
    } 

    public static void main(String[] args) { 
     new MySwingDemo(); 
    } 

    public MySwingDemo() { //Constructor 
     createComponents(); 
     setComponents(); 
     addComponents(this); 
    } 

} 

回答

3

这是操作的,你设置frame可见您添加(和设置)之前,你的组件的顺序。在之后,请将setVisible(true);移至您已设置好组件。 ,请确保您致电addComponents(this);之前您拨打setComponents();

public MySwingDemo() { // Constructor 
    createComponents(); 
    addComponents(this); 
    setComponents(); 
} 

我还想添加默认frame关闭操作

public void setComponents() { // method to set the components 
    setSize(400, 400); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    setTitle("My Swing Demo"); 
    setLayout(new FlowLayout()); 

    lblName.setText("Name"); 
    lblPassword.setText("Password"); 

    txtfName.setText("Name");// try 

    pwdfPassword.setText("Password"); 

    btnSubmit.setText("Submit"); 
    btnCancel.setText("Cancel"); 
    btnReset.setText("Reset"); 
    setVisible(true); 
}