JTableのグリッド線描画をUIDefaultsから復元する
Total: 1453, Today: 1, Yesterday: 0
Posted by aterai at
Last-modified:
Summary
JTableのグリッド線を表示するかをLookAndFeelのデフォルト設定から復元するよう設定します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
- 上:
DefaultNimbusLookAndFeelのデフォルトでは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.gridColorJTable#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(...)で使用されているかなどで判断する必要がある
- このため
Reference
- 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
- [JDK-8302057] Wrong BeanProperty description for JTable.setShowGrid - Java Bug System