JTableのグリッド線描画をUIDefaultsから復元する
Total: 728
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JTable
のグリッド線を表示するかをLookAndFeel
のデフォルト設定から復元するよう設定します。
Screenshot
Advertisement
サンプルコード
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.showGrid
がBoolean.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
となる
- その他の
MetalLookAndFeel
やWindowsLookAndFeel
では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.showGrid
、Table.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(...)
でユーザ設定かを記憶したり、DimensionUIResource
がJTable#setIntercellSpacing(...)
で使用されているかなどで判断する必要がある
- このため
参考リンク
- JTableの罫線の有無とセルの内余白を変更
- [JDK-8043603] Merging of Table.showGrid does not work in javax.swing.plaf.synth.SynthTableUI - Java Bug System
- JTable has inconsistent design between different themes · Issue #750 · JFormDesigner/FlatLaf