2010-11-24 43 views
2

我有一个简单的swing应用程序,它由一个JLabel和三个按钮组成。这三个按钮与JLabel一起位于JFrame中的JPanel中。 JPanel使用flowlayout管理器水平排列按钮,JFrame使用BorderLayout管理器垂直排列JLabel和JPanel。如何让JFrame自动调整大小以显示所有按钮

我的问题是当我启动应用程序时,在使用过程中,其中一个按钮的文本更改增加其宽度。但是,该窗口不会调整大小以适应此并且其中一个按钮消失。我想过再次调用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); 

回答

5

也许尝试

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

其中myButton是在执行过程中修改文本的按钮。

+0

+1,cool!我今天学习一种新方法。在过去,我建议SwingUtilities.windowForComponent(...)。 – camickr 2010-11-24 20:12:11

1

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

最后,你用一个BorderLayout使用JPanel(流布局是好的,但当调整窗口大小时,它实际上失败了)。请参阅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。

该教程在:http://download.oracle.com/javase/tutorial/uiswing/layout/border.html应该可以帮到你。但在一般情况下,使用以下命令:

  • 使用JPanel并在必要时
  • BorderLayout.CENTER将容纳尺寸变化巢JPanels ---这是关键! (试验这个)
  • JFrame只能用作顶级容器(对于更复杂的GUI,这是真的)。

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

+0

我在上面的代码片段中实现了你所说的内容,但是如果我使按钮的文本长一些,窗口仍然保持相同的大小。我做什么显然是错的?无论如何,感谢您的解释,为什么不能像Java文档那样容易阅读:P – CalumMcCall 2010-11-24 21:00:58