سؤال

هل هناك طريقة لإنشاء JButton مع رسم الزر الخاص بك وليس فقط مع صورة داخل الزر؟

إذا لم يكن الأمر كذلك، هل هناك طريقة أخرى لإنشاء مخصص JButton في جافا؟

هل كانت مفيدة؟

المحلول

عندما كنت أتعلم Java لأول مرة، كان علينا أن نصنع Yahtzee واعتقدت أنه سيكون من الرائع إنشاء مكونات وحاويات Swing مخصصة بدلاً من مجرد رسم كل شيء على قطعة واحدة JPanel.فائدة التمديد Swing تتمثل المكونات، بالطبع، في القدرة على إضافة دعم لاختصارات لوحة المفاتيح وميزات إمكانية الوصول الأخرى التي لا يمكنك القيام بها بمجرد وجود paint() طريقة طباعة صورة جميلة.ومع ذلك، قد لا يتم ذلك بأفضل طريقة، ولكنه قد يكون نقطة انطلاق جيدة بالنسبة لك.

تحرير 8/6 - إذا لم يكن الأمر واضحًا من الصور، فكل قالب هو زر يمكنك النقر عليه.سيؤدي هذا إلى نقله إلى DiceContainer أقل.بالنظر إلى الكود المصدري، يمكنك أن ترى أن كل زر Die يتم رسمه ديناميكيًا، بناءً على قيمته.

alt text
alt text
alt text

وهنا هي الخطوات الأساسية:

  1. إنشاء فئة تمتد JComponent
  2. استدعاء المنشئ الأصل super() في الصانعين الخاص بك
  3. تأكد من تنفيذ الفصل MouseListener
  4. ضع هذا في المنشئ:

    enableInputMethods(true);   
    addMouseListener(this);
    
  5. تجاوز هذه الأساليب:

    public Dimension getPreferredSize()  
    public Dimension getMinimumSize()  
    public Dimension getMaximumSize()
    
  6. تجاوز هذه الطريقة:

    public void paintComponent(Graphics g)
    

يتم تحديد مقدار المساحة التي يتعين عليك العمل بها عند رسم الزر الخاص بك getPreferredSize(), ، على افتراض getMinimumSize() و getMaximumSize() إرجاع نفس القيمة.لم أجرب هذا كثيرًا، ولكن اعتمادًا على التخطيط الذي تستخدمه لواجهة المستخدم الرسومية الخاصة بك، قد يبدو الزر مختلفًا تمامًا.

وأخيرا، مصدر الرمز.في حالة فاتني أي شيء.

نصائح أخرى

نعم هذا ممكن.أحد المزايا الرئيسية لاستخدام Swing هو السهولة التي يمكن من خلالها إنشاء عناصر التحكم المجردة ومعالجتها.

فيما يلي طريقة سريعة وقذرة لتوسيع فئة JButton الموجودة لرسم دائرة على يمين النص.

package test;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;

public class MyButton extends JButton {

    private static final long serialVersionUID = 1L;

    private Color circleColor = Color.BLACK;

    public MyButton(String label) {
        super(label);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Dimension originalSize = super.getPreferredSize();
        int gap = (int) (originalSize.height * 0.2);
        int x = originalSize.width + gap;
        int y = gap;
        int diameter = originalSize.height - (gap * 2);

        g.setColor(circleColor);
        g.fillOval(x, y, diameter, diameter);
    }

    @Override
    public Dimension getPreferredSize() {
        Dimension size = super.getPreferredSize();
        size.width += size.height;
        return size;
    }

    /*Test the button*/
    public static void main(String[] args) {
        MyButton button = new MyButton("Hello, World!");

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);

        Container contentPane = frame.getContentPane();
        contentPane.setLayout(new FlowLayout());
        contentPane.add(button);

        frame.setVisible(true);
    }

}

لاحظ أنه من خلال التجاوز PaintComponent أنه يمكن تغيير محتويات الزر، ولكن يتم رسم الحدود بواسطة PaintBorder طريقة.ال getPreferredSize يجب أيضًا إدارة الطريقة لدعم التغييرات في المحتوى ديناميكيًا.يجب توخي الحذر عند قياس مقاييس الخط وأبعاد الصورة.

لإنشاء عنصر تحكم يمكنك الاعتماد عليه، فإن التعليمات البرمجية أعلاه ليست هي الطريقة الصحيحة.الأبعاد والألوان ديناميكية في Swing وتعتمد على الشكل والمظهر المستخدم.وحتى الافتراضي معدن لقد تغير المظهر عبر إصدارات JRE.سيكون من الأفضل التنفيذ زر الملخص وتتوافق مع الإرشادات التي حددتها Swing API.نقطة البداية الجيدة هي النظر إلى javax.swing.LookAndFeel و javax.swing.UIManager الطبقات.

http://docs.Oracle.com/javase/8/docs/api/javax/swing/LookAndFeel.html

http://docs.Oracle.com/javase/8/docs/api/javax/swing/UIManager.html

إن فهم تشريح LookAndFeel مفيد في كتابة عناصر التحكم:إنشاء مظهر ومظهر مخصصين

يمكنك دائمًا تجربة شكل ومظهر Synth.يمكنك توفير ملف xml الذي يعمل كنوع من ورقة الأنماط، بالإضافة إلى أي صور تريد استخدامها.قد يبدو الرمز كما يلي:

try {
    SynthLookAndFeel synth = new SynthLookAndFeel();
    Class aClass = MainFrame.class;
    InputStream stream = aClass.getResourceAsStream("\\default.xml");

    if (stream == null) {
        System.err.println("Missing configuration file");
        System.exit(-1);                
    }

    synth.load(stream, aClass);

    UIManager.setLookAndFeel(synth);
} catch (ParseException pe) {
    System.err.println("Bad configuration file");
    pe.printStackTrace();
    System.exit(-2);
} catch (UnsupportedLookAndFeelException ulfe) {
    System.err.println("Old JRE in use. Get a new one");
    System.exit(-3);
}

من هناك، تابع وأضف JButton كما تفعل عادةً.التغيير الوحيد هو أنك تستخدم طريقة setName(string) لتحديد ما يجب أن يعينه الزر في ملف xml.

قد يبدو ملف xml بهذا الشكل:

<synth>
    <style id="button">
        <font name="DIALOG" size="12" style="BOLD"/>
        <state value="MOUSE_OVER">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
        <state value="ENABLED">
            <imagePainter method="buttonBackground" path="dirt.png" sourceInsets="2 2 2 2"/>
            <insets top="2" botton="2" right="2" left="2"/>
        </state>
    </style>
    <bind style="button" type="name" key="dirt"/>
</synth>

يحدد عنصر الربط هناك ما سيتم التعيين إليه (في هذا المثال، سيتم تطبيق هذا التصميم على أي أزرار تم تعيين خاصية اسمها على "تراب").

واثنين من الروابط المفيدة:

http://javadesktop.org/articles/synth/

http://docs.Oracle.com/javase/tutorial/uiswing/lookandfeel/synth.html

ربما سأذهب مليون ميل في الاتجاه الخاطئ (لكنني شاب فقط :P).ولكن لا يمكنك إضافة الرسم إلى لوحة ثم مستمع الماوس إلى الكائن الرسومي بحيث يتم تنفيذ الإجراء الخاص بك مسبقًا عندما يكون المستخدم على الرسم.

لم أقم بتطوير SWING منذ فصول CS المبكرة ولكن إذا لم يتم دمجها، فيمكنك أن ترث فقط javax.swing.AbstractButton وإنشاء الخاصة بك.يجب أن يكون من السهل جدًا ربط شيء ما مع إطار العمل الحالي.

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