【问题标题】:How to debug missing frame contents in Java Swing?如何在 Java Swing 中调试丢失的帧内容?
【发布时间】:2015-11-21 08:57:01
【问题描述】:
package me.daniel.practice;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Switch
{
    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Password Login System");
        frame.setSize(400, 100);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setBackground(Color.WHITE);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        JPanel panel = new JPanel();
        JLabel label = new JLabel("Enter Password: ");
        JPasswordField pass = new JPasswordField(10);
        pass.setEchoChar('*');
        pass.addActionListener(new AL());
        panel.add(label, BorderLayout.WEST);
        panel.add(pass, BorderLayout.EAST);
        frame.add(panel);
    }

    private static String password = "daniel";

    static class AL implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            JPasswordField input = (JPasswordField) e.getSource();
            char[] passy = input.getPassword();
            String p = new String(passy);

            if (p.equals(password))
            {
                JOptionPane.showMessageDialog(null, "Correct");
            }
            else
            {
                JOptionPane.showMessageDialog(null, "Incorrect");
            }
        }
    }
}

我想要打开一个框架,在其中显示“输入密码:”的文本,在其右侧,您可以在其中输入密码的文本框。这种情况下的密码是“daniel”。

当您正确输入密码时,会弹出另一个窗口,提示您密码正确。如果不是,则会弹出一个不同的窗口,提示它不正确。但是,当我运行程序时,只显示框架而不显示框架内的实际内容。

【问题讨论】:

  • 我刚刚执行了你的代码,它似乎工作正常(java 7)
  • 可能与您的问题无关,因为线程安全问题引起的错误是随机且微妙的,但您确实应该create your Swing components on the EDT
  • getPassword 返回char 数组是有原因的。为了良好的做法,不要使用String p = new String(passy);:P
  • 你的标题应该描述你的问题。

标签: java swing debugging jframe


【解决方案1】:

你应该在添加内容后让你的框架可见:

  frame.add(panel);
  frame.setVisible(true); // move down here
}

P.S. JPanel 具有默认布局管理器 FlowLayout,因此所有内容都将显示为内联。简而言之,panel.add(label, BorderLayout.WEST) 不会给出预期的输出。

【讨论】:

  • 虽然当然是个好主意,但在这种情况下,可能是首选解决方案,您还可以在框架或内容窗格上使用 revalidaterepaint 来更新 UI。这不是“必须”采取的行动-我知道的挑剔;)
【解决方案2】:

您只需在frame.add(panel); 之后添加frame.validate();

虽然您拥有的代码很可能会工作,但理想情况下,您应该将任何 Java swing 初始化包装到 SwingUtilities.invokeLater(...) 中,以便它在 swing 线程上运行:

  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new Runnable() {
      @Override
      public void run()
      {
        JFrame frame = new JFrame("Password Login System");
        frame.setSize(400, 100);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setBackground(Color.WHITE);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        JPanel panel = new JPanel();
        JLabel label = new JLabel("Enter Password: ");
        JPasswordField pass = new JPasswordField(10);
        pass.setEchoChar('*');
        pass.addActionListener(new AL());
        panel.add(label, BorderLayout.WEST);
        panel.add(pass, BorderLayout.EAST);
        frame.add(panel);
        frame.validate();
      }
    });
  }

有关模式的详细信息,请参阅 oracle 文档here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 2015-12-23
    相关资源
    最近更新 更多