概要

JTableを配置したJScrollPaneの右上コーナー区画に配置されるコンポーネントを取得し、JTableの幅よりJViewportの幅が大きくなる場合はそれを非表示に切り替えます。

スクリーンショット

Swing/TableScrollPaneCornerComponent.png

サンプルコード

// 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());
      }
    }
    return super.getScrollableTracksViewportWidth();
  }
};
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
View in GitHub: Java, Kotlin

解説

  • 上:
    • NimbusLookAndFeelのデフォルトではJTableを配置したJScrollPaneの右上コーナー区画にはUIManager.put("Table.scrollPaneCornerComponent", c)でコンポーネントが配置されている
    • MetalLookAndFeelWindowsLookAndFeelのデフォルトはnull
  • 下:
    • JTable#getScrollableTracksViewportWidth()メソッドをオーバーライドしてJTableの幅(すべての列幅の合計)よりJViewportの幅が大きくなる場合は、scroll.getCorner(ScrollPaneConstants.UPPER_RIGHT_CORNER)で取得した右上コーナーコンポーネントを非表示に切り替え
    • MetalLookAndFeelWindowsLookAndFeelのデフォルト右上コーナーコンポーネントはnullなので常に非表示状態

参考リンク

コメント