概要

JTableのグリッド線を表示するかをLookAndFeelのデフォルト設定から復元するよう設定します。

サンプルコード

JTable table = new JTable(model) {
  @Override public void updateUI() {
    ColorUIResource reset = new ColorUIResource(Color.RED);
    setSelectionForeground(reset);
    setSelectionBackground(reset);
    super.updateUI();
    UIDefaults def = UIManager.getLookAndFeelDefaults();
    Object showGrid = def.get("Table.showGrid");
    Color gridColor = def.getColor("Table.gridColor");
    if (showGrid == null && gridColor != null) {
      setShowGrid(true);
      setIntercellSpacing(new DimensionUIResource(1, 1));
      createDefaultRenderers();
    }
  }
};
View in GitHub: Java, Kotlin

解説

  • 上: Default
    • NimbusLookAndFeelのデフォルトではTable.showGridBoolean.FALSEに設定されている(nullではない)ため、UIManager.getLookAndFeelDefaults().getBoolean("Table.showGrid")falseでグリッド線は非表示
      • Table.intercellSpacingは設定済みでUIManager.getLookAndFeelDefaults().getDimension("Table.intercellSpacing")new Dimension(0, 0)となる
      • Table.gridColorは未設定でUIManager.getLookAndFeelDefaults().getColor("Table.gridColor")nullとなる
    • その他のMetalLookAndFeelWindowsLookAndFeelではTable.showGridが未設定でUIManager.getLookAndFeelDefaults().get("Table.showGrid")nullになるため、UIManager.getLookAndFeelDefaults().getBoolean("Table.showGrid")falseとなるがコンストラクタで実行されるJTable#initializeLocalVars()メソッド内でJTable#setShowGrid(true)setRowMargin(1)(setRowMargin(intercellSpacing.height)と連動)などが設定されているためグリッド線はデフォルトで表示状態となる
      • Table.intercellSpacingは未設定でUIManager.getLookAndFeelDefaults().getDimension("Table.intercellSpacing")nullとなる
      • Table.gridColorは設定済みでUIManager.getLookAndFeelDefaults().getColor("Table.gridColor")Colorが取得可能
    • たとえばJTableのグリッド線非表示がデフォルトのNimbusLookAndFeelから表示がデフォルトのMetalLookAndFeelなどにLookAndFeelを切り替えてもJTable#initializeLocalVars()は実行されないため直前の非表示設定が残ってグリッド線が非表示のままになる
  • 下: Table.showGridTable.gridColor
    • JTable#updateUI()をオーバーライドしてUIManager.getLookAndFeelDefaults().get("Table.showGrid")null、かつUIManager.getLookAndFeelDefaults().getColor("Table.gridColor")nullでない場合はJTable#setShowGrid(true)を実行してグリッド線を表示するよう設定
    • NimbusLookAndFeelのようにTable.showGridが設定されている場合はその値でグリッド線の表示・非表示を決定する
    • BooleanUIResourceは存在しないのでLookAndFeelではなくユーザがJTable#setShowGrid(boolean)メソッドでグリッド線の表示・非表示を設定したかどうかはinstanceof UIResourceでは判断できない
      • このためJComponent#putClientProperty(...)でユーザ設定かを記憶したり、DimensionUIResourceJTable#setIntercellSpacing(...)で使用されているかなどで判断する必要がある

参考リンク

コメント