Frage

Dies ist eine Fortsetzung der Frage "Java gerundet Swing JButton".Ich habe gesucht für eine Erweiterung von javax.swing.JButton, die Erben werden alle runtime-Verhalten und nur überschreiben Sie die Zeichnung die Ecken.

Verwenden Sie den code gegeben durch noah.w auf Sonne Foren Seite das Ergebnis sieht wie folgt aus:

alt text

Ich möchte in der Lage sein, den gleichen Verlauf in den hintergrund, wenn Sie mit der Maus über die änderung etc.Weiß jemand, wie das zu tun?

Code wird erstellt, und die Java Swing-Fenster aus dem Bild ist:

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) {
    }
War es hilfreich?

Lösung

Ich glaube, du hast 2 Möglichkeiten hier:

1.Implementieren Sie zeichnen sich in einer paint-Methode der Komponente

2.Erstellen Sie neue ButtonUI für Sie Ihr Aussehen und fühlen.In diesem Fall würde ich vorschlagen, zu verwenden Synch LAF

In beiden Fällen zeichnen von verschiedenen Staaten Ihre Verantwortung

Andere Tipps

Die beste Implementierung, die ich gesehen habe, abgerundete Schaltflächen in Swing sind in der Substanz Aussehen und fühlen sich:

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

Nicht alle Themen haben abgerundete Tasten, so dass Sie kann brauchen, um die Standardwerte zu ändern, in der demo.Das Projekt ist open source, so dass es sich lohnen könnte, stochern in den code für einige Ideen.

Ich brauchte dies, so gut, das ist, was ich am Ende mit (Metall-LAF only!)

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

Die sieht wie folgt aus:http://i.stack.imgur.com/unZuc.png

Sie müssen es selbst:

  • erste von alle Sie fangen kann jede Art von Aktion, die ist verwendet auf die Schaltfläche, um den Status zu ändern (wie im code, wo mouseIn wird verwendet, um ändern eine Farbe)
  • dann Sie haben zu Pflege über jedes einzelne paint Details, die Sie brauchen, zum Beispiel für Steigungen, sollten Sie Punkt-zu-Klasse GradientPaint , dass ist verwendet zu ziehen Gradienten..

Übrigens daran, dass Sie kümmern sich um verschiedene look-and-feel und Ihre Lösung passt nur eine dieser..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top