【问题标题】:Swing applet componets are invisable untill interacted withSwing 小程序组件在与之交互之前是不可见的
【发布时间】:2011-02-18 15:54:34
【问题描述】:

我正在尝试制作一个带有简单登录屏幕的小程序,如果我使用普通组件它可以正常工作,但如果我使用摆动组件,则该对象在单击之前不会显示。我会使用常规组件,但我需要一个隐藏的密码字段(如果有非 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: 光标现在从用户名框中开始,但在与之交互之前,一切仍然是不可见的。使用所有最新建议更新了代码。

【问题讨论】:

    标签: java swing applet


    【解决方案1】:

    您正在覆盖paint 方法,而没有在其中执行任何操作。这导致applet的后代根本不被绘制。

    在 Swing 中,您通常应该从不覆盖paint() 方法,只覆盖paintComponent() 方法(并且通常在某处调用super.paintComponent(...)。)

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

    【讨论】:

    • 啊,刚才说你已经发现了。至少,现在你现在为什么 :-)
    【解决方案2】:
    public class RdpApplet extends Applet {
       JButton Connect;
    

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

    【讨论】:

      【解决方案3】:

      也许,当您添加完所有内容后,将validate(); 扔进去?

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

      【讨论】:

      • 在最后的 add(panel) 之后添加 validate();panel.validate(); 没有做任何事情。更新了相关代码。
      • 让我们看看你的绘画方法。也许那里有一些你可以调整的东西。
      • 已添加,但我什么也没做。
      • 我正在给你答案,因为如果我删除我的绘画方法,现在一切正常。
      【解决方案4】:

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

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

      【讨论】:

      • 你能给出一些示例代码,说明如何在我的情况下稍后使用调用吗?
      • 光标现在从用户名框中开始,但所有元素在与之交互之前仍处于隐藏状态。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      相关资源
      最近更新 更多