2010-11-24 44 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