2012-02-07 23 views
2

我有以下代碼:如何將一個BorderLayout的中心中使用JScrollPane的

package example; 

    import java.awt.BorderLayout; 
    import java.awt.FlowLayout; 

    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JPanel; 
    import javax.swing.JScrollPane; 

    public class ScrollingExample extends JFrame 
    { 
     private static final long serialVersionUID = 1L; 

     public static void main(String[] args) 
     { 
      ScrollingExample scrollingExample = new ScrollingExample(); 
      scrollingExample.go(); 
     } 

     private void go() 
     { 
      JPanel topPanel = new JPanel(); 
      topPanel.add(new JLabel("boo")); 

      JPanel mainPanel = new JPanel(); 
      JPanel mainInnerPanel = makeMainInnerPanel(); 

      JScrollPane scrollPane = new JScrollPane(mainInnerPanel); 
      mainPanel.add(scrollPane); 
      add(topPanel, BorderLayout.NORTH); 
      add(mainPanel, BorderLayout.CENTER); 

      pack(); 
      setVisible(true); 
     } 

     private JPanel makeMainInnerPanel() 
     { 
      JPanel row1 = makeHorizontalPanel("one", "two", "three", "four", "five"); 
      JPanel row2 = makeHorizontalPanel("six", "seven", "eight"); 
      JPanel row3 = makeHorizontalPanel("nine", "ten", "eleven"); 
      JPanel mainInnerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
      mainInnerPanel.add(row1); 
      mainInnerPanel.add(row2); 
      mainInnerPanel.add(row3); 
      return mainInnerPanel; 
     } 

     private JPanel makeHorizontalPanel(String ... labelValues) 
     { 
      JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
      for (String s : labelValues) 
      { 
       JLabel label = new JLabel(s); 
       panel.add(label); 
      } 
      return panel; 
     } 
    } 

當我展示它,它本身尺寸顯示所有的標籤;當我調整窗口大小時,我無法看到滾動條。

當我得到這個工作時,我想做一個包含JTabbedPane和幾個按鈕的面板,如果用戶調整了窗口的大小,以至於無法看到它的某個部分,我想讓它具有滾動條。如果這個問題的答案需要額外的或不同的做法,提到它將不勝感激。

回答

3
import java.awt.BorderLayout; 
import java.awt.FlowLayout; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

public class ScrollingExample extends JFrame 
{ 
    private static final long serialVersionUID = 1L; 

    public static void main(String[] args) 
    { 
     ScrollingExample scrollingExample = new ScrollingExample(); 
     scrollingExample.go(); 
    } 

    private void go() 
    { 
      setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     JPanel topPanel = new JPanel(); 
     topPanel.add(new JLabel("boo")); 

     JPanel mainPanel = new JPanel(new BorderLayout()); 
     JPanel mainInnerPanel = makeMainInnerPanel(); 

     JScrollPane scrollPane = new JScrollPane(mainInnerPanel); 
     mainPanel.add(scrollPane); 
     add(topPanel, BorderLayout.NORTH); 
     add(mainPanel, BorderLayout.CENTER); 

     pack(); 
     setVisible(true); 
    } 

    private JPanel makeMainInnerPanel() 
    { 
     JPanel row1 = makeHorizontalPanel("one", "two", "three", "four", "five"); 
     JPanel row2 = makeHorizontalPanel("six", "seven", "eight"); 
     JPanel row3 = makeHorizontalPanel("nine", "ten", "eleven"); 
     JPanel mainInnerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
     mainInnerPanel.add(row1); 
     mainInnerPanel.add(row2); 
     mainInnerPanel.add(row3); 
     return mainInnerPanel; 
    } 

    private JPanel makeHorizontalPanel(String ... labelValues) 
    { 
     JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
     for (String s : labelValues) 
     { 
      JLabel label = new JLabel(s); 
      panel.add(label); 
     } 
     return panel; 
    } 
} 
+0

@mKorbel我實際上是要刪除我的答案後(花了我10分鐘後)&我注意到你已經在那裏。都很好。 :) – 2012-02-07 17:21:32

+0

顯然,它只是在要滾動的面板上的FlowLayout。我錯過了其他什麼嗎? – arcy 2012-02-07 18:38:22

+0

不是我能看到的。 「BorderLayout」(帶有「CENTER」約束)或「GridLayout」可以將孩子拉伸到所需的大小。 – 2012-02-07 18:43:05

3

JPanel默認情況下爲FlowLayout,您必須準確定義(如果您想更改LayoutManager),JComponent已經實現了各種佈局管理器。 JFrame/JDialog /JWindow(從Java5中)在默認情況下

mainPanel.setLayout(new Borderlayout(10, 10)) 
+0

我不認爲我想mainPanel中有BorderLayout的 - 我想的框架具有的borderlayout,並mainPanel中在框架的中心去。 FlowLayout應該適合中心的面板,我想在調整框架時調整大小,不是嗎? – arcy 2012-02-07 17:07:20

+0

'我想框架有borderLayout' ---> JFrame有默認的BorderLayout,只放'myFrame.add(不管,B​​orderlayout.CENTER)','FlowLayout .....我想在調整框架大小時調整大小' ---> FlowLayout將被忽略JFrame調整大小 – mKorbel 2012-02-07 17:13:37

+0

好吧,如果我將mainPanel設置爲BoxLayout,那麼滾動條顯示。滾動條在FlowLayout面板上不起作用嗎?這是寫在我錯過的地方嗎?是否有其他版面管理器不適用?有很多例子,但爲了理解發生了什麼,在做一些沒有任何例子涵蓋的事情時,(也)有很好的概念原則可以遵循...... – arcy 2012-02-07 17:14:10

5

您需要允許滾動窗格增長/收縮窗口大小的變化有Borderlayout

不需要「mainPanel」。

只需使用:

// add(mainPanel, BorderLayout.CENTER); 
add(scrollPane, BorderLayout.CENTER);