2014-04-08 83 views
2

如何設置包含JScrollPane的容器的大小以便滾動條不出現?設置包含JScrollPane的容器的大小,使滾動條不可見

考慮這個SSCCE(使用MigLayout):

public static void main(String[] args) { 

    JPanel panel = new JPanel(new MigLayout()); 

    for(int i = 0; i < 15; i++) { 
     JTextArea textArea = new JTextArea(); 
     textArea.setColumns(20); 
     textArea.setRows(5); 
     textArea.setWrapStyleWord(true); 
     textArea.setLineWrap(true); 
     JScrollPane jsp = new JScrollPane(textArea); 

     panel.add(new JLabel("Notes" + i)); 
     panel.add(jsp, "span, grow"); 
    } 
    JScrollPane jsp = new JScrollPane(panel); 


    JFrame frame = new JFrame(); 
    frame.add(jsp); 
    frame.pack(); 
    frame.setSize(jsp.getViewport().getViewSize().width, 500); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

正如你所看到的,我試圖找出放什麼在這條線:

frame.setSize(jsp.getViewport().getViewSize().width, 500); 

的目標是建立相對於視口內容的寬度,以便不需要水平滾動條。

enter image description here

應該是:

enter image description here

編輯:繼camikr的建議,這是結果:

public static final int pref_height = 500; 
public static void main(String[] args) { 

    JPanel panel = new JPanel(new MigLayout()); 

    for(int i = 0; i < 15; i++) { 
     JTextArea textArea = new JTextArea(); 
     textArea.setColumns(20); 
     textArea.setRows(5); 
     textArea.setWrapStyleWord(true); 
     textArea.setLineWrap(true); 
     JScrollPane jsp = new JScrollPane(textArea); 

     panel.add(new JLabel("Notes" + i)); 
     panel.add(jsp, "span, grow"); 
    } 
    JScrollPane jsp = new JScrollPane(panel) { 
     @Override 
     public Dimension getPreferredSize() { 
      setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
      Dimension dim = new Dimension(super.getPreferredSize().width + getVerticalScrollBar().getSize().width, pref_height); 
      setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 
      return dim; 
     } 
    }; 


    JFrame frame = new JFrame(); 
    frame.add(jsp); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

似乎有點hackish的我,但它的工作原理。

回答

4

正如你所看到的,我試圖找出放什麼在這條線:

不要放任何東西。你不應該試圖管理框架的大小。例如,你的代碼甚至不考慮框架的邊界。如果有的話你的代碼將被改變爲使用框架的寬度,而不是滾動窗格。

更好的解決方案是覆蓋滾動窗格的getPreferredSize()方法,以返回super.getPreferredSize()的寬度,然後指定合理的高度。您需要確保垂直滾動條始終可見才能使計算正常工作。

然後,pack()方法將按預期工作。

+0

對我來說似乎有點ha but,但它起作用。發佈最終的解決方案,在編輯問題... – ryvantage

+0

@ryvantage JComboBox和JScrollPane無法返回合理的尺寸, – mKorbel