25 votes

Bouton arrondi Swing JButton utilisant Java

J'ai une image que j'aimerais mettre en arrière-plan d'un bouton (ou quelque chose de cliquable). Le problème est que cette image est ronde, et que je dois donc l'afficher, sans bordures, etc.

Le JComponent qui contient ce bouton a un arrière-plan personnalisé, de sorte que le bouton ne doit afficher que l'image.

Après avoir cherché sur Google, je n'ai pas réussi à le faire. J'ai essayé tout ce qui suit, mais sans succès :

button.setBorderPainted(false);
button.setContentAreaFilled(false);
button.setOpaque(true);

Et après avoir peint l'icône sur l'arrière-plan, le bouton la peint, mais conserve un arrière-plan gris hideux avec des bordures, etc. J'ai également essayé d'utiliser un JLabel et un JButton. J'ai également essayé d'utiliser un JLabel et un JButton et d'y peindre une ImageIcon, mais si l'utilisateur redimensionne ou réduit la fenêtre, les icônes disparaissent !

Comment puis-je résoudre ce problème ?

J'ai juste besoin de peindre et d'arrondir une image dans un JComponent et d'écouter les clics sur cette image...

1voto

Luffy Points 1297

Vous pouvez essayer ce qui suit. Cela fonctionne bien pour moi, et j'ai également rencontré le même problème avec le bouton.

// Jbutton
JButton imageButton = new JButton();

// Buffered Icon
BufferedImage buttonIcon = null;

try {
    // Get the image and set it to the imageicon
    buttonIcon = ImageIO.read(getClass().getClassLoader().getResource("images/login.png"));
}
catch(Exception ex) {

}

// Set the image icon here
imageButton = new JButton(new ImageIcon(buttonIcon));
imageButton.setBorderPainted(false);
imageButton.setContentAreaFilled(false);
imageButton.setFocusPainted(false);
imageButton.setOpaque(false);

1voto

Capta1n_n9m0 Points 3

Je viens d'avoir le même problème et la réponse de @Lalchand m'a inspiré. J'ai créé une classe personnalisée pour les bordures arrondies, qui est en fait une version modifiée de LineBorder classe. Elle dessine deux rectangles : inner y outer . Dans mon cas, il n'y a pas de problème si la bordure est colorée comme un arrière-plan, mais si vous avez besoin de quelque chose d'autre, vous devriez bricoler avec les retenues de inner y outer . Et comme liberté créative, j'ai utilisé le rendu sous-pixel pour des bordures plus lisses.

import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.geom.Path2D;
import java.awt.geom.RoundRectangle2D;

class RoundedBorder extends LineBorder {

    private int radius;
    RoundedBorder(Color c, int thickness, int radius) {
        super(c, thickness, true);
        this.radius = radius;
    }
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
        // adapted code of LineBorder class
        if ((this.thickness > 0) && (g instanceof Graphics2D)) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            Color oldColor = g2d.getColor();
            g2d.setColor(this.lineColor);

            Shape outer;
            Shape inner;

            int offs = this.thickness;
            int size = offs + offs;
            outer = new RoundRectangle2D.Float(x, y, width, height, 0, 0);
            inner = new RoundRectangle2D.Float(x + offs, y + offs, width - size, height - size, radius, radius);
            Path2D path = new Path2D.Float(Path2D.WIND_EVEN_ODD);
            path.append(outer, false);
            path.append(inner, false);
            g2d.fill(path);
            g2d.setColor(oldColor);
        }
    }
}

0voto

Bombe Points 34185

L'opacité doit être fixée à false, de sorte que

button.setOpaque(false);

pourrait déjà être ce que vous souhaitez.

-1voto

Reeba Babu Points 1

Vous pouvez créer une bordure vide pour le bouton comme suit :

button.setBorder(BorderFactory.createEmptyBorder(0,0,0,0));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X