Swing/TableScrollPaneCornerComponent の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/TableScrollPaneCornerComponent へ行く。
- Swing/TableScrollPaneCornerComponent の差分を削除
--- category: swing folder: TableScrollPaneCornerComponent title: JTableを配置したJScrollPaneの右上コーナー区画に配置されるコンポーネントを取得する tags: [JTable, JScrollPane, NimbusLookAndFeel] author: aterai pubdate: 2022-12-12T02:15:41+09:00 description: JTableを配置したJScrollPaneの右上コーナー区画に配置されるコンポーネントを取得し、JTableの幅よりJViewportの幅が大きくなる場合はそれを非表示に切り替えます。 image: https://drive.google.com/uc?id=1nqCfEV8SYYSqtuDAamPo_CR8a7ECIc7s --- * 概要 [#summary] `JTable`を配置した`JScrollPane`の右上コーナー区画に配置されるコンポーネントを取得し、`JTable`の幅より`JViewport`の幅が大きくなる場合はそれを非表示に切り替えます。 #download(https://drive.google.com/uc?id=1nqCfEV8SYYSqtuDAamPo_CR8a7ECIc7s) * サンプルコード [#sourcecode] #code(link){{ // System.out.println(UIManager.get("Table.scrollPaneCornerComponent")); JTable table = new JTable(15, 3) { @Override public boolean getScrollableTracksViewportWidth() { Container c = SwingUtilities.getAncestorOfClass(JScrollPane.class, this); if (c instanceof JScrollPane) { JScrollPane scroll = (JScrollPane) c; Component ur = scroll.getCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER); if (ur != null) { ur.setVisible(getPreferredSize().width >= scroll.getViewport().getWidth()); ur.setVisible( getPreferredSize().width >= scroll.getViewport().getWidth()); } } return super.getScrollableTracksViewportWidth(); } }; table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); }} * 解説 [#explanation] - 上: -- `NimbusLookAndFeel`のデフォルトでは`JTable`を配置した`JScrollPane`の右上コーナー区画には`UIManager.put("Table.scrollPaneCornerComponent", c)`でコンポーネントが配置されている -- `NimbusLookAndFeel`のデフォルトでは`JTable`を配置した`JScrollPane`の右上コーナー区画に`UIManager.put("Table.scrollPaneCornerComponent", c)`でコンポーネントが配置されている -- `MetalLookAndFeel`や`WindowsLookAndFeel`のデフォルトは`null` - 下: -- `JTable#getScrollableTracksViewportWidth()`メソッドをオーバーライドして`JTable`の幅(すべての列幅の合計)より`JViewport`の幅が大きくなる場合は、`scroll.getCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER)`で取得した右上コーナーコンポーネントを非表示に切り替え -- `JTable#getScrollableTracksViewportWidth()`メソッドをオーバーライドして`JTable`の幅(すべての列幅の合計)より`JViewport`の幅が大きくなる場合は`scroll.getCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER)`で取得した右上コーナーコンポーネントを非表示に切り替え --- [[JTableの幅が一定以下で水平スクロールバー、以上で列幅を自動拡張するよう設定>Swing/ScrollableTracksViewportWidth]] -- `MetalLookAndFeel`や`WindowsLookAndFeel`のデフォルト右上コーナーコンポーネントは`null`なので常に非表示状態 * 参考リンク [#reference] - [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JScrollPane.html#getCorner-java.lang.String- JScrollPane#getCorner(...) (Java Platform SE 8)] - [[JTableの幅が一定以下で水平スクロールバー、以上で列幅を自動拡張するよう設定>Swing/ScrollableTracksViewportWidth]] * コメント [#comment] #comment #comment