سؤال

وهذا استمرار للسؤال "Java تقريب Swing JButton".لقد بحثت عن امتداد javax.swing.JButton الذي سيرث جميع سلوكيات وقت التشغيل ويتجاوز فقط رسم الزوايا.

باستخدام الكود الذي قدمه نوح. دبليو على صفحة منتديات الشمس النتيجة تبدو مثل هذا:

alt text

أود أن أكون قادرًا على الحصول على نفس التدرج في الخلفية، عند تغيير الماوس وما إلى ذلك.هل هناك احد يعلم كيف يفعل هذا؟

الكود الذي ينشئ نافذة 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) {
    }
هل كانت مفيدة؟

المحلول

أعتقد أن لديك خيارين هنا:

1. قم بتنفيذ رسم نفسك بطريقة طلاء المكون الخاص بك

2. قم بإنشاء ButtonUI جديد لمظهرك ومظهرك.في هذه الحالة أقترح استخدام Synch LAF

في كلتا الحالتين، فإن رسم حالات مختلفة هو مسؤوليتك

نصائح أخرى

أفضل تنفيذ رأيته للأزرار المستديرة في Swing هو شكل ومظهر Substance:

https://substance.dev.Java.net/

لا تحتوي جميع السمات على أزرار مستديرة، لذا قد تحتاج إلى تغيير الإعدادات الافتراضية في العرض التوضيحي.المشروع مفتوح المصدر لذا قد يكون من المفيد البحث في الكود للحصول على بعض الأفكار.

كنت بحاجة إلى القيام بذلك أيضًا، وهذا ما انتهى بي الأمر به (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);
        }
    }

الذي يبدو مثل هذا:http://i.stack.imgur.com/unZuc.png

عليك أن تهتم بها بنفسك:

  • أولاً وقبل كل شيء، يمكنك التعرف على كل نوع من الإجراءات التي يتم استخدامها على الزر لتغيير الحالة (كما هو الحال في الكود، حيث يتم استخدام mouseIn لتغيير اللون)
  • ثم عليك أن تهتم بكل تفاصيل الطلاء التي تحتاجها، على سبيل المثال بالنسبة للتدرجات اللونية التي يجب عليك الإشارة إليها GradientPaint الذي يستخدم لرسم التدرجات ..

بالمناسبة، عليك أن تهتم بمختلف الأشكال والمظهر وأن الحل الخاص بك سوف يناسب واحدًا فقط من هذه العناصر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top