Summary

JSpinnerの内部で使用するEditorコンポーネントのBorderを描画するかを切り替えます。

Source Code Examples

JSpinner spinner = new JSpinner();
String key = "Spinner.editorBorderPainted";
JCheckBox check = new JCheckBox(key) {
  @Override public void updateUI() {
    super.updateUI();
    UIDefaults def = UIManager.getLookAndFeelDefaults();
    boolean b = def.getBoolean(key);
    Object o = def.get(key);
    String lnf = UIManager.getLookAndFeel().getClass().getName();
    String name = lnf.substring(lnf.lastIndexOf('.') + 1);
    info.append(String.format("%s: %s=%s%n", name, key, o == null ? null : b));
    setSelected(b);
    UIManager.put(key, b);
    SwingUtilities.updateComponentTreeUI(spinner);
  }
};
check.addActionListener(e -> {
  JCheckBox src = (JCheckBox) e.getSource();
  UIManager.put(key, src.isSelected());
  SwingUtilities.updateComponentTreeUI(spinner);
});
View in GitHub: Java, Kotlin

Description

  • UIManager.put("Spinner.editorBorderPainted", false)
    • JSpinnerの内部で使用するEditorコンポーネントのBorderを非表示
      • JSpinner#getEditor()で取得したDefaultEditorからさらにDefaultEditor#getTextField()などで取得できるJTextFieldBordernullが設定される
    • MetalLookAndFeelWindowsLookAndFeelなどのデフォルト
    • SynthLookAndFeelNimbusLookAndFeelではSpinner.editorBorderPaintedは未設定でUIManager.getLookAndFeelDefaults()#get("Spinner.editorBorderPainted")nullとなり、変更しても効果がない?
  • UIManager.put("Spinner.editorBorderPainted", true)
    • JSpinnerの内部で使用するEditorコンポーネントのBorderを表示
    • 一度このBorderを表示状態にしてから、SynthLookAndFeelを継承するNimbusLookAndFeelなどに切り替えるとJSpinner自体の高さが不正になる → 原因調査中
      • NimbusLookAndFeelではEditorコンポーネントにフォーカス移動でSynthBorderの描画を変更する必要があるので、Bordernullが設定されるとこれを回避しようとしてサイズがおかしくなる?

Reference

Comment