3

これは、質問「Java rounded Swing JButton」の続きです。すべてのランタイム動作を継承し、コーナーの描画をオーバーライドする javax.swing.JButton の拡張機能を検索しました。

sun フォーラム ページでnoah.wによって提供されたコードを使用すると、結果は次のようになります。

代替テキスト

マウスオーバーの変更などで、背景に同じグラデーションを使用できるようにしたいのですが、その方法を知っている人はいますか?

画像から Java Swing ウィンドウを作成するコードは次のとおりです。

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) {
    }
4

4 に答える 4

1

これも作る必要がありましたが、最終的にはこれになりました (メタル 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);
        }
    }

次のようになります: http://i.stack.imgur.com/unZuc.png

于 2011-04-28T16:33:57.643 に答える
1

Swing の丸みを帯びたボタンについて私が見た中で最も優れた実装は、Substance のルック アンド フィールにあります。

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

すべてのテーマに丸いボタンがあるわけではないため、デモでデフォルトを変更する必要がある場合があります。このプロジェクトはオープン ソースであるため、いくつかのアイデアについてコードを調べてみる価値があるかもしれません。

于 2009-06-17T14:35:17.500 に答える
1

ここには2つの選択肢があると思います:

1.コンポーネントのペイントメソッドで自分自身の描画を実装する

2. ルック アンド フィール用の新しい ButtonUI を作成します。この場合、同期LAFを使用することをお勧めします

どちらの場合も、異なる状態を描くのはあなたの責任です

于 2009-06-17T14:09:52.060 に答える
0

あなたは自分でそれを気にする必要があります:

  • まず第一に、状態を変更するためにボタンで使用されるあらゆる種類のアクションをキャッチできます (コードのように、mouseIn を使用して色を変更します)。
  • 次に、必要なすべてのペイントの詳細に注意する必要があります。たとえば、グラデーションの場合、グラデーションのGradientPaint描画に使用されるクラスを指す必要があります..

ところで、さまざまなルック アンド フィールに注意する必要があり、ソリューションはこれらの 1 つだけに適合することに注意してください。

于 2009-06-17T14:08:29.863 に答える