Swing/InactiveSpinnerInsets の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/InactiveSpinnerInsets へ行く。
- Swing/InactiveSpinnerInsets の差分を削除
--- category: swing folder: InactiveSpinnerInsets title: JSpinnerを編集不可にした場合の内余白 tags: [JSpinner, JTextField, Border, UIManager, LookAndFeel] author: aterai pubdate: 2010-08-23T15:50:45+09:00 description: JSpinnerを編集不可にした場合の背景色や内部余白の色などを変更します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTOcTAKgdI/AAAAAAAAAcY/R1dvME0C6UA/s800/InactiveSpinnerInsets.png --- * 概要 [#summary] `JSpinner`を編集不可にした場合の背景色や内部余白の色などを変更します。 #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTOcTAKgdI/AAAAAAAAAcY/R1dvME0C6UA/s800/InactiveSpinnerInsets.png) * サンプルコード [#sourcecode] #code(link){{ 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(); } } } }; }} * 解説 [#explanation] - `Default` -- `WindowsLookAndFeel(XP)`の場合`JSpinner`を編集不可にしても白い余白が表示される - `setOpaque(false)` -- `JSpinner#getEditor()`で取得した`JSpinner.DefaultEditor`と`JSpinner.DefaultEditor#getTextField()`で取得した`JTextField`をそれぞれ`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()`をオーバーライドして`WindowsLookAndFeel(XP)`の場合表示される余白(背景色)を`UIManager.getColor("FormattedTextField.inactiveBackground")`で塗りつぶしている -- `JSpinner#paintChildren()`をオーバーライドして`WindowsLookAndFeel(XP)`の場合表示されるボタン周りの白い余白を塗りつぶしている * 参考リンク [#reference] - [http://www.oracle.com/technetwork/java/painting-140037.html Painting in AWT and Swing] * コメント [#comment] #comment #comment