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 } } } 

我在网上看到了其他帮助来创建类的对象,然后在你希望变量所在的类中使用它,但我无法在这种情况下使用它。

您可以使用许多方法来完成此操作……

你可以…

创建一个类,实例变量可供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编程语言的代码约定

首先,如果你想要访问JLabel必须在LEVEL CLASS声明中或者在actionListener中通过参数传递,那么ur标签引用只存在于主上下文中。

 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 } } }