【问题标题】:Java Swing- Panel not appearing in frameJava Swing-面板未出现在框架中
【发布时间】:2020-11-23 18:59:32
【问题描述】:

我是 swing 新手,我想知道为什么我的登录面板没有出现在框架中。我相信它应该显示在框架的左侧,这是正确的吗?需要更改哪些内容才能使面板出现。谢谢。

这是 GUIFrame 代码

public class GUIFrame extends JFrame {

private static final long serialVersionUID = 1L;

public GUIFrame(){
    Container container = getContentPane();
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Dimension screenDimension = toolkit.getScreenSize();
    setSize(screenDimension.width/2, screenDimension.height/2);
    setLocation(screenDimension.width/4,screenDimension.height/4);

    setLayout(new GridLayout(1,2));
    add(new Login(this));

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}

}

这是面板代码:

public class Login extends JPanel {

private JPanel panel = new JPanel();
private JButton cancel = new JButton("Cancel");
private JButton submit = new JButton("Submit");
private JLabel username_label = new JLabel("Username :");
private JLabel password_label = new JLabel("Password :");
private JTextField username_text = new JTextField();
private JPasswordField password_text = new JPasswordField();
private GUIFrame frame;

public Login(GUIFrame frame){
    this.frame = frame;
    setLayout(new GridLayout(3,2,20,40));
    addComponents();
}

public void addComponents(){
    panel.add(username_label);
    panel.add(username_text);
    panel.add(password_label);
    panel.add(password_text);
    panel.add(cancel);
    panel.add(submit);
}

}

这是显示框架的主要方法:

public class Project {

public static void main(String[] args){
    Project project = new Project();
}

public Project() {
    //Login login = new Login();
    GUIFrame frame = new GUIFrame();
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            frame.setVisible(true);
        }
    });
}

}

【问题讨论】:

  • 您没有显示足够的代码。 Login 的帧字段有什么用? addComponents 是做什么的?请给出一个可运行的例子
  • @Michael 抱歉,已添加代码

标签: java swing


【解决方案1】:
panel.add(username_label);
panel.add(username_text);
panel.add(password_label);
panel.add(password_text);
panel.add(cancel);
panel.add(submit);

您创建了一个单独的 JPanel 并将组件添加到此面板,但您从未将该面板添加到您的登录面板。

您的登录面板已经是 JPanel,因此无需创建另一个 JPanel。

代码应该是:

add(username_label);
add(username_text);
add(password_label);
add(password_text);
add(cancel);
add(submit);

也没有理由将 JFrame 作为参数传递给 Login 类。

另外,您错误地使用了 invokeLater()。所有 Swing 组件都应该在事件调度线程 (EDT) 上创建。因此,您还应该在 invokeLater() 中包含新的 GuiFrame()。

通常不需要单独的 JFrame 类。您的 Project 类中的逻辑应该简单地创建框架的一个实例并将登录面板添加到框架中。换句话说,不要扩展 JFrame。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多