【问题标题】:How can I make JFrame resize automatically to display all buttons如何让 JFrame 自动调整大小以显示所有按钮
【发布时间】:2010-11-24 17:18:45
【问题描述】:

我有一个简单的摇摆应用程序,它由一个 JLabel 和三个按钮组成。这三个按钮位于它们自己的 JPanel 中,该 JPanel 与 JLabel 一起位于 JFrame 中。 JPanel 使用 flowlayout 管理器水平排列按钮,JFrame 使用 BorderLayout 管理器垂直排列 JLabel 和 JPanel。

我的问题是当我启动应用程序时,在使用过程中,其中一个按钮上的文本会发生变化,从而增加了其宽度。但是,窗口不会调整大小以适应此情况,并且其中一个按钮会消失。我想过再次调用 pack(),但是 JFrame 是我构造函数中的局部变量,而且,我不应该告诉我的程序调整大小,对吧?我无法在谷歌或这里找到任何帮助我的东西,但必须有一个简单的解决方案,我错过了什么?代码如下。

    playButton = new JButton("Play");
    pauseButton = new JButton("Pause");
    stopButton = new JButton("Stop");
    curTrackLabel = new JLabel("No Track Selected");

    JFrame myFrame = new JFrame("MediaPlayer");
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    myFrame.setTitle("MediaPlayer");
    myFrame.setLocation(400,300);

    JPanel topPanel = new JPanel();
    topPanel.setLayout(new BorderLayout());
    myFrame.add(topPanel);
    JPanel buttonPanel = new JPanel(new FlowLayout());

    buttonPanel.add(playButton);
    buttonPanel.add(pauseButton);
    buttonPanel.add(stopButton);
    topPanel.add(buttonPanel, BorderLayout.CENTER);
    topPanel.add(curTrackLabel, BorderLayout.NORTH);

    playButton.addActionListener(new playButtonHandler());
    pauseButton.addActionListener(new pauseButtonHandler());
    stopButton.addActionListener(new stopButtonHandler());

    myFrame.pack();
    myFrame.setVisible(true);

【问题讨论】:

    标签: java swing jframe jpanel layout-manager


    【解决方案1】:

    不妨试试

    ((JFrame)myButton.getTopLevelAncestor()).pack();

    其中 myButton 是在执行期间修改其文本的按钮。

    【讨论】:

    • +1,酷!我今天学习了一种新方法。过去我曾建议 SwingUtilities.windowForComponent(...)。
    【解决方案2】:

    与学习任何 GUI 软件一样,实验是最好的。尝试使用嵌套的 JPanel 来处理 BorderLayouts。

    最终,您将 JPanel 与 BorderLayout 一起使用(流式布局还可以,但实际上在调整窗口大小时,它会严重失败)。请参阅 http://download.oracle.com/javase/tutorial/uiswing/layout/border.html 了解有关 BorderLayouts 的更多信息。

    现在你的布局方案应该是这样的:

    1. 顶级容器:JFrame
    2. JFrame 包含一个 JPanel(调用这个 JPanel 1) 带有 BorderLayout。
    3. 三个按钮应该在一个 分离 jPanel (JPanel 2)。面板 1 应该将三个按钮添加为 边框布局.CENTER。这样, 如果按钮,窗口将调整大小 改变它的宽度和/或高度。
    4. 应将 JLabel 添加为 BorderLayout.LINE_START。

    http://download.oracle.com/javase/tutorial/uiswing/layout/border.html 上的教程应该可以帮助您解决这个问题。但一般情况下,请使用以下内容:

    • 根据需要使用 JPanel 并嵌套 JPanel
    • BorderLayout.CENTER 将适应大小变化---这是关键! (用这个做实验)
    • JFrame 只能用作顶级容器(对于更复杂的 GUI,这是正确的)。

    如果您需要更大的灵活性,请查看 JGoodies:http://www.jgoodies.com/。这更像是创建表单。

    【讨论】:

    • 我实现了您在上面的代码 sn-p 中所说的内容,但是如果我将其中一个按钮的文本变长,则窗口仍然保持相同的大小。我在做任何明显错误的事情吗?无论如何感谢您的解释,为什么 Java 文档不能那么容易阅读:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2019-05-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 2012-10-28
    相关资源
    最近更新 更多