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 を理解することにもあります...