【问题标题】:JLabel doesn't show up until you maximize my frame在您最大化我的框架之前,JLabel 不会出现
【发布时间】:2018-01-28 21:59:28
【问题描述】:

我一直在寻找这种情况,但显然对此没有其他问题,所以,我开始了。

我正在制作一个需要制作 JFrame 的学校项目,尽管我在 ActionEvents 上度过了一段糟糕的时光,但我终于可以让它工作了,所以在我的 JFrame 中获得了一些我需要的信息之后一个 JLabel 是一个答案,嗯,它确实如此,唯一的事情是在我单击按钮后什么都没有发生,但是当我最大化或调整窗口本身时它会发生。

    button1= new JButton("Add user");
    button1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
           user= input1.getText();
        if(user.isEmpty()){
        JOptionPane.showMessageDialog(null, "you have an error there!");
        }
        else {
        output2 = new JLabel("thx for registering, "+user);
        output2.setBounds(10,40,150,20);
        panel.add(output2);
        }
    }
    });
    button1.setBounds(310,10,140,20);
    panel.add(button1);

【问题讨论】:

    标签: java swing jlabel maximize


    【解决方案1】:

    不要使用 setBounds()。 Swing 被设计为与布局管理器一起使用,因此让布局管理器确定组件的大小/位置。阅读 Layout Managers 上的 Swing 教程,了解一些可帮助您入门的示例。

    当您将组件添加到可见 GUI 时,基本代码应该是:

    panel.add(...);
    panel.revalidate();
    panel.repaint();
    

    revalidate() 将调用布局管理器为组件指定大小/位置。 repaint() 确保所有组件都被绘制。

    【讨论】:

    • 好吧,我尝试在没有 .setBounds() 的情况下工作并添加您给我的内容,.revalidate() 不起作用,所以我尝试使用 validate() + repaint(),但它没用,所以我重新设置了所有 setBounds() 加上 validate() 和 repaint() 并且它工作正常,非常感谢。
    • 不听建议的时候为什么要问问题?如果您使用布局管理器,它将起作用!!!!此外,该方法是 revalidate() 而不是 validate()。 revalidate() 用于 Swing, validate() 用于 AWT。是的,它可能在大多数情况下都有效,但再次学习使用 Swing 的设计方式。使用您当前的 hack,它可能适用于一个简单的程序,但是一旦程序变得更加复杂,您需要了解 Swing 的工作原理,这样您就不会遇到设计问题。
    • 我给了你答案,然后 13 分钟后你说它不起作用。没有足够的时间阅读教程、下载工作代码、了解代码如何工作,然后重新构建现有代码。所以我的观点是你走捷径,没有花时间学习有效地使用 Swing,这会在未来给你带来问题。您可以现在花时间学习 Swing,也可以稍后取消学习,这将需要更多时间。
    猜你喜欢
    • 2012-09-14
    • 2012-02-13
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多