JSpinnerのTextFieldやArrowButtonを半透明にする
Total: 1754
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
NimbusLookAndFeel
を適用したJSpinner
でそのFormattedTextField
やArrowButton
が半透明になるよう設定します。
Screenshot
Advertisement
サンプルコード
UIDefaults d = new UIDefaults();
Painter<JComponent> painter1 = (g, c, w, h) -> {
g.setColor(new Color(100, 100, 100, 100));
g.fillRect(0, 0, w, h);
};
Painter<JComponent> painter2 = (g, c, w, h) -> {
g.setColor(new Color(100, 200, 200, 100));
g.fillRect(0, 0, w, h);
};
d.put("Spinner:Panel:\"Spinner.formattedTextField\"[Enabled].backgroundPainter",
painter1);
d.put("Spinner:Panel:\"Spinner.formattedTextField\"[Focused].backgroundPainter",
painter2);
d.put("Spinner:Panel:\"Spinner.formattedTextField\"[Selected].backgroundPainter",
painter2);
Painter<JComponent> painter3 = (g, c, w, h) -> {
g.setColor(new Color(100, 100, 200, 100));
g.fillRect(0, 0, w, h);
};
Painter<JComponent> painter4 = (g, c, w, h) -> {
g.setColor(new Color(120, 120, 120, 100));
g.fillRect(0, 0, w, h);
};
d.put("Spinner:\"Spinner.previousButton\"[Enabled].backgroundPainter",
painter3);
d.put("Spinner:\"Spinner.previousButton\"[Focused+MouseOver].backgroundPainter",
painter3);
d.put("Spinner:\"Spinner.previousButton\"[Focused+Pressed].backgroundPainter",
painter3);
d.put("Spinner:\"Spinner.previousButton\"[Focused].backgroundPainter",
painter3);
d.put("Spinner:\"Spinner.previousButton\"[MouseOver].backgroundPainter",
painter3);
d.put("Spinner:\"Spinner.previousButton\"[Pressed].backgroundPainter",
painter4);
d.put("Spinner:\"Spinner.nextButton\"[Enabled].backgroundPainter",
painter3);
d.put("Spinner:\"Spinner.nextButton\"[Focused+MouseOver].backgroundPainter",
painter3);
d.put("Spinner:\"Spinner.nextButton\"[Focused+Pressed].backgroundPainter",
painter3);
d.put("Spinner:\"Spinner.nextButton\"[Focused].backgroundPainter",
painter3);
d.put("Spinner:\"Spinner.nextButton\"[MouseOver].backgroundPainter",
painter3);
d.put("Spinner:\"Spinner.nextButton\"[Pressed].backgroundPainter",
painter4);
SpinnerModel model = new SpinnerNumberModel(0, 0, 100, 5);
JSpinner spinner1 = new JSpinner(model);
// NG: spinner1.putClientProperty("Nimbus.Overrides", d);
((JSpinner.DefaultEditor) spinner1.getEditor())
.getTextField().putClientProperty("Nimbus.Overrides", d);
configureSpinnerButtons(spinner1, d);
View in GitHub: Java, Kotlin解説
UIDefaults
を作成してJSpinner
のFormattedTextField
やArrowButton
で使用するPainter
を登録- Nimbus Defaults (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)にキー一覧がある
JSpinner
のFormattedTextField
はSpinner:Panel:"Spinner.formattedTextField"[Enabled].backgroundPainter
のようにPanel
が付くので注意JSpinner
のPreviousButton
はSpinner:\"Spinner.previousButton\"[Enabled].backgroundPainter
だが、上記のチュートリアルではcodeviousButton
と文字化けしているので注意が必要<pre>
を<code>
タグに変換しようとしてprevious
がcodevious
になっている?- 他にも
ColorChooser.previewPanelHolder
がColorChooser.codeviewPanelHolder
、ComboBox.pressedWhenPopupVisible
がComboBox.codessedWhenPopupVisible
と同様におかしくなっている - NimbusBrowser.javaで生成される
html
ファイルでは問題ないのでThe Java™ Tutorials
に転載するときに変換ミスがあったのかもしれない
JSpinner
のNextButton
はSpinner:\"Spinner.nextButton\"[Enabled].backgroundPainter
putClientProperty("Nimbus.Overrides", d)
メソッドでJSpinner
のFormattedTextField
やArrowButton
にUIDefaults
を上書きで設定JSpinner
にUIDefaults
を上書きしても無効でJFormattedTextField
やJButton
を取得して直接それに設定する必要があるJFormattedTextField
はJSpinner.DefaultEditor#getTextField()
で取得可能ArrowButton
を取得するメソッドは存在しないので名前がSpinner.previousButton
かSpinner.nextButton
になっているJButton
を検索して取得している- 特定の
JSpinner
にputClientProperty(...)
を設定しても他のJSpinner
まで上書きされてしまう?
参考リンク
- Nimbus Defaults (The Java™ Tutorials > Creating a GUI With JFC/Swing > Modifying the Look and Feel)
- JSpinnerのボタンにToolTipを付ける