سؤال

وأنا أتساءل عما اذا كان هناك وسيلة لتنفيذ المستمع عمل لJbutton بدون اسم. على سبيل المثال، لدي يلي للحلقة أن يخلق زر لكل حرف من الحروف الأبجدية.

for (int i = 65; i < 91; i++){
     alphabetPanel.add(new JButton("<html><center>" + (char)i));
}

هل هناك طريقة أستطيع أن أضيف المستمع عمل لكل من تلك الأزرار دون التخلص من بلدي لحلقة والثابت ترميز كل JButton ومن ثم تهيئة المستمع عمل لكل؟

ويرجع الفضل في ذلك مسبقا،

وتوميك

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

المحلول

وسؤالك هو غامض بعض الشيء. سيكون تافها لتعديل حلقة لإضافة المستمع داخل الحلقة:

ActionListener listener = something;

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i);
     button.addActionListener( listener );
     alphabetPanel.add(button);
}

وإذا كنت لا تستطيع تعديل حلقة هل يمكن تكرار على كل من الأطفال لوحة، ووإضافة المستمعين إلى أي من الأطفال الذين هم jbuttons.

وأيضا لماذا أنت باستخدام HTML لتوسيط النص؟ ليس هذا مبالغة؟ لا jbutton توسيط النص بالفعل منتديات هل يمكن استخدام setHorizontalAlignement (SwingConstants.CENTER) للقيام بذلك أيضا.

نصائح أخرى

ما هي المشكلة للقيام بذلك؟

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i));
     button.addActionListener( new ButtonListener());
     alphabetPanel.add(button);
}

...

class ButtonListener implements ActionListener {
     ButtonListener() {
     }
     public void actionPerformed(ActionEvent e) {
         //TODO:
     }
}

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

button.setName((char)i)); // or button.setName(i);

حسب اسمه، يبدو أنك يعني تخزين المثال زر في متغير محلي من طريقتك على الفور. محاولة لتجنب أن من المرجح أن جعل الرمز الخاص بك أكثر صعوبة في القراءة. ولكن للإجابة على سؤالك:

والطريقة الأكثر وضوحا هو استخدام القديم ولكن حديثا شعبية لغة مزدوجة هدفين.

alphabetPanel.add(new JButton("<html><center>" + (char)i) {{
    addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}});

ملحوظة، في هذه الحالة وكما قلت ليس نهائيا انها لن تكون قابلة للاستخدام من الطبقة الداخلية مجهولة. إما إسناد ذلك إلى متغير آخر (النهائي) أو إعادة صياغة الحلقة.

وطريق آخر سيكون للذهاب عن طريق العمل. (وعادة ما كنت تشير الى تجنب تطبيقات لأنها jsut جدول هاش الرجل الفقير. ButtonModel هو "جيد" على الرغم من.)

alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) {
    public void actionPerformed(ActionEvent event) {
        ...
    }
}));

وبعد ذلك بالطبع هناك تطبيق الطريقة مكتبة معينة:

Form alphabetForm = new Form(alphabetPanel);
for (char c='A'; c <= 'Z'; ++c) {
    alphabetForm.button("<html><center>" + c, new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}

ومن الممكن إضافة ActionListener لعناصر مجهولة مثل أدناه:

new JButton().addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO your action             
            }           
        });

ولكن، في الحالة الخاصة بك حيث كنت في محاولة لإضافة JButton مجهول إلى لوحة الخاص بك، وهذا النهج لن تنجح لأن نوع عودة الأسلوب addActionListener (والذي هو باطل) ستتخذ بدلا من منشئ JButton كما هو موضح أدناه:

for (int i = 65; i < 91; i++){
             alphabetPanel.add(new JButton("<html><center>" + (char)i).addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        // TODO your action             
                    }           
                }));
        }

ورمز أعلاه يشكو الجدل حول غير صالحة لطريقة panel.add ().

وحتى في الحالة الخاصة بك، سيكون لديك لإنشاء مثيل مسمى من JButton.

ونأمل أن يكون هذا يوضح.

مع أطيب التحيات، سوريش

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