2012-06-13 29 views
5

我一直在嘗試幾個小時才找到解決問題的方法,但是我沒有這樣的運氣。下面是一個示例代碼:在JPanel上使用JScrollPane時沒有出現

import java.awt.BorderLayout; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 

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

    public Example() 
    { 
     JPanel contentPane = (JPanel) getContentPane(); 
     contentPane.setLayout(new BorderLayout()); 

     JPanel panTop = new JPanel(new BorderLayout()); 
     //JPanel panBottom = new JPanel(new BorderLayout()); 

     JPanel panTopCenter = new JPanel(); 
     //JPanel panTopLeft = new JPanel(); 
     //JPanel panTopRight = new JPanel(); 

     panTop.add(panTopCenter, BorderLayout.CENTER); 
     //panTop.add(panTopLeft, BorderLayout.WEST); 
     //panTop.add(panTopRight, BorderLayout.EAST); 

     contentPane.add(panTop, BorderLayout.CENTER); 
     //contentPane.add(panBottom, BorderLayout.SOUTH); 

     JPanel pan = new JPanel(); 
     pan.setLayout(new BoxLayout(pan, BoxLayout.Y_AXIS)); 
     for(int i = 0; i < 50; i++) pan.add(new JButton("Button " + i)); 
     JScrollPane scrollPane = new JScrollPane(pan); 
     panTopCenter.add(scrollPane); 

     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     {   
      @Override 
      public void run() 
      { 
       new Example(); 
      } 
     }); 
    } 
} 

快照:

enter image description here

+0

不要使用'BoxLayout',請嘗試'GridLayout',如[示例]所示(http://stackoverflow.com/questions/10331129/jscrollpane-resize-containing-jpanel-when-scrollbars-appear/ 10333957#10333957),因爲在'GridLayout'中,所有'JButton'的大小相同,不像'BoxLayout',其大小由其中的文本決定。 –

回答

7

我總是必須像這樣設置視口的首選大小。

import java.awt.*; 
import javax.swing.*; 

public class Example extends JFrame { 

    public Example() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     Box box = new Box(BoxLayout.Y_AXIS); 
     for (int i = 0; i < 50; i++) { 
      box.add(new JButton("Button " + i)); 
     } 
     JScrollPane sp = new JScrollPane(box); 
     Dimension d = new Dimension(box.getComponent(0).getPreferredSize()); 
     sp.getVerticalScrollBar().setUnitIncrement(d.height); 
     d.height *= 10; // Show at least 10 buttons 
     sp.getViewport().setPreferredSize(d); 

     add(sp, BorderLayout.CENTER); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       Example e = new Example(); 
      } 
     }); 
    } 
} 
+2

你也可以實現'Scrollable'。 – trashgod

3

必須設置的優選尺寸,在的情況下JScrollPane是在容器或頂級單JComponent容器。

scrollPane.setPreferredSize(new Dimension(100,500)); 
更好

是使用GridLayout相同類型的JComponent秒。

+0

但是當我這樣做時,'panTopCenter'將具有一個靜態大小,並且在擴大JFrame大小時不會動態放大。 –

+0

[那麼這可能是正確的方式](http://stackoverflow.com/a/5760093/714968) – mKorbel

+0

我認爲你可以改變視口的大小像[這裏](http://stackoverflow.com/a/11016543/ 261156)。 –

7

請勿設置任何尺寸!如果進行了此更改,則會出現滾動條。

JPanel panTopCenter = new JPanel(new GridLayout()); 

的基本問題是,FlowLayout將顯示在顯示它所需的最小尺寸的部件,以及用於滾動窗格,即(判定爲)爲0x0。通過在構造函數中使用沒有參數的GridLayout並將滾動窗格添加爲唯一組件,它將被強制填充可用空間。

+1

+1 IIUC,問題在於,由此產生的視口首選大小是笨重的(可能)L&F依賴。我會主張實現'getPreferredScrollableViewportSize()'。 – trashgod

+0

@trashgod我可以看到可能需要設置首選視圖端口大小的情況,但我總是對「set ** any ** size」非常謹慎。在耗盡其他可能的可能性之後,這只是我所期待的。 –

+0

@我承認,我不太明白這個問題+1可能是正確的答案 – mKorbel

0

最好的解決方案,快速簡單,使用SwingX的JXPanel,它是準標準的,實現了Scrollable