문제

이것은 질문의 연속입니다 "Java Rounded Swing Jbutton". Javax.swing.jbutton의 확장을 검색하여 모든 런타임 동작을 물려 받고 코너의 그리기를 무시합니다.

주어진 코드를 사용합니다 노아 .W ~에 선 포럼 페이지 결과는 다음과 같습니다.

alt text

백그라운드에서 동일한 그라디언트, 변화에 대한 마우스에서 같은 그라디언트를 가질 수 있기를 원합니다. 아무도 그렇게하는 방법을 알고 있습니까?

그림에서 Java 스윙 창을 만드는 코드는 다음과 같습니다.

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) {
    }
도움이 되었습니까?

해결책

여기에는 두 가지 선택이 있다고 생각합니다.

1. 구성 요소의 페인트 방법으로 자신을 그리는 이식

2. 당신의 외모와 느낌을 위해 새로운 buttonui를 생성하십시오. 이 경우 Synch LAF를 사용하는 것이 좋습니다.

두 경우 모두 다른 상태를 그리는 것은 귀하의 책임입니다

다른 팁

스윙에서 둥근 버튼에서 본 최고의 구현은 물질 모양과 느낌입니다.

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

모든 테마에 둥근 버튼이있는 것은 아니므로 데모의 기본값을 변경해야 할 수도 있습니다. 이 프로젝트는 오픈 소스이므로 일부 아이디어에 대한 코드에서 찌르는 가치가있을 수 있습니다.

나는 이것을 만들어야했다. 이것은 내가 끝난 것입니다 (금속 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

직접 돌봐야합니다.

  • 우선, 버튼에 사용되는 모든 종류의 동작을 잡을 수 있습니다 (코드에서와 같이 마우스 인은 색상을 변경하는 데 사용됩니다).
  • 그런 다음 필요한 모든 단일 페인트 세부 사항에 대해 신경을 써야합니다. GradientPaint 그라디언트를 그리는 데 사용됩니다 ..

그건 그렇고, 당신은 다양한 외관을 돌보아야하고 솔루션은 이것들 중 하나에 맞는다는 것을 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top