Question

C’est la suite de la question ??"Java arrondi Swing JButton" . J'ai cherché une extension de javax.swing.JButton qui héritera de tous les comportements d'exécution et remplacera simplement le dessin des coins.

Utilisation du code fourni par noah.w sur page des forums Sun , le résultat est le suivant:

 alt text

J'aimerais pouvoir avoir le même dégradé en arrière-plan, au changement de souris, etc. Quelqu'un sait-il comment faire cela?

Le code qui crée la fenêtre Java Swing à partir de l'image est:

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) {
    }
Était-ce utile?

La solution

Je pense que vous avez 2 choix ici:

1.Implémenter vous-même dans une méthode de peinture de votre composant

2.Créez un nouveau ButtonUI pour votre apparence. Dans ce cas, je suggérerais d’utiliser Synch LAF

Dans les deux cas, attribuer des états différents est votre responsabilité

Autres conseils

La meilleure mise en œuvre des boutons arrondis que j'ai vue dans Swing concerne l'apparence de la substance:

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

Tous les thèmes n’ont pas de boutons arrondis, vous devrez peut-être modifier les valeurs par défaut dans la démo. Le projet est open source, il vaut donc peut-être la peine de fouiller dans le code pour trouver des idées.

J'avais besoin de faire ça aussi, c'est ce avec quoi j'ai fini (Metal LAF seulement!)

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

Qui ressemble à ceci: http://i.stack.imgur.com/unZuc.png

Vous devez en prendre soin vous-même:

  • tout d’abord, vous pouvez capturer tous les types d’actions utilisées sur le bouton pour changer l’état (comme dans le code, où mouseIn est utilisé pour changer une couleur)
  • alors vous devez vous soucier de chaque détail de peinture dont vous avez besoin, par exemple pour les dégradés, vous devez pointer vers la classe GradientPaint utilisée pour dessiner les dégradés.

En passant, sachez que vous devez prendre en charge différents aspects et que votre solution ne correspond qu’à l’une de ces solutions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top