• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JSpinnerを編集不可にした場合の内余白
#navi(../)
#tags()
#tags(JSpinner, JTextField, Border, UIManager, LookAndFeel)
RIGHT:Posted by &author(aterai); at 2010-08-23
*JSpinnerを編集不可にした場合の内余白 [#lebad6b3]
JSpinnerを編集不可にした場合の背景色や内部余白の色などを変更します。
* JSpinnerを編集不可にした場合の内余白 [#lebad6b3]
``JSpinner``を編集不可にした場合の背景色や内部余白の色などを変更します。

-&jnlp;
-&jar;
-&zip;
- &jnlp;
- &jar;
- &zip;

//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTOcTAKgdI/AAAAAAAAAcY/R1dvME0C6UA/s800/InactiveSpinnerInsets.png)
#ref(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTOcTAKgdI/AAAAAAAAAcY/R1dvME0C6UA/s800/InactiveSpinnerInsets.png)

**サンプルコード [#v60468c2]
** サンプルコード [#v60468c2]
#code(link){{
JSpinner spinner3 = new JSpinner() {
  @Override protected void paintComponent(Graphics g) {
    if (getUI() instanceof com.sun.java.swing.plaf.windows.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();
      }
    }
  }
};
}}

**解説 [#qfc7e655]
-Default
--WindowsLnf(XP)の場合、JSpinnerを編集不可にしても白い余白が表示される。
-setOpaque(false)
--JSpinner#getEditor()で取得したJSpinner.DefaultEditorと、JSpinner.DefaultEditor#getTextField()で取得したJTextFieldをそれぞれ、setOpaque(false)としている。
--WindowsLnf(XP)で、JSpinnerを編集不可にしても背景色は白いままになる。
--UIManager.put("FormattedTextField.inactiveBackground", Color.WHITE);
-setBorder(...)
--上記と同様に取得したJSpinner.DefaultEditor(=JPanel)とJTextFieldに以下のようなWindowsLnf(XP)用のBorderを設定している。
** 解説 [#qfc7e655]
- ``Default``
-- ``WindowsLookAndFeel(XP)``の場合、``JSpinner``を編集不可にしても白い余白が表示される。
- ``setOpaque(false)``
-- ``JSpinner#getEditor()``で取得した``JSpinner.DefaultEditor``と、``JSpinner.DefaultEditor#getTextField()``で取得した``JTextField``をそれぞれ、``setOpaque(false)``としている。
-- ``WindowsLookAndFeel(XP)``で、``JSpinner``を編集不可にしても背景色は白いままになる。
-- ``UIManager.put("FormattedTextField.inactiveBackground", Color.WHITE);``
- ``setBorder(...)``
-- 上記と同様に取得した``JSpinner.DefaultEditor``(=``JPanel``)と``JTextField``に以下のような``WindowsLookAndFeel(XP)``用の``Border``を設定している。
#code{{
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()をオーバーライドして, WindowsLnf(XP)の場合表示される余白(背景色)をUIManager.getColor("FormattedTextField.inactiveBackground")で塗りつぶしている。
--JSpinner#paintChildren()をオーバーライドして,  WindowsLnf(XP)の場合表示されるボタン周りの白い余白を塗りつぶしている。

**参考リンク [#l3dbec88]
-[http://java.sun.com/products/jfc/tsc/articles/painting/ Painting in AWT and Swing]
- ``paintComponent, paintChildren``
-- ``JSpinner#paintComponent()``をオーバーライドして, ``WindowsLookAndFeel(XP)``の場合表示される余白(背景色)を``UIManager.getColor("FormattedTextField.inactiveBackground")``で塗りつぶしている。
-- ``JSpinner#paintChildren()``をオーバーライドして,  ``WindowsLookAndFeel(XP)``の場合表示されるボタン周りの白い余白を塗りつぶしている。

**コメント [#m68ec79a]
** 参考リンク [#l3dbec88]
- [http://java.sun.com/products/jfc/tsc/articles/painting/ Painting in AWT and Swing]

** コメント [#m68ec79a]
#comment