2017-01-13 44 views
1

私が直面している問題が自分の状況に限定されているかどうかはわかりませんでしたので、問題の原因となっているものを取り除きました(サンプルコンポーネントとしてJLabel)。JScrollPaneの高さを固定

public class InterestingBehavior { 

    static int direction = -4; 
    static final boolean useScroll = true; 
    static final String longString = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 
              + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 

    public static void main(String[] args) { 
     JFrame test = new JFrame("Test"); 
     test.setSize(500, 300); 
     test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     test.setLayout(new BoxLayout(test.getContentPane(), BoxLayout.Y_AXIS)); 
     for (int i = 0; i < 10; i++) 
      test.add(useScroll ? new JScrollPane(new JLabel(longString)) : new JLabel(longString)); 
     test.add(Box.createVerticalGlue()); //should use all available space 

     final int min = 300, max = 600; 
     new Timer(50, e -> { 
      int h = test.getHeight(); 
      SwingUtilities.invokeLater(() -> test.setSize(test.getWidth(), h + direction)); 
      direction = h == min || h == max ? -direction : direction; 
     }).start(); 

     test.setVisible(true); 
    } 

} 

フレームが自分自身のサイズを変更して、欲しい/したくないものを表示します。 JLabelBoxLayoutに追加すると、それらはすべてJFrameの上部に残ります。これは、パネルに垂直の接着剤を追加したためです。しかしJLabelJScrollPaneにラップすると、JFrameの高さに基づいて自動的にサイズが自動的に変更されることになります。この現象を回避し、スクロールペインを一定の高さに保つにはどうすればよいですか?

フレーム:

expanded scroll pane

リサイズは、私が欲しいものではありませんどの

small pane

になります。

どのようにして1次元を子コンポーネント(ビューポート)の寸法に正確に固定できますか?

答えて

1

問題は、JScrollPane自体がそれを取得するすべての領域をつかむことです。 BoxLayoutは、JScrollPaneと垂直の接着剤の間に利用可能なスペースを公平に分配します。

解決策は、JScrollPanelが要求する垂直方向のスペースを制限することです。 jScrollPane.setMaxmimumSize(new Dimension(1000, 50))

ここでは、各スクロールペインがこのスペースを正確につかんで、サイズ変更や実際には水平スクロールバーの塗りが必要なときに奇妙な動作につながります。したがって、適切なサイズを使用することができます。 jScrollPane.setPreferredSize(new Dimension(0, 50))もあります。

ここでは完全な例:

static int direction = -4; 
    static final boolean useScroll = true; 
    static final String longString = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 
              + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 

    public static void main(String[] args) { 
     JFrame test = new JFrame("Test"); 
     test.setSize(500, 300); 
     test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     test.setLayout(new BoxLayout(test.getContentPane(), BoxLayout.Y_AXIS)); 
     for (int i = 0; i < 10; i++) { 
      if(useScroll) { 
       JScrollPane jScrollPane = new JScrollPane(new JLabel(longString)); 
       jScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
       jScrollPane.setMaximumSize(new Dimension(1000, 50)); 
       jScrollPane.setPreferredSize(new Dimension(0, 50)); 
       test.add(jScrollPane); 
      } else { 
       test.add(new JLabel(longString)); 
      } 
     } 
     test.add(Box.createVerticalGlue()); //should use all available space 

     final int min = 300, max = 600; 
     new Timer(50, e -> { 
      int h = test.getHeight(); 
      SwingUtilities.invokeLater(() -> test.setSize(test.getWidth(), h + direction)); 
      direction = h == min || h == max ? -direction : direction; 
     }).start(); 

     test.setVisible(true); 
    } 
関連する問題