Swing/TranslucentSpinner のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TranslucentSpinner へ行く。
- category: swing folder: TranslucentSpinner title: JSpinnerのTextFieldやArrowButtonを半透明にする tags: [JSpinner, NimbusLookAndFeel, LookAndFeel] author: aterai pubdate: 2020-04-06T12:14:53+09:00 description: NimbusLookAndFeelを適用したJSpinnerでそのFormattedTextFieldやArrowButtonが半透明になるよう設定します。 image: https://drive.google.com/uc?id=1W4bLhbm0FPWEiaLl_9_CIbsCO_Fe4LpP
概要
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);
// d.put("Spinner:Panel:\"Spinner.formattedTextField\"[Focused+Selected].backgroundPainter", painter2);
// d.put("Spinner:Panel:\"Spinner.formattedTextField\"[Disabled].backgroundPainter", painter);
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
と同様におかしくなっている
JSpinner
のFormattedTextField
はSpinner:\"Spinner.previousButton\"[Enabled].backgroundPainter
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
まで上書きされてしまう?