2

我有一个简单的摇摆应用程序,它由一个 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);
4

2 回答 2

5

也许试试

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

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

于 2010-11-24T18:05:26.510 回答
1

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

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

现在对于您的布局方案,它应该类似于以下内容:

  1. 顶级容器:JFrame
  2. JFrame 包含一个带有 BorderLayout 的 JPanel(称之为 JPanel 1)。
  3. 这三个按钮应该在一个单独的 jPanel (JPanel 2) 中。JPanel 1 应将三个按钮添加为 BorderLayout.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/ 。这更像是创建表单。

于 2010-11-24T17:56:05.513 回答