概要

JTableを配置したJScrollPaneから水平JScrollBarを取り出し、JSplitPaneに再配置してリサイズ可能にします。

スクリーンショット

Swing/ResizableHorizontalScrollBar.png

サンプルコード

DefaultTableModel m1 = new DefaultTableModel(100, 256);
JTable table = new JTable(m1);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
JScrollPane scroll = new JScrollPane(table);
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);

JPanel panel = new JPanel(new BorderLayout());
panel.setOpaque(false);
panel.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0));
panel.add(scroll.getHorizontalScrollBar());

JSplitPane horizontalBox = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
horizontalBox.setBackground(Color.WHITE);
horizontalBox.setLeftComponent(box);
horizontalBox.setRightComponent(panel);
horizontalBox.setContinuousLayout(true);
horizontalBox.setBorder(BorderFactory.createEmptyBorder());
EventQueue.invokeLater(() -> horizontalBox.setDividerLocation(.4));

JLabel tripleColon = new JLabel("⫶");
tripleColon.setForeground(Color.GRAY);
tripleColon.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0));

BasicSplitPaneDivider divider = ((BasicSplitPaneUI) horizontalBox.getUI()).getDivider();
divider.setLayout(new BorderLayout());
divider.setBorder(BorderFactory.createEmptyBorder());
divider.setBackground(Color.WHITE);
divider.add(tripleColon);
divider.setDividerSize(8);
view all

解説

  • JTableJScrollPaneに追加しJScrollPane#getHorizontalScrollBar()で水平スクロールバーを取得
  • JSplitPaneの右コンポーネントとして上記の水平スクロールバーを再配置
    • JSplitPaneDividerをマウスでドラッグして水平スクロールバーの幅を変更可能
  • JSplitPaneの左コンポーネントとしてJTableのモデル切り替えを実行するJRadioButtonなどを配置
    • JTableのモデル切り替えでJSplitPaneに移動した水平スクロールバーのBoundedRangeModelも自動的に更新される

参考リンク

コメント