概要

NimbusLookAndFeelの外観をUIDefaultsを使って部分的に変更します。

サンプルコード

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 all

解説

  • JCheckBoxMenuItem
    • CheckBoxMenuItem[Enabled].checkIconPainter, CheckBoxMenuItem[MouseOver].checkIconPainter, CheckBoxMenuItem[Enabled+Selected].checkIconPainter, CheckBoxMenuItem[MouseOver+Selected].checkIconPainterPainter(これらの状態を独自に描画)を置き換えたUIDefaultsを作成し、putClientProperty("Nimbus.Overrides", d);を使って上書き
  • JTextArea
    • JTableTableCellRendererJTextAreaを使用してセル内に複数行の文字列を表示(JTableのセルの高さを自動調整)
    • NimbusLookAndFeelでは、JTextAreaJScrollPane内に配置されていない場合、Borderが表示されるので、これを非表示にするためにTextArea.borderPainterで使用するPainterを置き換えたUIDefaultsを作成し、JTextAreaのデフォルトをputClientProperty("Nimbus.Overrides", d);を使って上書き
      • UIManager.getBorder("Table.focusCellHighlightBorder")を使うと、なぜか一番左上のセルのフォーカスが表示されない
    • TextArea.NotInScrollPaneState#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);

参考リンク

コメント