Creando un botón personalizado en Java con JButton

6 minutos de lectura

Creando un boton personalizado en Java con JButton
rybl

Estoy tratando de crear un botón que tenga una forma personalizada (hexágono), pero que por lo demás actúe como lo haría un JButton normal (es decir, funciona con un ActionListener).

Creé una clase que extiende AbstractButton, pero no parece estar enviando eventos a ActionListener cuando hago clic en él. Si cambio la clase para extender JButton, funciona perfectamente, pero arruina la forma en que se muestra el botón. Supongo que hay un método que debo anular para que active los eventos, pero no puedo entender cuál es.

  • ver aquí: stackoverflow.com/a/11742552/478765

    – ed22

    25 de mayo de 2016 a las 13:26


1646959745 494 Creando un boton personalizado en Java con JButton
mKorbel

Si desea crear un CustomButtonUI, debe buscar

  • más profundo a la BasicXxxUI.

  • anular la lista de colores de JButton

Tenga en cuenta que no hay paintComponent(). Está mal, solo usa el paint() método,

A continuación se muestra un ejemplo simple si eso es posible (para Metal JButton). Tenga en cuenta que solo para Metal LaF, soy muy perezoso y no hay nada sobre anular paintText, paintIcon, paintFocus, paintBorder (para todas las funcionalidades, debe verificar los métodos disponibles desde BasicButtonUI), y algo que puse en el ButtonModel, solo para mi disfrute

imagen del botón de prueba

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, ¿alguien puede explicarme, qué código de división de caracteres incorrecto(s) para esta criatura, simplemente copie y pegue desde IDE?

    – mKorbel

    22 de abril de 2011 a las 12:04

  • Solo sangría cuatro espacios, por ejemplo, NetBeans’ control-shift-right. En el editor SO, seleccione y haga clic en el {} icono. +1 ejemplo, por cierto.

    – Isla Catalina

    22 de abril de 2011 a las 17:14

  • Intenté todo lo que sabe woodoo de otros foros, tal vez Stars Imports “*” … algo anda mal entre las manos y la cabeza, de todos modos gracias

    – mKorbel

    22 de abril de 2011 a las 18:30

  • Código reformateado para restaurar las líneas perdidas en la edición anterior; por favor revertir si es incorrecto. En Mac OS X, usé -Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel para ver el efecto completo. Gracias por este muy buen ejemplo. +1

    – dios de la basura

    22 de abril de 2011 a las 20:24

  • Me tomé la libertad de agregar una imagen de su ButtonUI.

    – dios de la basura

    22 de abril de 2011 a las 23:57

1646959746 565 Creando un boton personalizado en Java con JButton
Umesh K

Tendrás que extender JButton clase no AbstractButton. Prueba las siguientes cosas y tendrás una idea.

El primer paso es a la subclase. JButton.

Luego, en su subclase, comience por redefinir el paintComponent(Graphics) método. Si quieres algún cambio.

Entonces, anule paintBorder(Graphics) para darle forma de hexágono.

  • Ya había redefinido paintComponent y paintBorder, pero todavía pinta un borde cuadrado si hace clic en uno de los botones.

    – rybl

    22 de abril de 2011 a las 1:04


  • ¿Está llamando al método super.paintXXX() después de su lógica personalizada o antes?

    – Umesh K.

    22 de abril de 2011 a las 1:08

  • No estoy llamando a super.paint en absoluto.

    – rybl

    22 de abril de 2011 a las 1:11

  • Lo descubrí… Hice exactamente lo que dijiste pero también en el constructor agregado this.setContentAreaFilled(false);

    – rybl

    22 de abril de 2011 a las 1:12


Sé que esta pregunta ha sido respondida, pero es posible que desee ver el uso de los métodos integrados y el uso de imágenes para dibujar su botón en diferentes estados.

Aquí hay un poco de código que usé para generar un botón personalizado.

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);

Luego puede agregarle un oyente de acción como de costumbre.

prueba un Jlabel y usa una imagen para cualquier forma!!

    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);
        }
    });

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad