概要

JSpinnerを編集不可にした場合の背景色や内部余白の色などを変更します。

サンプルコード

JSpinner spinner3 = new JSpinner() {
  @Override protected void paintComponent(Graphics g) {
    if (getUI() instanceof WindowsSpinnerUI) {
      Graphics2D g2d = (Graphics2D) g.create();
      g2d.setPaint(isEnabled()
          ? UIManager.getColor("FormattedTextField.background")
          : UIManager.getColor("FormattedTextField.inactiveBackground"));
      g2d.fillRect(0, 0, getWidth(),getHeight());
      g2d.dispose();
    }
  }

  @Override protected void paintChildren(Graphics g) {
    super.paintChildren(g);
    if (getUI() instanceof com.sun.java.swing.plaf.windows.WindowsSpinnerUI) {
      if (!isEnabled()) {
        Graphics2D g2d = (Graphics2D) g.create();
        Rectangle r = getComponent(0).getBounds();
        r.add(getComponent(1).getBounds());
        r.width--;
        r.height--;
        g2d.setPaint(UIManager.getColor("FormattedTextField.inactiveBackground"));
        g2d.draw(r);
        g2d.dispose();
      }
    }
  }
};
View in GitHub: Java, Kotlin

解説

  • Default
    • WindowsLookAndFeel(XP)の場合JSpinnerを編集不可にしても白い余白が表示される
  • setOpaque(false)
    • JSpinner#getEditor()で取得したJSpinner.DefaultEditorJSpinner.DefaultEditor#getTextField()で取得したJTextFieldにそれぞれsetOpaque(false)を設定
    • WindowsLookAndFeel(XP)JSpinnerを編集不可にしても背景色は白から変化しない
    • UIManager.put("FormattedTextField.inactiveBackground", Color.WHITE)
  • setBorder(...)
    • 上記と同様に取得したJSpinner.DefaultEditor(デフォルトはJPanel)とJTextFieldに以下のようなWindowsLookAndFeel(XP)用のBorderを設定
      JSpinner spinner2 = new JSpinner();
      spinner2.setBorder(BorderFactory.createEmptyBorder());
      JSpinner.DefaultEditor editor2 = (JSpinner.DefaultEditor) spinner2.getEditor();
      editor2.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 0, new Color(127, 157, 185)));
      JTextField field2 = editor2.getTextField();
      field2.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 0));
      
  • paintComponent, paintChildren
    • JSpinner#paintComponent()をオーバーライドしてWindowsLookAndFeel(XP)の場合表示される余白(背景色)をUIManager.getColor("FormattedTextField.inactiveBackground")で塗りつぶしている
    • JSpinner#paintChildren()をオーバーライドしてWindowsLookAndFeel(XP)の場合表示されるボタン周りの白い余白を塗りつぶしている

参考リンク

コメント