Nimbusの外観をUIDefaultsで変更する
Total: 5135
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
NimbusLookAndFeel
の外観をUIDefaults
を使って部分的に変更します。
Screenshot
Advertisement
サンプルコード
UIDefaults d = new UIDefaults();
d.put("TextArea.borderPainter", new Painter<JComponent>() {
@Override public void paint(Graphics2D g, JComponent c, int w, int h) {
/* Empty painter */
}
});
MultiLineTableCellRenderer r = new MultiLineTableCellRenderer();
r.putClientProperty("Nimbus.Overrides", d);
r.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
View in GitHub: Java, Kotlin解説
JCheckBoxMenuItem
CheckBoxMenuItem[Enabled].checkIconPainter
、CheckBoxMenuItem[MouseOver].checkIconPainter
、CheckBoxMenuItem[Enabled+Selected].checkIconPainter
、CheckBoxMenuItem[MouseOver+Selected].checkIconPainter
のPainter
(これらの状態を独自に描画)を置き換えたUIDefaults
を作成し、putClientProperty("Nimbus.Overrides", d)
を使用して上書き
JTextArea
JTable
のTableCellRenderer
にJTextArea
を使用してセル内に複数行の文字列を表示NimbusLookAndFeel
ではJTextArea
がJScrollPane
内に配置されていない場合Border
が表示されるので、これを非表示にするためにTextArea.borderPainter
で使用するPainter
を置き換えたUIDefaults
を作成し、JTextArea
のデフォルトをputClientProperty("Nimbus.Overrides", d)
を使って上書きUIManager.getBorder("Table.focusCellHighlightBorder")
を使うとなぜか一番左上のセルのフォーカスが表示されない
TextArea.NotInScrollPane
のState#isInState(...)
をオーバーライドしてJScrollPane
内にあるように見せかける方法もあるd.put("TextArea.NotInScrollPane", new State("NotInScrollPane") { @Override protected boolean isInState(JComponent c) { // @see javax.swing.plaf.nimbus.TextAreaNotInScrollPaneState // return !(c.getParent() instanceof JViewport); return false; } }); r.putClientProperty("Nimbus.Overrides", d);
参考リンク
- Nimbus Defaults (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)
NimbusLookAndFeel
のプロパティ一覧
- javax.swing.plaf.nimbus (Java Platform SE 8)