25 Stimmen

Abgerundeter Swing JButton mit Java

Nun, ich habe ein Bild, das ich als Hintergrund für eine Schaltfläche (oder etwas ähnliches) verwenden möchte. Das Problem ist, dass dieses Bild ist rund, so muss ich dieses Bild, ohne Grenzen, etc. zeigen.

Die JComponent, die diese Schaltfläche enthält, hat einen benutzerdefinierten Hintergrund, so dass die Schaltfläche wirklich nur das Bild anzeigen muss.

Nach einer Google-Suche konnte ich das nicht erreichen. Ich habe alles Folgende versucht, aber ohne Erfolg:

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

Und nachdem ich das Symbol auf den Hintergrund gemalt habe, malt die Schaltfläche es zwar, hat aber einen hässlichen grauen Hintergrund mit Rändern usw. Ich habe auch versucht, ein JLabel und einen JButton zu verwenden. Und ein ImageIcon darauf zu malen, aber wenn der Benutzer die Größe ändert oder das Fenster minimiert, verschwinden die Icons!

Wie kann ich das beheben?

Ich muss nur ein Bild auf eine JComponent malen und abrunden und auf Klicks darauf warten...

26voto

Lalchand Punkte 7327

Erstellen Sie einen neuen 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);

beim Einstellen des Rahmens für eine JButton, rufen Sie die überschriebene javax.swing.border.Border Klasse.

addBtn.setBorder(new RoundedBorder(10));

Hier ist die Klasse

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 Punkte 1117238

Haben Sie Folgendes versucht?

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

setBorder(null) könnte funktionieren, aber es gibt ein bei Sun beschriebener Fehler erklärt, dass die Benutzeroberfläche eine Umrandung für eine Komponente festlegt, es sei denn, der Client legt eine Umrandung fest, die nicht null ist und die nicht die UIResource Schnittstelle.

Anstatt dass das JDK selbst die Grenze auf eine EmptyBorder wenn null übergeben wird, sollten die Clients ein EmptyBorder selbst (eine sehr einfache Umgehung). Auf diese Weise gibt es keine Verwirrung darüber, wer was im Code tut.

3voto

Luka Kralj Punkte 416

Ich habe einen OvalButton Klasse, die ovale, kreisförmige und kapselartige JButtons verarbeiten kann.

In Ihrem Fall sollten Sie die OvalButton Klasse und überschreiben Sie getBackgroundImage() Methode, um das Bild zurückzugeben, das Sie als Hintergrund festlegen möchten. Fügen Sie dann wie gewohnt Hörer und Text hinzu. Nur ein Klick auf den ovalen/kreisförmigen Bereich löst die Aktion aus.

Beispiel für Ihre Schaltflächenklasse:

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 Punkte 17319

Ich würde empfehlen, die Methode paint(Graphics g) so zu überschreiben:

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. Ziehen Sie eine normale Schaltfläche auf Ihr Bedienfeld

  2. Klicken Sie mit der rechten Maustaste auf Ihre Schaltfläche und gehen Sie zu Eigenschaften:

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

  3. Legen Sie ein (Symbol) und ein (RolloverIcon) fest, indem Sie es in das Projekt importieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X