• category: swing folder: ResizableHorizontalScrollBar title: JTableの水平JScrollBarをリサイズ可能にするためJSplitPaneに再配置する tags: [JScrollBar, JSplitPane, JTable, JScrollPane] author: aterai pubdate: 2021-04-12T03:23:04+09:00 description: JTableを配置したJScrollPaneから水平JScrollBarを取り出し、JSplitPaneに再配置してリサイズ可能にします。 image: https://drive.google.com/uc?id=182ApSMU7uEGWzk3ANEO3L_RRDbn7U2W7

概要

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

サンプルコード

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 in GitHub: Java, Kotlin

解説

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

参考リンク

コメント