Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing小程序组件在与交互之前是不可见的_Java_Swing_Applet - Fatal编程技术网

Java Swing小程序组件在与交互之前是不可见的

Java Swing小程序组件在与交互之前是不可见的,java,swing,applet,Java,Swing,Applet,我正在尝试制作一个具有简单登录屏幕的小程序,如果我使用普通组件,它可以正常工作,但是如果我使用swing组件,对象在单击之前不会显示。我会使用常规组件,但我需要一个屏蔽密码字段(如果有非swing版本,请让我知道) 我试图在左上角得到一个垂直的位置 public class RdpApplet extends JApplet { JButton Connect; JTextField Username; JPasswordField Password; JLabel Us

我正在尝试制作一个具有简单登录屏幕的小程序,如果我使用普通组件,它可以正常工作,但是如果我使用swing组件,对象在单击之前不会显示。我会使用常规组件,但我需要一个屏蔽密码字段(如果有非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并没有解决问题

编辑2: 增加了其他方法

编辑3:
光标现在在用户名框中开始,但在与交互之前,所有内容都是不可见的。用所有最新建议更新了代码。

也许,当您添加完所有内容后,抛出一个
validate()在那里

EDT上不会调用
Applet.init()
。因此,您需要将Swing组件的构造封装在
SwingUtilities.invokeLater()
中,以确保它们在EDT上运行

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

不要把秋千和AWT混在一起。使用JApplet。

您正在覆盖
绘制方法,而不在其中执行任何操作。这导致小程序的子体根本不会绘制

在Swing中,您通常应该从不覆盖
paint()
方法,而只覆盖
paintComponent()
方法(通常在某个地方调用
super.paintComponent(…)


在小程序中,看起来根本不需要绘制方法,只需删除它。

添加
validate()
面板.验证()在最后的
添加(面板)
之后没有做任何事情。更新了有问题的代码。让我们看看您的绘制方法。也许有些东西你可以调整。补充说,但是我什么都不做。我给你答案是因为如果我删除我的绘画方法,一切都会好起来。你能给出一些示例代码,说明在我的情况下如何在以后使用invoke吗?光标现在从用户名框中开始,但在与之交互之前,所有元素仍然隐藏。啊,刚才说你已经发现了。至少,现在你现在为什么:-)
public class RdpApplet extends Applet {
   JButton Connect;