Domanda

Questa è una continuazione della domanda ??" Java arrotondato Swing JButton " . Ho cercato un'estensione di javax.swing.JButton che erediterà tutto il comportamento di runtime e sovrascriverà il disegno degli angoli.

Utilizzo del codice fornito da noah.w su pagina dei forum sun il risultato è simile al seguente:

 alt text

Mi piacerebbe essere in grado di avere lo stesso gradiente sullo sfondo, al passaggio del mouse sul cambiamento, ecc. Qualcuno sa come farlo?

Il codice che crea la finestra Swing Java dall'immagine è:

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) {
    }
È stato utile?

Soluzione

Penso che tu abbia 2 scelte qui:

1.Implementarsi disegnando un metodo di pittura del componente

2.Crea il nuovo ButtonUI per il tuo aspetto. In questo caso, suggerirei di utilizzare Synch LAF

In entrambi i casi, la tua resposibilità è disegnata in diversi stati

Altri suggerimenti

La migliore implementazione che ho visto dei pulsanti arrotondati in Swing è nel look and feel della sostanza:

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

Non tutti i temi hanno pulsanti arrotondati, quindi potrebbe essere necessario modificare i valori predefiniti nella demo. Il progetto è open source, quindi potrebbe valere la pena cercare nel codice alcune idee.

Avevo bisogno di fare anche questo, questo è quello con cui sono finito (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);
        }
    }

Che assomiglia a questo: http://i.stack.imgur.com/unZuc.png

Devi preoccupartene da solo:

  • prima di tutto puoi catturare ogni tipo di azione che viene usata sul pulsante per cambiare lo stato (come nel codice, dove mouseIn viene usato per cambiare un colore)
  • quindi devi preoccuparti di ogni singolo dettaglio di vernice di cui hai bisogno, ad esempio per i gradienti che dovresti puntare alla classe GradientPaint che viene usata per disegnare i gradienti ..

A proposito, devi occuparti di vari aspetti e che la tua soluzione si adatti solo a uno di questi ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top