Erstellen einer benutzerdefinierten Schaltfläche in Java mit JButton

Lesezeit: 6 Minuten

Erstellen einer benutzerdefinierten Schaltflache in Java mit JButton
rybl

Ich versuche, eine Schaltfläche zu erstellen, die eine benutzerdefinierte Form (Sechseck) hat, sich aber ansonsten wie ein normaler JButton verhält (dh mit einem ActionListener funktioniert).

Ich habe eine Klasse erstellt, die AbstractButton erweitert, aber es scheint keine Ereignisse an den ActionListener zu senden, wenn ich darauf klicke. Wenn ich die Klasse ändere, um JButton zu erweitern, funktioniert es perfekt, aber es vermasselt die Art und Weise, wie die Schaltfläche angezeigt wird. Ich gehe davon aus, dass es eine Methode gibt, die ich überschreiben muss, damit sie Ereignisse auslöst, aber ich kann nicht herausfinden, was es ist.

  • siehe hier: stackoverflow.com/a/11742552/478765

    – ed22

    25. Mai 2016 um 13:26 Uhr


1646633229 752 Erstellen einer benutzerdefinierten Schaltflache in Java mit JButton
mKorbel

Wenn Sie eine CustomButtonUI erstellen möchten, müssen Sie suchen

  • am tiefsten in die BasicXxxUI.

  • Überschreiben Sie die Liste der Farben von JButton

Beachten Sie, dass dies nicht der Fall ist paintComponent(). Es ist falsch, verwenden Sie einfach die paint() Methode,

Unten ist nur ein einfaches Beispiel, ob das möglich ist (für Metal JButton). Beachten Sie nur für Metal LaF, dass ich so faul bin und es nichts zum Überschreiben von paintText, paintIcon, paintFocus, paintBorder gibt (für alle Funktionen müssen Sie die verfügbaren Methoden von BasicButtonUI überprüfen) und etwas, das ich nur für das ButtonModel verwendet habe mein Genuss.

Schaltflächenbild testen

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.AbstractBorder;
import javax.swing.border.Border;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.metal.MetalButtonUI;

public class TextAreaInButton {

    private JFrame frame = new JFrame("sssssssss");
    private JButton tip1Null = new JButton(" test button ");

    public TextAreaInButton() {
        Border line, raisedbevel, loweredbevel, title, empty;
        line = BorderFactory.createLineBorder(Color.black);
        raisedbevel = BorderFactory.createRaisedBevelBorder();
        loweredbevel = BorderFactory.createLoweredBevelBorder();
        title = BorderFactory.createTitledBorder("");
        empty = BorderFactory.createEmptyBorder(1, 1, 1, 1);
        final Border compound;
        Color crl = (Color.blue);
        compound = BorderFactory.createCompoundBorder(empty, new OldRoundedBorderLine(crl));
        Color crl1 = (Color.red);
        final Border compound1;
        compound1 = BorderFactory.createCompoundBorder(empty, new OldRoundedBorderLine(crl1));
        Color crl2 = (Color.black);
        final Border compound2;
        compound2 = BorderFactory.createCompoundBorder(empty, new OldRoundedBorderLine(crl2));
        tip1Null.setFont(new Font("Serif", Font.BOLD, 14));
        tip1Null.setForeground(Color.darkGray);
        tip1Null.setPreferredSize(new Dimension(50, 30));
        tip1Null.addActionListener(new java.awt.event.ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
            }
        });
        tip1Null.setBorderPainted(true);
        tip1Null.setFocusPainted(false);
        tip1Null.setBorder(compound);
        tip1Null.setHorizontalTextPosition(SwingConstants.CENTER);
        tip1Null.setVerticalTextPosition(SwingConstants.BOTTOM);
        tip1Null.setUI(new ModifButtonUI());

        tip1Null.getModel().addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                ButtonModel model = (ButtonModel) e.getSource();
                if (model.isRollover()) {
                    tip1Null.setBorder(compound1);
                } else {
                    tip1Null.setBorder(compound);
                }
                if (model.isPressed()) {
                    tip1Null.setBorder(compound2);
                }
            }
        });

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(tip1Null, BorderLayout.CENTER);
        frame.setLocation(150, 150);
        frame.setPreferredSize(new Dimension(310, 75));
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                TextAreaInButton taib = new TextAreaInButton();
            }
        });
    }
}

class OldRoundedBorderLine extends AbstractBorder {

    private final static int MARGIN = 5;
    private static final long serialVersionUID = 1L;
    private Color color;

    OldRoundedBorderLine(Color clr) {
        color = clr;
    }

    public void setColor(Color clr) {
        color = clr;
    }

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
        ((Graphics2D) g).setRenderingHint(
            RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(color);
        g.drawRoundRect(x, y, width, height, MARGIN, MARGIN);
    }

    @Override
    public Insets getBorderInsets(Component c) {
        return new Insets(MARGIN, MARGIN, MARGIN, MARGIN);
    }

    @Override
    public Insets getBorderInsets(Component c, Insets insets) {
        insets.left = MARGIN;
        insets.top = MARGIN;
        insets.right = MARGIN;
        insets.bottom = MARGIN;
        return insets;
    }
}

class ModifButtonUI extends MetalButtonUI {

    private static final ModifButtonUI buttonUI = new ModifButtonUI();

    ModifButtonUI() {
    }

    public static ComponentUI createUI(JComponent c) {
        return new ModifButtonUI();
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        final Color color1 = new Color(230, 255, 255, 0);
        final Color color2 = new Color(255, 230, 255, 64);
        final Color alphaColor = new Color(200, 200, 230, 64);
        final Color color3 = new Color(
            alphaColor.getRed(), alphaColor.getGreen(), alphaColor.getBlue(), 0);
        final Color color4 = new Color(
            alphaColor.getRed(), alphaColor.getGreen(), alphaColor.getBlue(), 64);
        super.paint(g, c);
        Graphics2D g2D = (Graphics2D) g;
        GradientPaint gradient1 = new GradientPaint(
            0.0F, (float) c.getHeight() / (float) 2, color1, 0.0F, 0.0F, color2);
        Rectangle rec1 = new Rectangle(0, 0, c.getWidth(), c.getHeight() / 2);
        g2D.setPaint(gradient1);
        g2D.fill(rec1);
        GradientPaint gradient2 = new GradientPaint(
            0.0F, (float) c.getHeight() / (float) 2, color3, 0.0F, c.getHeight(), color4);
        Rectangle rec2 = new Rectangle(0, c.getHeight() / 2, c.getWidth(), c.getHeight());
        g2D.setPaint(gradient2);
        g2D.fill(rec2);
    }

    @Override
    public void paintButtonPressed(Graphics g, AbstractButton b) {
        paintText(g, b, b.getBounds(), b.getText());
        g.setColor(Color.red.brighter());
        g.fillRect(0, 0, b.getSize().width, b.getSize().height);
    }

    public void paintBorder(Graphics g) {
    }

    @Override
    protected void paintFocus(Graphics g, AbstractButton b,
        Rectangle viewRect, Rectangle textRect, Rectangle iconRect) {
    }
}

  • Errrrgh, kann mir jemand erklären, was für ein falscher Zeichen-Split-Code für diese Kreatur ist, kopieren Sie einfach + fügen Sie aus der IDE ein

    – mKorbel

    22. April 2011 um 12:04 Uhr

  • Einfach vier Leerzeichen einrücken, zB NetBeans’ control-shift-right. Wählen Sie im SO-Editor die aus und klicken Sie darauf {} Symbol. +1 Beispiel, übrigens.

    – Insel Catalina

    22. April 2011 um 17:14 Uhr

  • Ich habe alles ausprobiert, was Woodoo aus anderen Foren kennt, vielleicht Stars Imports “*” … etwas stimmt nicht zwischen Händen und meinem Kopf, trotzdem danke

    – mKorbel

    22. April 2011 um 18:30 Uhr

  • Code neu formatiert, um Zeilen wiederherzustellen, die in der vorherigen Bearbeitung verloren gegangen sind; bitte kehren Sie zurück, wenn falsch. Unter Mac OS X habe ich verwendet -Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel um die volle Wirkung zu sehen. Danke für dieses sehr schöne Beispiel. +1

    – Müllgott

    22. April 2011 um 20:24 Uhr

  • Ich habe mir erlaubt, ein Bild von Ihnen hinzuzufügen ButtonUI.

    – Müllgott

    22. April 2011 um 23:57 Uhr

1646633231 53 Erstellen einer benutzerdefinierten Schaltflache in Java mit JButton
Umesh K

Sie müssen verlängern JButton Klasse nicht AbstractButton. Probieren Sie die folgenden Dinge aus, und Sie werden eine Idee bekommen.

Der erste Schritt ist die Unterklasse JButton.

Beginnen Sie dann in Ihrer Unterklasse damit, die neu zu definieren paintComponent(Graphics) Methode. Wenn Sie Änderungen wünschen.

Dann überschreiben paintBorder(Graphics) um ihm die Form eines Sechsecks zu geben.

  • Ich hatte paintComponent und paintBorder bereits neu definiert, aber es zeichnet immer noch einen quadratischen Rahmen, wenn Sie auf eine der Schaltflächen klicken.

    – Rybl

    22. April 2011 um 1:04 Uhr


  • Rufen Sie die Methode super.paintXXX() nach Ihrer benutzerdefinierten Logik oder davor auf?

    – Umesh K

    22. April 2011 um 1:08 Uhr

  • Ich rufe überhaupt nicht super.paint an.

    – Rybl

    22. April 2011 um 1:11 Uhr

  • Habe es gerade herausgefunden … Habe genau das getan, was du gesagt hast, aber auch im Konstruktor hinzugefügt this.setContentAreaFilled(false);

    – Rybl

    22. April 2011 um 1:12 Uhr


Ich weiß, dass diese Frage beantwortet wurde, aber vielleicht möchten Sie sich die Verwendung der integrierten Methoden und die Verwendung von Bildern ansehen, um Ihre Schaltfläche in verschiedenen Zuständen zu zeichnen.

Hier ist ein bisschen Code, den ich verwendet habe, um eine benutzerdefinierte Schaltfläche zu generieren.

BufferedImage startButton = ImageIO.read(getClass().getResource("/icons/standard/buttons/start_backup.png"));
BufferedImage startButtonHover = ImageIO.read(getClass().getResource("/icons/standard/buttons/start_backup_hover.png"));
BufferedImage startButtonActive = ImageIO.read(getClass().getResource("/icons/standard/buttons/start_backup_active.png"));

JButton startBackupButton = new JButton(new ImageIcon(startButton));
startBackupButton.setRolloverIcon(new ImageIcon(startButtonHover));
startBackupButton.setPressedIcon(new ImageIcon(startButtonActive));
startBackupButton.setBorder(BorderFactory.createEmptyBorder());
startBackupButton.setContentAreaFilled(false);
startBackupButton.setFocusable(false);

Sie können ihm dann wie gewohnt einen Aktions-Listener hinzufügen.

Probieren Sie ein Jlabel aus und verwenden Sie ein Bild für eine beliebige Form!

    JLabel lbl = new JLabel("");
    lbl.setIcon(new ImageIcon("shape.png"));
    lbl.setBounds(548, 11, 66, 20);
    contentPane.add(lbl);

    lbl.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent arg0) {
            System.exit(0);
        }
    });

963430cookie-checkErstellen einer benutzerdefinierten Schaltfläche in Java mit JButton

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy