Pregunta

Esta es una continuación de la pregunta ??" Java redondeado Swing JButton " . He buscado una extensión de javax.swing.JButton que heredará todo el comportamiento en tiempo de ejecución y simplemente anulará el dibujo de las esquinas.

Usando el código proporcionado por noah.w en página de foros de Sun el resultado es el siguiente:

 texto alternativo

Me gustaría poder tener el mismo gradiente en el fondo, con el mouse sobre el cambio, etc. ¿Alguien sabe cómo hacer eso?

El código que crea la ventana Java Swing de la imagen es:

public class XrButton extends JButton implements MouseListener {

    private static final long serialVersionUID = 9032198251140247116L;

    String text;
    boolean mouseIn = false;

    public XrButton(String s) {
        super(s);
        text = s;
        setBorderPainted(false);
        addMouseListener(this);
        setContentAreaFilled(false);
    }

    @Override
    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        if (getModel().isPressed()) {
            g.setColor(g.getColor());
            g2.fillRect(3, 3, getWidth() - 6, getHeight() - 6);
        }
        super.paintComponent(g);

        if (mouseIn)
            g2.setColor(Color.red);
        else
            g2.setColor(new Color(128, 0, 128));

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(1.2f));
        g2.draw(new RoundRectangle2D.Double(1, 1, (getWidth() - 3),
                (getHeight() - 3), 12, 8));
        g2.setStroke(new BasicStroke(1.5f));
        g2.drawLine(4, getHeight() - 3, getWidth() - 4, getHeight() - 3);

        g2.dispose();
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.getContentPane().setLayout(new FlowLayout());

        XrButton xrButton = new XrButton("XrButton");
        JButton jButton = new JButton("JButton");

        frame.getContentPane().add(xrButton);

        frame.getContentPane().add(jButton);

        frame.setSize(150, 150);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public void mouseClicked(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
        mouseIn = true;
    }

    public void mouseExited(MouseEvent e) {
        mouseIn = false;
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }
¿Fue útil?

Solución

Creo que tienes 2 opciones aquí:

1.Implemente dibujándote en un método de pintura de tu componente

2.Cree un nuevo ButtonUI para su apariencia. En este caso, sugeriría usar Synch LAF

En ambos casos, dibujar su estado diferente es su responsabilidad

Otros consejos

La mejor implementación que he visto de botones redondeados en Swing está en la apariencia de la sustancia:

https://substance.dev.java.net/

No todos los temas tienen botones redondeados, por lo que es posible que deba cambiar los valores predeterminados en la demostración. El proyecto es de código abierto, por lo que podría valer la pena buscar algunas ideas en el código.

También necesitaba hacer esto, esto es con lo que terminé (¡solo Metal LAF!)

@Override
    protected void paintComponent(Graphics g)
    {
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
        Shape firstClip = g.getClip();
        RoundRectangle2D rect = new RoundRectangle2D.Double();
        double arc = Math.ceil(getSize().getHeight()/3);
        rect.setRoundRect(0, 0, Math.ceil(getSize().getWidth()), Math.ceil(getSize().getHeight()), arc, arc);
        Area secondClip = new Area(getBounds());
        secondClip.subtract(new Area(rect));
        Area finalClip = new Area(firstClip);
        finalClip.subtract(secondClip);
        g2.setClip(finalClip);
        super.paintComponent(g2);
        Color[] gradients;
        if(getModel().isRollover())
        {
            gradients = new Color[] { new Color(184, 207, 229), new Color(122, 138, 153), new Color(184, 207, 229) };
        }
        else
        {
            gradients = new Color[] { new Color(122, 138, 153) };
        }
        for(int i = 0; i < gradients.length; i++)
        {
            arc -= 2;
            g2.setColor(gradients[i]);
            g2.drawRoundRect(i+1, i+1, (int)Math.ceil(getSize().getWidth()-2)-(i*2), (int)Math.ceil(getSize().getHeight()-2)-(i*2), (int)arc, (int)arc);
        }
    }

Que se parece a esto: http://i.stack.imgur.com/unZuc.png

Tienes que cuidarlo tú solo:

  • en primer lugar, puede detectar todo tipo de acción que se usa en el botón para cambiar el estado (como en el código, donde mouseIn se usa para cambiar un color)
  • entonces debe preocuparse por cada detalle de pintura que necesita, por ejemplo, para degradados, debe apuntar a la clase GradientPaint que se usa para dibujar degradados ...

Por cierto, tenga en cuenta que debe cuidar varios aspectos y que su solución se ajustará a uno de estos ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top