0

JSplitPane の左側のコンポーネントである JScrollPane にある JPanel に JTree があります。JSplitPane は独自の JScrollPane にあります。後者は垂直スクロールバーを表示できません...代わりに、JFrameのサイズが変更されてツリーの一部が表示されなくなるたびに、ツリーパネルの垂直スクロールバーが表示されます...

言い換えれば、ツリーのスクロール ペインのビューポートを常にフレームのコンテンツ ペインの高さと同じ高さにしたいのです...これらの線に沿ってさまざまな実験を試みました

SSCCE は次のとおりです。

import java.awt.*;
import java.awt.event.ComponentEvent;
import java.lang.reflect.InvocationTargetException;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;


public class Packing {
  public static void main( String[] args ) throws InterruptedException, InvocationTargetException{
    EventQueue.invokeLater( new Runnable(){
      @Override
      public void run() {
        JTree jt = new JTree();
        DefaultTreeModel model = (DefaultTreeModel)jt.getModel();
        for( int i = 0; i < 30; i++ ){
          model.insertNodeInto( new DefaultMutableTreeNode( i ), 
              (DefaultMutableTreeNode)model.getRoot(), 0 );
        }


        JPanel left_panel = new JPanel();
        left_panel.setLayout( new BorderLayout() );
        left_panel.add( jt, BorderLayout.WEST );
        JScrollPane tree_jsp = new JScrollPane( left_panel );


        JSplitPane split_pane = new JSplitPane();
        split_pane.setDividerLocation( 0.5d );
        split_pane.setLeftComponent( tree_jsp );
        JScrollPane split_jsp = new JScrollPane( split_pane );
        split_jsp.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER );


        JFrame frame = new JFrame( "Resizing prob" );
        frame.getContentPane().add( split_jsp );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.addComponentListener(new java.awt.event.ComponentAdapter() {
          public void componentResized(ComponentEvent e) {
            System.out.println( ">>> frame resized" );
          }
        });
        frame.pack();
        frame.setVisible( true );
      }
    });
  }
}

編集

おそらくそれをクラックした可能性があります...これらの行をcomponentResizedに追加しました:

  int vp_width = tree_jsp.getViewport().getSize().width;
  tree_jsp.getViewport().setPreferredSize( 
            new Dimension( vp_width, frame.getContentPane().getSize().height - 40 ));
  tree_jsp.getViewport().validate();

明らかにこれは下書きです... 40という数字は私が理解しようとしている奇妙なことです...私のマシンでは、この数字が20以下に設定されているとサイズ変更が機能しません...

NB また、明らかに、tree_jsp を最終的なものにする必要があります。これらの 2 行は、私の狂気の中でメソッドを理解するためにコードのメイン ビットに追加される可能性があります。

  JTable table = new JTable( 1, 2 );
  left_panel.add( table, BorderLayout.EAST );

もう 1 つ: setPreferredSize を使用しないように指示されています... レイアウトを使用するだけで、上記の動作を実現できるのではないでしょうか?

編集 2

最終的に、私の目的は少し歪んでいるという結論に達しました。実際には、左側のコンポーネントにスクロール ペインが必要で、右側のコンポーネントに別のスクロール ペインが必要でした。その後、JSplitPane (またはそれを含む JPanel) にスクロール ペインを配置する必要はないようです。この状況を設計するには... BorderLayout が実際に私が望んでいたことをしているという問題が見つかりました... BoxLayout と GridLayout の組み合わせが本当に役に立ちました (これはすべて、setXXXSize を完全に回避しようとするコンテキストにあります)。間違いなく、答えは GridBagLayout を理解することにもあります...

4

1 に答える 1

1

パネルを取り除きます。JTree を JScrollPane に追加するだけです。

//        JPanel left_panel = new JPanel();
//        left_panel.setLayout( new BorderLayout() );
//        left_panel.add( jt, BorderLayout.WEST );
//        JScrollPane tree_jsp = new JScrollPane( left_panel );
        JScrollPane tree_jsp = new JScrollPane( jt );

編集:十分なスペースがないときにスクロールしたいので、常にツリーをスクロールペインに追加する必要があります。ただし、スクロールペインをパネルに追加し、パネルを分割ペインに追加できます。

    JScrollPane tree_jsp = new JScrollPane( jt );

    JPanel left_panel = new JPanel();
    left_panel.setLayout( new BorderLayout() );
    left_panel.add( tree_jsp, BorderLayout.WEST );

    JSplitPane split_pane = new JSplitPane();
    split_pane.setDividerLocation( 0.5d );
    // split_pane.setLeftComponent( tree_jsp );
    split_pane.setLeftComponent( left_panel );

Edit2: lef_panel にスクロールペインのみが必要な場合は、単一のスクロールペインのみが必要です。分割ペインにスクロールペインは必要ありません。分割ペインをフレームに直接追加するだけです:

//frame.getContentPane().add( split_jsp );
frame.add( split_pane );

このアプローチは、JTable で問題を引き起こす可能性があります。これは、テーブル ヘッダーを表示する最も簡単な方法であるため、テーブルがスクロールペインに追加されることが常に想定されているためです。

また、JDK5 以降、getContentPane() メソッドは必要ありません。フレームがコンテンツ ペインにコンポーネントを追加します。

編集 3:で遊んで、Scollable interfaceスクロールペインに追加されたコンポーネントの高さをスクロールペインの高さに固定するようにスクロールペインに指示できます。ヘルパー クラスについては、スクロール可能なパネルを参照してください。このクラスを使用すると、コードは次のようになります。

//JScrollPane split_jsp = new JScrollPane( split_pane );
//split_jsp.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER );

ScrollablePanel scrollable = new ScrollablePanel( new BorderLayout() );
scrollable.setScrollableHeight( ScrollablePanel.ScrollableSizeHint.FIT );
scrollable.setScrollableWidth( ScrollablePanel.ScrollableSizeHint.STRETCH );
scrollable.add(split_pane);
JScrollPane split_jsp = new JScrollPane( scrollable );
于 2013-09-11T17:19:07.670 に答える