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...

27voto

Lalchand Points 1627

Créer un nouveau Jbutton :

    JButton addBtn = new JButton("+");
    addBtn.setBounds(x_pos, y_pos, 30, 25);
    addBtn.setBorder(new RoundedBorder(10)); //10 is the radius
    addBtn.setForeground(Color.BLUE);

lors de la définition de la bordure d'un JButton, appeler la fonction surchargée javax.swing.border.Border classe.

addBtn.setBorder(new RoundedBorder(10));

Voici la classe

private static class RoundedBorder implements Border {

    private int radius;

    RoundedBorder(int radius) {
        this.radius = radius;
    }

    public Insets getBorderInsets(Component c) {
        return new Insets(this.radius+1, this.radius+1, this.radius+2, this.radius);
    }

    public boolean isBorderOpaque() {
        return true;
    }

    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
        g.drawRoundRect(x, y, width-1, height-1, radius, radius);
    }
}

14voto

VonC Points 414372

Avez-vous essayé ce qui suit ?

button.setOpaque(false);
button.setFocusPainted(false);
button.setBorderPainted(false);
button.setContentAreaFilled(false);
setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); // Especially important

setBorder(null) pourrait fonctionner, mais il y a un bogue décrit chez Sun expliquant qu'il est prévu que l'interface utilisateur définisse une bordure sur un composant à moins que le client ne définisse une bordure non nulle qui n'implémente pas la fonction UIResource l'interface.

Plutôt que le JDK lui-même définisse la bordure comme un EmptyBorder lorsque null est transmis, les clients doivent définir une valeur de EmptyBorder eux-mêmes (une solution de contournement très simple). De cette manière, il n'y a pas de confusion sur qui fait quoi dans le code.

3voto

Luka Kralj Points 326

J'ai écrit un Bouton ovale qui peut gérer les boutons JB ovales, circulaires et en forme de capsule.

Dans votre cas, étendez le Bouton ovale et surcharger la classe getBackgroundImage() pour renvoyer l'image que vous souhaitez définir comme arrière-plan. Ajoutez ensuite des auditeurs et du texte comme d'habitude. Seul un clic sur la zone ovale/circulaire déclenche l'action.

Exemple de votre classe de boutons :

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ImageButton extends OvalButton {

    private BufferedImage image;

    public ImageButton() {
        super(); // Default is oval/circle shape.

        setBorderThickness(0); // Oval buttons have some border by default.

        try {
            image = ImageIO.read(new File("your_image.jpg")); // Replace with the path to your image.
        } 
        catch (IOException e) {
            e.printStackTrace();
            image = null;
        }
    }

    @Override
    protected BufferedImage getBackgroundImage() {
        return image;
    }
}

1voto

pek Points 6412

Je recommanderais de surcharger la méthode paint(Graphics g) comme suit :

class JImageButton extends JComponent implements MouseListener {
    private BufferedImage img = null;

    public JImageButton(BufferedImage img) {
        this.img = img;
        setMinimumSize(new Dimension(img.getWidth(), img.getHeight()));
        setOpaque(false);
        addMouseListener(this);
    }

    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), null);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }
}

1voto

  1. Faites glisser un bouton normal vers votre panneau

  2. Cliquez avec le bouton droit de la souris sur votre bouton et allez dans les propriétés :

    border = no border border painted = false contentAreaFilled = false focusPainted = false opaque = false

  3. Définir une (icône) et une (rolloverIcon) en les important dans le projet.

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