概要

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 in GitHub: Java, Kotlin

解説

  • JCheckBoxMenuItem
    • CheckBoxMenuItem[Enabled].checkIconPainterCheckBoxMenuItem[MouseOver].checkIconPainterCheckBoxMenuItem[Enabled+Selected].checkIconPainterCheckBoxMenuItem[MouseOver+Selected].checkIconPainterPainter(これらの状態を独自に描画)を置き換えたUIDefaultsを作成し、putClientProperty("Nimbus.Overrides", d)を使用して上書き
  • JTextArea
    • JTableTableCellRendererJTextAreaを使用してセル内に複数行の文字列を表示
    • 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);
      

参考リンク

コメント