如何使JFrame自动调整大小以显示所有按钮

时间:2010-11-24 17:18:46

标签: java swing jframe jpanel layout-manager

我有一个简单的swing应用程序,它包含一个JLabel和三个按钮。这三个按钮位于自己的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);

2 个答案:

答案 0 :(得分:5)

也许试试

((JFrame的)myButton.getTopLevelAncestor())包();

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

答案 1 :(得分:1)

与学习任何GUI软件一样,实验也是最好的。尝试使用嵌套的JPanels搞乱BorderLayouts。

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

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

  1. 顶级容器:JFrame
  2. JFrame包含一个JPanel(调用它 JPanel 1)带有BorderLayout。
  3. 三个按钮应该在一个 SEPARATE jPanel(JPanel 2)。的JPanel 1应该将三个按钮添加为 BorderLayout.CENTER。通过这种方式, 如果按钮,窗口将调整大小 改变它的宽度和/或正好。
  4. JLabel应该添加为 BorderLayout.LINE_START。
  5. 以下教程:http://download.oracle.com/javase/tutorial/uiswing/layout/border.html可以帮助您解决此问题。但一般来说,请使用以下内容:

    • 根据需要使用JPanel并嵌套JPanel
    • BorderLayout.CENTER可以容纳尺寸变化---这是关键! (试验这个)
    • JFrame只能用作顶级容器(对于更复杂的GUI,这是真的)。​​

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