Estoy tratando de crear un botón que tiene una forma personalizada (hexágono), pero de otra forma actúa como una normal JButton sería (es decir, funciona con un ActionListener).

He creado una clase que extiende AbstractButton, pero no parece ser el envío de eventos a la ActionListener cuando hago clic en él. Si puedo cambiar la clase para ampliar JButton funciona perfectamente, pero tornillos de la manera que el botón se muestra. Estoy suponiendo que no hay un método que necesito para reemplazar a llegar a desencadenar eventos, pero no puedo averiguar qué es.

InformationsquelleAutor rybl | 2011-04-22

4 Comentarios

  1. 17

    Tendrá que ampliar JButton clase no AbstractButton. Pruebe las siguientes cosas y obtendrá idea.

    El primer paso es la subclase JButton.

    A continuación, en la subclase, empezar por redefinir la paintComponent(Graphics) método. Si desea algún cambio.

    A continuación, reemplazar paintBorder(Graphics) para darle una forma de hexágono.

    • Yo ya había redefinido paintComponent y paintBorder, pero todavía se pinta un cuadrado frontera si hace clic en uno de los botones.
    • Está usted de llamar a super.paintXXX() método después de su personalizados lógica o antes?
    • Yo no soy de llamar a super.pintura en absoluto.
    • Sólo figgured a cabo… Hizo exactamente lo que dijo, sino también en el constructor añadido this.setContentAreaFilled(false);
  2. 51

    Si quieres crear un CustomButtonUI, a continuación, usted tiene que mirar

    Nota no hay paintComponent(). Es malo, sólo tiene que utilizar el paint() método,

    A continuación es sólo un ejemplo sencillo, si eso es posible (para Metal JButton). Nota sólo para Metal LaF, soy tan perezoso y no hay algo acerca de reemplazar paintText, paintIcon, paintFocus, paintBorder (para todas las funcionalidades que usted tiene que comprobar los métodos disponibles de BasicButtonUI), y algo que me puso a la ButtonModel, solo para mi disfrute.

    Creación de un botón personalizado en Java con JButton

    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, me puede alguien explicar mí, de lo mal caracter(s) de código dividida a esta criatura, solo tienes que copiar + pegar desde el IDE
    • Sólo sangría de cuatro espacios, por ejemplo, NetBeans’ control-shift-right. En el MODO editor, seleccione y haga clic en el {} icono. +1 ejemplo, btw.
    • He intentado todo lo que sabe woodoo de otro Foros, tal vez las Estrellas de las Importaciones «*» … algo malo entre las manos y la cabeza, de todos modos gracias
    • Formatear código para restaurar las líneas perdido en la anterior edición, por favor volver si es incorrecta. En Mac OS X, he utilizado -Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel para ver el efecto completo. Gracias por este muy buen ejemplo. +1
    • Me tomé la libertad de añadir una imagen de su ButtonUI.
    • -1 de cada componente de interfaz de usuario delegado es siempre es una mala idea (no sobrevivir a un cambio de LAF), especialmente si el efecto puede ser logrado sin retorcer el delegado. Además el resultado visual es … ejem .. subóptima (tengo que admitir que no indagar en el por qué): f.yo. deje que el botón se mostrará en un padre con un fondo verde y un diseño que respeta pref: el texto se trunca y el botón llena su completa área rectangular
    • href=»http://stackoverflow.com/a/5845007/714968″>estoy seguro de que usted se olvidó de mirar aquí, esta es la misma

  3. 13

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

    Aquí es un poco de código que he usado 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);

    A continuación, puede agregar una acción oyente como normal.

  4. 7

    trate de un Jlabel y utilizar una imagen de 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);
    }
    });

Dejar respuesta

Please enter your comment!
Please enter your name here