Swing applet组件在与之交互之前是不可见的

时间:2011-02-18 15:54:34

标签: java swing applet

我正在尝试使用简单的登录屏幕创建一个applet,如果我使用普通组件它可以正常工作但是如果我使用swing组件,则该对象在单击之前不会显示。我会使用常规组件,但我需要一个蒙面密码字段(如果有非摇摆版本请告诉我。)

我想在左上角放置一个垂直位置。

public class RdpApplet extends JApplet {
   JButton Connect;
   JTextField Username;
   JPasswordField Password;
   JLabel UsernameLabel;
   JLabel PasswordLabel;

   //(Snip)

   public void paint(Graphics g){
   }
   public void start(){
   }
   public void stop(){
   }
   public void init(){
       SwingUtilities.invokeLater(new Runnable() {
        public void run() {
           JPanel panel = new JPanel (new GridBagLayout());
           GridBagConstraints gbc = new GridBagConstraints();
           gbc.insets = new Insets(2,5,1,1);
           gbc.weightx = 1.0;
           gbc.anchor = GridBagConstraints.WEST;
           gbc.gridwidth = GridBagConstraints.REMAINDER;

           UsernameLabel = new JLabel("Username:");
           panel.add(UsernameLabel,gbc);

           Username = new JTextField(15);
           panel.add(Username,gbc);

           PasswordLabel = new JLabel("Password:");
           panel.add(PasswordLabel,gbc);

           Password = new JPasswordField(15);
           panel.add(Password,gbc);

           Connect = new JButton("Connect");
           panel.add(Connect,gbc);
           gbc.weighty = 1.0;
           gbc.anchor = gbc.NORTHWEST;

           setLayout(new FlowLayout(FlowLayout.LEFT));
           add(panel);
           validate();
           panel.validate();
       }});
   }

   //(Snip)
}

如果我使用JButton和JTextField以及JLabel这些项目在我与它们交互之前不显示(单击文本字段,鼠标悬停按钮,我无法显示标签)并且如果我使用正常版本我在标签周围得到了丑陋的灰色背景。

任何人都可以帮助告诉我我做错了什么让一切正常。

编辑: 从Applet更改为JApplet并没有解决问题。

EDIT2: 添加了其他方法。

EDIT3: 光标现在从用户名框开始,但在与之交互之前,所有内容仍然不可见。更新了包含所有最新建议的代码。

4 个答案:

答案 0 :(得分:2)

public class RdpApplet extends Applet {
   JButton Connect;

不要将Swing与AWT混合使用。使用JApplet。

答案 1 :(得分:2)

你正在覆盖paint方法而不做任何事情。这导致小程序的后代根本没有被绘制。

在Swing中,您通常永远不会覆盖paint()方法,只覆盖paintComponent()方法(通常会在某处调用super.paintComponent(...)。)

在您的小程序中,您似乎根本不需要绘制方法,只需将其删除即可。

答案 2 :(得分:1)

也许,当你完成添加所有内容后,在其中抛出一个validate();

http://download.oracle.com/javase/6/docs/api/java/awt/Container.html#validate%28%29

答案 3 :(得分:1)

在EDT上没有调用Applet.init()。因此,您需要在SwingUtilities.invokeLater()中包含Swing组件的构造,以确保它们在EDT上运行。

public void init() {
    SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            // Init code goes here
        }});
}