Java: Как передать переменные из JButton ActionListener в основной класс?

Я пытаюсь создать программу, которая генерирует случайное число при нажатии кнопки, а затем вывод отображается на экране. Тем не менее, я могуПередайте переменную, которая содержит случайное число, в класс с помощью JLabel, чтобы его можно было использовать в этом классе. Я написал программу, которая настолько проста, насколько я мог сделать, чтобы продемонстрировать:

import java.awt.BorderLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

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

public class Main{
    public static void main(String[] args){

    JFrame mainFrame = new JFrame("Experiment");
    mainFrame.setSize(500,500);
    mainFrame.setVisible(true);

    Panel panel = new Panel();
    mainFrame.getContentPane().add(panel);

    JLabel output = new JLabel("This is where the result from the num variable in the numGenerator class would go"); 
    panel.add(output); 

    JButton numGenerator = new JButton("Generate Number");
    panel.add(numGenerator);
    numGenerator.addActionListener(new numGenerator());

    }

static class numGenerator implements ActionListener{
    public void ActionPerfomed (ActionEvent e){

        int num; //This is the variable I want to be passed to the
                 //Main class so it can be displayed in the "output" Jlabel.

        Random dice = new Random();
        num = dice.nextInt(3);

    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }
}
}

В Интернете я видел другую помощь для создания объекта класса, а затем использовал его в классе, в котором вы хотите, чтобы переменная была, но я не смогчтобы это работало в этой ситуации.

 Mordechai03 июн. 2013 г., 01:59
ActionPerformed не является actionPerformed.
 wchargin03 июн. 2013 г., 01:58
Хорошо со всем отмеченоstatic ты выиграл'не повезло ...

Ответы на вопрос(2)

Прежде всего, если вы хотите, чтобы доступ к JLabel должен быть в объявлении LEVEL CLASS или передаваться по параметру в actionListener, потому что ссылка на метку живет только в главном контексте.

public class Main{
    public static void main(String[] args){

    JFrame mainFrame = new JFrame("Experiment");
    mainFrame.setSize(500,500);
    mainFrame.setVisible(true);

    Panel panel = new Panel();
    mainFrame.getContentPane().add(panel);

    JLabel output = new JLabel("This is where the result from the num variable in the numGenerator class would go"); 
    panel.add(output); 

    JButton numGenerator = new JButton("Generate Number");
    panel.add(numGenerator);
    numGenerator.addActionListener(new NumGenerator(output));

    }

private class NumGenerator implements ActionListener{
    private final JLabel label;

     public NumGenerator(final JLabel label){
         this.label=label;       
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        int num; 
        Random dice = new Random();
        num = dice.nextInt(3);
        label.setText(num); 
    }
}
}

ИЛИ ты можешь сделать что-то подобное

public class Main{
    //if u want to hold all at class level properties but u really only interested in JLabel
 private JFrame mainFrame;
 private JPanel panel;
 private JLabel label;
 private JButton numGenerator;

//add Constructor
public Main(){
  mainFrame = new JFrame("Experiment");
  mainFrame.setSize(500,500);
  mainFrame.setVisible(true);

panel = new JPanel();
mainFrame.getContentPane().add(panel);
output = new JLabel(); 
panel.add(output); 

numGenerator = new JButton("Generate Number");
panel.add(numGenerator);
numGenerator.addActionListener(new NumGenerator(output));

}

public static void main(String[] args){
  /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
             new Main().mainFrame.setVisible(true);
        }
    });


}

private class NumGenerator implements ActionListener{

   @Override
    public void actionPerformed(ActionEvent arg0) {
        int num; 
        Random dice = new Random();
        num = dice.nextInt(3);
        label.setText(num); // now u have access
    }
}
}

Есть ряд методов, которые вы могли бы использовать для достижения этой цели ...

Вы могли бы...

Сделать класс, переменную экземпляра доступной дляnumGenerator чтобы получить прямой доступ ...

public class Main{
    public static void main(String[] args){
        new Main();
    }

    // This variable will be visible to the inner class numGenerator
    private JLabel output;

    public Main() {
        JFrame mainFrame = new JFrame("Experiment");
        mainFrame.setSize(500,500);
        mainFrame.setVisible(true);

        Panel panel = new Panel();
        mainFrame.getContentPane().add(panel);

        output = new JLabel("This is where the result from the num variable in the numGenerator class would go"); 
        panel.add(output); 

        JButton numGenerator = new JButton("Generate Number");
        panel.add(numGenerator);
        numGenerator.addActionListener(new numGenerator());
    }

    public class numGenerator implements ActionListener{
        public void actionPerformed(ActionEvent e){

            Random dice = new Random();
            int num = dice.nextInt(3);
            output.setText(Integer.toString(num));

        }
    }
}

Это тесно связывает ваши действия с вашим ярлыком, делая код менее пригодным для повторного использования ...

Вы могли бы...

Передайте ссылку метки, которая будет изменена наnumGenerator...

public class Main{
    public static void main(String[] args){
        new Main();
    }

    public Main() {
        JFrame mainFrame = new JFrame("Experiment");
        mainFrame.setSize(500,500);
        mainFrame.setVisible(true);

        Panel panel = new Panel();
        mainFrame.getContentPane().add(panel);

        JLabel output = new JLabel("This is where the result from the num variable in the numGenerator class would go"); 
        panel.add(output); 

        JButton numGenerator = new JButton("Generate Number");
        panel.add(numGenerator);
        numGenerator.addActionListener(new numGenerator(output));
    }

    public class numGenerator implements ActionListener{
        private JLabel label;

        public numGenerator(JLabel label) {
            this.label = label;
        }

        public void actionPerformed(ActionEvent e){

            Random dice = new Random();
            int num = dice.nextInt(3);
            if (label != null) {
                label.setText(Integer.toString(num));
            }

        }
    }
}

Это делаетnumGenerator более многоразового использования, как этоне зависит от одного экземпляраJLabel

Вы могли бы...

ИспользоватьНаблюдательный стиль это может сказать заинтересованной стороне, что генерируется новый номер ...

public class Main{
    public static void main(String[] args){
        new Main();
    }

    public Main() {
        JFrame mainFrame = new JFrame("Experiment");
        mainFrame.setSize(500,500);
        mainFrame.setVisible(true);

        Panel panel = new Panel();
        mainFrame.getContentPane().add(panel);

        final JLabel output = new JLabel("This is where the result from the num variable in the numGenerator class would go"); 
        panel.add(output); 

        JButton numGenerator = new JButton("Generate Number");
        panel.add(numGenerator);
        numGenerator.addActionListener(new numGenerator(new NumberGeneratorListener() {
            public void numberGenerated(int number) {
                output.setText(Integer.toString(number));
            }
        }));
    }

    public interface NumberGeneratorListener {
        public void numberGenerated(int number);
    }

    public class numGenerator implements ActionListener{
        private NumberGeneratorListener listener;

        public numGenerator(NumberGeneratorListener listener) {
            this.listener = listener;
        }

        public void actionPerformed(ActionEvent e){

            Random dice = new Random();
            int num = dice.nextInt(3);
            if (listener != null) {
                listener.numberGenerated(num);
            }

        }
    }
}

Это не только отделяетnumGenerator из остальной части кода, как этоне зависит от какой-либо другой части кода, это делает его чрезвычайно пригодным для повторного использования, посколькуМеня не волнует, куда идет число или как оно используется.решать наблюдателю / слушателю ...

Примечания стороны ...

Вы также можете прочитать ...

Начальные темыСоглашения о коде для языка программирования Java
 MadProgrammer03 июн. 2013 г., 04:11
Нет кофе ......
 user16350503 июн. 2013 г., 05:19
СПАСИБО ОГРОМНОЕ! Номер 3 был спасатель жизни! Вы были так полезны для нуба, как я. :)
 MadProgrammer03 июн. 2013 г., 05:20
Где все нубы, только у некоторых из нас больше опыта в этом;)
 user16350503 июн. 2013 г., 03:15
Спасибо за помощь, но первый метод не сделалt обновить строку, указав номер переменной, во втором методе в главном классе произошла ошибка: «Вложенный тип Main не может скрыть закрывающий тип. "и третий метод не сделализменить JLabel либо как первый метод. Вы знаете, что вызывает это?
 MadProgrammer03 июн. 2013 г., 04:15
Основная проблема заключалась в том, что я скопировал ваш код и незапустить его через компилятор. Вы неправильно назвалиactionPerformed метод (ActionPerfomed). Я'Теперь мы запустили его через компилятор, обновили примеры и протестировали их.

Ваш ответ на вопрос