الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Code بسيط يوضح التعامل مع ال Enumeration

بدأه mr.beshoy في 11 أبريل 2010 · 11 رد · 1,000 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هنا فى هذا ال code مصفوفة من نوع JButton و كل عنصر منها له حدث بسيط .

بدلاً من اللجوء لكتابة

if(e.getSource==buttons[0]){
	// Type your code
}else if(e.getSource==buttons[1]){
	// Type your code
}else if(e.getSource==buttons[2]){
	// Type your code
}

العناصر buttons [0] , buttons[1] , ..... الخ

تكون غير مفهومة لدى قارى ال code

لذا من خلال ال Enum تستطيع كل عنصر يكون له اسم واضح و ثابت و بالتالى يكون سهل الفهم . و خصوصاً إذا كان هناك العديد من الbuttons

انظر معنا :

--------------------

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

enum Action {

    START, HELP, EXIT;
}

class MainGame extends JFrame {

    private JPanel mainPanel, buttonsPanel;
    private Box mainButtonsBox;
    private JButton[] buttons;
    private Action[] buttonsNames;
    private Action action;

    public MainGame() {
        createContainer();
        buttonsNames = Action.values();
        for (int i = 0; i < buttonsNames.length; ++i) {
            action = buttonsNames;
            createButtons(action);
        }
        getContentPane().add(mainPanel);
    }

    public static void main(String[] args) {
        MainGame mainGame = new MainGame();
        mainGame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainGame.setSize(new Dimension(600, 300));
        mainGame.setLocationRelativeTo(null);
        mainGame.setExtendedState(MAXIMIZED_BOTH);
        mainGame.setVisible(true);
    }

    private void createContainer() {   // for createing container
        /////////////////////MainPanel/////////////////////////////
        mainPanel = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        c.insets = new Insets(30, 30, 30, 30);
        //////////////////////Box&Panel fro buttons/////////////////////////////////////
        mainButtonsBox = Box.createHorizontalBox();
        buttonsPanel = new JPanel(new GridLayout(3, 1));
        mainButtonsBox.setBorder(BorderFactory.createLineBorder(Color.BLUE, 5));
        mainButtonsBox.setPreferredSize(new Dimension(400, 200));
        mainButtonsBox.add(buttonsPanel);
        ///////////////////////////////////////////////////////////////////////////////
        mainPanel.add(mainButtonsBox, c);
    }

    private void createButtons(Action action) {
        buttons = new JButton[buttonsNames.length];
        for (int i = 0; i < 1; ++i) {
            buttons = new JButton(action.name());
            buttons.addActionListener(listenerFor(action));
            buttonsPanel.add(buttons);
        }
    }

    private ActionListener listenerFor(Action action) {
        switch (action) {
            case START:    // START BUTTON
                return new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        JOptionPane.showMessageDialog(null, "START");
                    }
                };
            case HELP:   // HELP BUTTON
                return new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        JOptionPane.showMessageDialog(null, "HELP");
                    }
                };
            case EXIT:  // EXIT BUTTON
                return new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        JOptionPane.showMessageDialog(null, "EXIT");
                    }
                };
        }
        return null;
    }
}

تعرضت لمشاكل حتى يخرج بهذا الشكل .

أتمنى من لديه طرق أخرى يعرضها حتى تعم الفائدة .

شكراً

1
#2

لا أعتقد أن هذا خيار صائب أخ بيشوي

على العكس لا أرى أن المصفوفة أصلاً ذات فائدة

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#3

لو مفيش مانع ، أفدنا بما تعرفه .

---------------------------------------------

الهدف مش من المصفوفة ، الهدف انك تتجنب كتابة أشياء غير واضحة زى buttons[0] و خلافة و تكتب اسم معين زى START

-------------------------------------------------------

شكراً لك

تم تعديل هذه المشاركة بواسطة mr.beshoy في 12 أبريل 2010 في 01:11

#4

بغض النظر عن كون المثال المطروح لا يحتاج Enum أو غيرها ...

لكن هذه الطريقة غير مستخدمة في البرامج والحزم الحقيقية، هذا ما لاحظته

بل يتم تعريف خصائص Attributes ثابتة ونهائية وتستخدم لنفس الغرض، كما يلي:

    public static final int START_ACTION= 0;
    public static final int HELP_ACTION = 1;
    public static final int EXIT_ACTION = 2;

ثم يتم استخدامها ضمن الفئة وخارجها

#5

لكن أنا مش عاوز اكتب :

case 0: or case 1: or case 2

عاوز اكتب case + اسم المكون الى هيتعرض لحدث ما

عشان كده فكرت فى طريقة ال Enum

--------------------------------------------------------------------

و على اى حال إحنا بنلعب مع الاكواد و نكتشف ... هذا ليس عيباً :lol:

شكراً جدا لتعبك

#6
اقتباس
لكن أنا مش عاوز اكتب :

case 0: or case 1: or case 2

اكتبها بالشكل :

case START_ACTION:
case HELP_ACTION:
case EXIT_ACTION:
#7

عموماُ ، هو الهدف من الموضوع تلميح لفكرة تعطى خبرة

وشكراً جداُ

#8
اقتباس
بغض النظر عن كون المثال المطروح لا يحتاج Enum أو غيرها ...

لكن هذه الطريقة غير مستخدمة في البرامج والحزم الحقيقية، هذا ما لاحظته

بل يتم تعريف خصائص Attributes ثابتة ونهائية وتستخدم لنفس الغرض، كما يلي:

public static final int START_ACTION= 0;

public static final int HELP_ACTION = 1;

public static final int EXIT_ACTION = 2;

أختلف معك أخي, لأن ال Enum جاءت لتحل هذه المشكله,

أعرف أن الكود بال JDK مازال يستخدم ال static final int style , ولكن قد يكون بسبب عدم الحاجه لتغير كود "يعمل",, (كما هو الحال معى بالشركه التي أعمل بها, فلدينا كود عتيق, ولكنه "يعمل", لذا نتركه كما هو)

1
#9

معلومات جيدة

#10

لا أعتقد أن الجافا تبقيها لأجل أنها تعمل فقط

الجافا تعمل على إبقاء compatibility ما بين البرامج القديمة وJDK الجديدة

وما لم يكن هناك bug فلن ترى أي تعديلات

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#11

أليس من الأسهل أن تسمي كل أداة بأسم مفهوم بدل هذا كله إذا كان قصدك مثلما قلت فقط عشان تكون الأسامي واضحة؟ ثانيا لا حظت على السريع إنك أرسلت للسويتش Action وهو أوبجكت والسويتش هنا وفي السي++ لاتقبل سوى primative types مثل الـint والـchar ولا تقبل أي أوبجكت


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#12

و تقبل أيضاً ال Enum و ال Action هو Enum

شكراً و ليك وحشة :lol:

مواضيع مشابهة