【问题标题】:Show the hidden JFrame显示隐藏的 JFrame
【发布时间】:2014-12-27 13:48:55
【问题描述】:

当我运行 JFrame 时,它会以隐藏大小显示我。我必须调整大小才能看到 JFrame。 为什么我无法获得完整大小的JFrame。 我用过:Pack(); setVisible(true);,但它不起作用。 这是我的代码:

public class Mytest extends JFrame{
      JLabel label=new JLabel();
      JLabel label2=new JLabel();
      Timer myTimer;
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Mytest().show();

    }

    public Mytest(){
       getContentPane().setLayout(new GridBagLayout());
       setTitle("test");

       GridBagConstraints gridCon=new GridBagConstraints();
       gridCon.gridx=0;
       gridCon.gridy=0;
       getContentPane().add(label,gridCon);

       gridCon.gridx=0;
       gridCon.gridy=1;
       getContentPane().add(label2,gridCon);

       myTimer = new Timer(1000,new ActionListener(){
           public void actionPerformed(ActionEvent e){
               myTimerActionPerformed(e);
           }
       });

        pack();
       myTimer.start();
       setLocationRelativeTo(null);

    }

    private void myTimerActionPerformed(ActionEvent e){
    Date today=new Date();
    label.setText(DateFormat.getDateInstance(DateFormat.FULL).format(today));
    label2.setText(DateFormat.getTimeInstance().format(today));

    }

}

【问题讨论】:

    标签: java swing netbeans jframe


    【解决方案1】:

    有两个基本问题...

    第一个是,当您创建和添加JLabels 时,它们没有内容,因此它们的首选大小是0x0...

    第二种是pack的使用,来自JavaDocs

    调整此窗口的大小以适合首选大小和布局 的子组件。结果窗口的宽度和高度是 如果任一尺寸小于 上一次调用 setMinimumSize 指定的最小尺寸 方法。

    如果窗口和/或其所有者不可显示 然而,在计算 首选尺寸。窗口在其大小被验证后被验证 计算出来的。

    所以,基本上,您添加了两个标签,它们的总组合大小为 0x0pack 完全按照设计的方式进行包装,以满足布局管理器的要求。

    在调用pack之前需要给标签的值播种,例如,添加一个更新标签的方法,例如...

    public void updateLabels() {
        Date today = new Date();
        label.setText(DateFormat.getDateInstance(DateFormat.FULL).format(today));
        label2.setText(DateFormat.getTimeInstance().format(today));
    }
    

    然后在你的构造函数中,在你调用pack之前,调用这个方法……

    updateLabels();
    pack();
    myTimer.start();
    setLocationRelativeTo(null);
    

    (您还应该从Timers actionPerformed 方法调用此updateLabels 方法以保持一致)。

    这将为标签添加一些内容,pack 和布局管理器可以使用这些内容来确定窗口的大小...

    您还应该使用setVisible 而不是show,因为show 已被弃用,将来可能会被删除

    【讨论】:

    • 非常感谢您的详细解答,很多事情都清楚了
    • 1+ 疯了,问你一个问题:你有任何公共存储库 Swing 程序可供人们(例如我)分析和学习吗?谢谢!
    • @HovercraftFullOfEels 是的,这叫堆栈溢出;)
    • @HovercraftFullOfEels 另一个问题是,什么值得投入其中?
    • 我关心的是我的编程知识。我感觉我对Java GUI小程序理解的很好,但是对于大型真实程序的结构和联系还是一窍不通,所以正在寻找更大的程序的例子来学习。
    【解决方案2】:

    你可以像这样最大化框架:

    setExtendedState(JFrame.MAXIMIZED_BOTH); 
    

    或者您可以根据您的要求调整框架大小,例如

    setSize(500,500);
    

    你必须添加下面的语句,因为我在你的代码中看不到这个

    setVisible(true);
    

    【讨论】:

    • 与 setExtendedState(JFrame.MAXIMIZED_BOTH);我得到了全屏 JFrame,是否有可能像:setSize(500,500)?
    • @Dirak - 是的,当然你可以根据你提到的要求调整大小
    • 是的,它适用于代码:setSize(500,500); setVisible(true);
    • 问题是,pack 应该可以工作。节目可能没有做 setVisible 所做的事情
    猜你喜欢
    • 2011-05-16
    • 2012-11-21
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多