• category: swing folder: TableShowGrid title: JTableのグリッド線描画をUIDefaultsから復元する tags: [JTable, UIManager, UIDefaults, NimbusLookAndFeel] author: aterai pubdate: 2023-10-23T02:56:18+09:00 description: JTableのグリッド線を表示するかをLookAndFeelのデフォルト設定から復元するよう設定します。 image: https://drive.google.com/uc?id=1XwznLk2WeK7_R5kGZTNERFvTFtIyDXMb

概要

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が設定されている場合はその値でグリッド線の表示・非表示が決定される

参考リンク

コメント