# JTextField mit abgerundeten Ecken - Geht über Grenze hinaus



## ronniecoleman (10. Jul 2012)

Hallo, ich habe mir ein JTextField mit abgerundeten Ecken erstellt (u.a. überschreiben der paintComponent und paintBorder-Methoden).
Nun stellt sich aber folgendes Problem ein:





Diese weissen Ecken des JTextFields sollen natürlich "weg"...Nur weiß ich nicht, wie man das am einfachsten anstellen könnte. Bin auch noch ziemlich neu in solchen Grafikangelegenheiten.
Nach stundenlangem Überlegen und Googlen, wollte ich jetzt euch mal fragen!

Hier meine Suchfeld-Klasse:

```
public class RoundedLiveFilter extends JTextField{
    private Shape shape;
    private final int arcWidth = 30;  //vorher 15 & 15!
    private final int arcHeight = 30;
    private final String placeholderText = "Search";
    
    
    public RoundedLiveFilter(){
        super(15);
        setOpaque(false);
//        setPlaceholderText(placeholderText);
    }
    
    private void setPlaceholderText(String placeholderText){
        setForeground(Color.GRAY);
        setText(placeholderText);
    }
    
        
    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(getBackground());
        g.fillRoundRect(0, 0, getWidth()-1, getHeight()-1, arcWidth, arcHeight);
        super.paintComponent(g);

    }
    
    @Override
    protected void paintBorder(Graphics g) {
        Graphics2D gr = (Graphics2D)g.create(); //Graphics2D-Objekt benötigt für Antialiasing...
        gr.setColor(getForeground());
        gr.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        gr.drawRoundRect(0, 0, getWidth()-1, getHeight()-1, arcWidth, arcHeight); 
        paintIcon(gr);
     }
    
    private void paintIcon(Graphics2D gr){
        Rectangle clip = gr.getClipBounds();
//        float width = (float) clip.getWidth();
        float height = (float) clip.getHeight()/4;

        gr.setColor(new Color(101, 101, 101));
        gr.setStroke(new BasicStroke(2f));
        gr.draw(new Ellipse2D.Float(height, height, 9, 9));
        gr.draw(new Line2D.Float(height+8, height+8, 19.5f, 19.5f));
    }
    

    @Override
    public boolean contains(int x, int y) {
        if (shape == null || !shape.getBounds().equals(getBounds())) {
            shape = new RoundRectangle2D.Float(0, 0, getWidth()-1, getHeight()-1, arcWidth, arcHeight);
        }
        return shape.contains(x, y);
    }
```


----------



## IMartin (10. Jul 2012)

Schaut aus wie Nimbus. Wenn das stimmt, wäre eine Möglichkeit, unter anderem den 
	
	
	
	





```
TextField[Enabled].backgroundPainter
```
 zu ersetzen. Gibt gute Artikel im Nimbus-Blog von Jasper Potts.


----------



## ronniecoleman (11. Jul 2012)

Hallo!
Ich habe dazu gerade was gefunden:
swing - Java Nimbus LAF with transparent text fields - Stack Overflow
Bug ID: 6687960 Background of component invisible with Nimbus

Anscheinend ist es ein Nimbus-Bug, wobei das "opaque" nicht so interpretiert wird wie bei anderen LAFs..mit einem anderen LAF funktioniert mein Textfield auch so wie es soll! So ein Mist aber auch..der  Workaround von den Leuten hilft auch nur begrenzt.
Eine EmptyBorder möchte ich nicht, da es das Textfeld zu verkleinert.
Einzige Möglichkeit ist eine weiße Hitnergrundfarbe mit einem höheren Gamma-Wert zu benutzen (also durchsichtiger). Dann werden diese weißen Ecken weniger auffallen (klasse Lösung :noe.

```
//	setBackground(new Color(255,255,255,100));  //Gamma-Wert (Durchsichtigkeit hinunter setzen - 0 ) durchsichtig = opaque)
```

Könntest du mir deinen Vorschlag nochmal erläutern? Oder ist die mit dieser Info von mir jetzt hinfällig?

Ist wohl einfacher jetzt ein anderes LAF zu benutzen statt irgendwie an dem Nimbus rumzuwerkeln oder? (Warum tut Oracle da nichts?)


----------



## IMartin (11. Jul 2012)

Nur auf die Schnelle, ohne Anspruch auf Schönheit:

```
Painter<Object> backgroundPainter = new Painter<Object>() {
    public void paint(Graphics2D g, Object object, int width, int height) {
    	// hier den Hintergrund malen
    }
};

UIDefaults overrideDefaults = new UIDefaults();
overrideDefaults.put("TextField[Enabled].backgroundPainter", backgroundPainter);

JTextField textfield = new RoundedLiveFilter();
textfield.putClientProperty("Nimbus.Overrides", overrideDefaults);
```
Die keys für die Painter stehen zum Beispiel hier: http://jasperpotts.com/blogfiles/nimbusdefaults/nimbus.html


----------



## ronniecoleman (11. Jul 2012)

Danke dir! Ich werd mir das mal anschauen


----------

