# Nimbus eigener Painter funzt nicht



## asroger (4. Nov 2009)

Moin zusammen !

Ich setzte in meiner main Nimbus als L&F und erstelle für einen
TextField[Focused].borderPainter einen eigenen Painter der dann über den UIManager gesetzt wird:

```
Painter bknTextFocusPainter = new Painter() {
	public void paint(Graphics2D g, Object object, int w, int h) {
				g.setStroke(new BasicStroke(2f));
				g.setColor(Color.RED);
				g.fillOval(1, 1, w - 3, h - 3);
				g.setColor(Color.WHITE);
				g.drawOval(1, 1, w - 3, h - 3);
		}
	};

UIManager.put("TextField[Focused].borderPainter", bknTextFocusPainter);	

for (LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
   if ("Nimbus".equals(laf.getName())) {
       UIManager.setLookAndFeel(laf.getClassName());
   }
}
```

Nimbus wird gesetzt aber der eigene Painter hat keinerlei Effekt.
Habe ich noch was vergessen ??

Besten Dank für eure Hilfe


----------



## SlaterB (4. Nov 2009)

was ist denn ein Painter? kann eine derartige Klasse nicht finden

vielleicht den Befehl
UIManager.put("TextField[Focused].borderPainter", bknTextFocusPainter);	
NACH  UIManager.setLookAndFeel()?


----------



## Marco13 (4. Nov 2009)

Painter ist sun-proprietär. Kann's sein dass du eigentlich einen SynthPainter wolltest ( Advanced Synth - Working with Custom Painters Code am Ende )


----------



## asroger (4. Nov 2009)

Hallo !
@Slater  Habe die Reihenfolge schon geändert --> keine Wirkung
@Marco13
com.sun.java.swing.Painter ist laut Beschreibung für Nimbus genau zu diesem Zwecke vorhanden. Über den UIManager setzt man die Konstante für die Nimbus dann den selbstgebastelten Painter aufruft.

Man kann das ganze auch für ein einzelnes Textfeld setzen:

```
Painter bknTextFocusPainter = new Painter() {
				public void paint(Graphics2D g, Object object, int w, int h) {
					g.setStroke(new BasicStroke(2f));
					g.setColor(Color.RED);
					g.fillOval(1, 1, w - 3, h - 3);
					g.setColor(Color.WHITE);
					g.drawOval(1, 1, w - 3, h - 3);
				}
			};

			// Nur für einzelne Componenten
			 UIDefaults bknTextDefaults = new UIDefaults();
			 bknTextDefaults.put("TextField[Focused].borderPainter",
			 bknTextFocusPainter);
			 meinTextField.putClientProperty("Nimbus.Overrides",
			 bknTextDefaults);
			 meinTextField.putClientProperty("Nimbus.Overrides.InheritDefaults",
			 false);
```

Dann funktioniert es bei mir.

Will aber für alle Textfelder !!


----------



## Noctarius (4. Nov 2009)

Generell sollte man aber keine Klassen aus com.sun nutzen, da diese auf anderen JVMs (z.B. der von IBM) nicht existieren.


----------



## asroger (4. Nov 2009)

@Notarius Na das hilft mir ja weiter
Ich denke Nimbus ist offiziell ins JDK aufgenommen, dann sollte man es auch nutzen dürfen


----------



## Noctarius (4. Nov 2009)

FAQ - Sun Packages

Weiß ich, dass dir das nicht weiterhilft, aber es hilft dir eventuell auch nicht, wenn dein Programm später auf anderen VM nicht läuft.

Es war halt nur ein gut gemeinter Rat, aber wenn du meinst, dass du es machen musst


----------



## asroger (6. Nov 2009)

Moin !

Kannst denn mal jemand ausprobieren ?

Danke


----------



## Marco13 (6. Nov 2009)

Poste mal ein KSKB


----------



## asroger (9. Nov 2009)

Moin !
Hier kommt ein Beispiel in dem die globale Beeinflussung des FocusPainter nicht funktioniert, fürs einzelne Textfeld klappt's.

```
package de.kbs.nimbus.test;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.border.EmptyBorder;

import com.sun.java.swing.Painter;

public class NimbusPainterTest extends JFrame {

	private JPanel contentPane;
	private JTextField textField;
	private JTextField textField_1;
	private Painter bknTextFocusPainter;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					NimbusPainterTest frame = new NimbusPainterTest();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

		});
	}

	private void setLook() throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
		bknTextFocusPainter = new Painter() {
			public void paint(Graphics2D g, Object object, int w, int h) {
				g.setStroke(new BasicStroke(2f));
				g.setColor(Color.RED);
				g.fillOval(1, 1, w - 3, h - 3);
				g.setColor(Color.WHITE);
				g.drawOval(1, 1, w - 3, h - 3);
			}
		};

		// Für alle Textfelder
		UIManager.put("TextField[Focused].borderPainter", bknTextFocusPainter);

		for (LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
			if ("Nimbus".equals(laf.getName())) {
				UIManager.setLookAndFeel(laf.getClassName());
			}
		}

	}

	/**
	 * Create the frame.
	 * 
	 * @throws UnsupportedLookAndFeelException
	 * @throws IllegalAccessException
	 * @throws InstantiationException
	 * @throws ClassNotFoundException
	 */
	public NimbusPainterTest() throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
		setLook();
		initialize();
	}

	private void initialize() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		this.contentPane = new JPanel();
		this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(this.contentPane);
		this.contentPane.setLayout(null);
		this.contentPane.add(getTextField());
		this.contentPane.add(getTextField_1());
	}

	private JTextField getTextField() {
		if (textField == null) {
			textField = new JTextField();
			textField.setBounds(171, 60, 86, 20);
			textField.setColumns(10);
		}
		return textField;
	}

	private JTextField getTextField_1() {
		if (textField_1 == null) {
			textField_1 = new JTextField();
			textField_1.setBounds(171, 137, 86, 20);
			textField_1.setColumns(10);

			//Nur für dieses Textfeld
			UIDefaults bknTextDefaults = new UIDefaults();
			bknTextDefaults.put("TextField[Focused].borderPainter", bknTextFocusPainter);
			textField_1.putClientProperty("Nimbus.Overrides", bknTextDefaults);
			textField_1.putClientProperty("Nimbus.Overrides.InheritDefaults", false);

		}
		return textField_1;
	}
}
```


----------



## Marco13 (9. Nov 2009)

Offenbar hilft es, die Zeile
        UIManager.put("TextField[Focused].borderPainter", bknTextFocusPainter);
rauszunehmen, und stattdessen NACH dem Setzen des L&F die Zeile
        UIManager.getLookAndFeelDefaults().put("TextField[Focused].borderPainter", bknTextFocusPainter);
einzufügen - aber nochmal: Painter sollte man nicht verwenden! Schau' dir irgendein Nimbus-Tutorial an, wo steht, wie es richtig geht!


----------



## asroger (9. Nov 2009)

Besten Dank, aber ich habe den Kram ja nur aus dem offiziellem Tutorial !
developers.sun.com/learning/javaoneonline/2008/pdf/TS-6096.pdf

In Java 7 ist der Painter wohl auch Bestandteil des javax.swing Packages:
Painter (Java Platform SE 7 b66)


----------

