---
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