JTextField mit abgerundeten Ecken - Geht über Grenze hinaus

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:
60425d1341885202-unbenannt.png

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:
Code:
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);
    }
 
Schaut aus wie Nimbus. Wenn das stimmt, wäre eine Möglichkeit, unter anderem den
Code:
TextField[Enabled].backgroundPainter
zu ersetzen. Gibt gute Artikel im Nimbus-Blog von Jasper Potts.
 
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🙂.
Code:
//	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?)
 
Zuletzt bearbeitet:
Nur auf die Schnelle, ohne Anspruch auf Schönheit:
Java:
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
 

Zurück
Oben