Java:如何将变量从 JButton ActionListener 传递到主类?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16888423/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java: How do I pass variables from JButton ActionListener to main class?
提问by user163505
I am trying to make a program that generates a random number when a button is clicked and then the output is displayed on the screen. However, I can't pass the variable that holds the random number into the class with the JLabel so that it can be used in that class. I wrote a program that is as simple as I could make it to demonstrate:
我正在尝试制作一个程序,当单击按钮时生成一个随机数,然后输出显示在屏幕上。但是,我无法将保存随机数的变量传递到带有 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
}
}
}
I saw other help online to create an object of the class and then use that in the class you want the variable to be in, but I couldn't get that to work in this situation.
我在网上看到了其他帮助来创建类的对象,然后在您希望变量所在的类中使用它,但在这种情况下我无法让它工作。
回答by MadProgrammer
There are a number of methods that you could use to accomplish this...
您可以使用多种方法来完成此任务...
You Could...
你可以...
Make a class, instance variable available for the numGenerator
to access directly...
使一个类,实例变量可用于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));
}
}
}
This tightly couples you action with your label, making the code less reusable...
这将您的操作与标签紧密结合在一起,从而降低了代码的可重用性...
You could...
你可以...
Pass a reference of the label to be changed to the numGenerator
...
将要更改的标签的引用传递给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));
}
}
}
}
This makes the numGenerator
more reusable, as it's not reliant on a single instance of the JLabel
这使得numGenerator
更可重用,因为它不依赖于单个实例JLabel
You Could...
你可以...
Use a Observer style patternthat could tell some interested party that a new number has being generated...
使用观察者风格的模式,可以告诉一些感兴趣的一方已经生成了一个新的数字......
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);
}
}
}
}
This not only decouples the numGenerator
from the rest of the code, as it's not reliant on any other part of the code, it makes it extremely reusable, as it doesn't care where the number goes or how it is used, that's up to the observer/listener to decide...
这不仅使numGenerator
代码与其余代码解耦,因为它不依赖于代码的任何其他部分,而且使其具有极高的可重用性,因为它不关心数字的去向或使用方式,这取决于观察者/倾听者决定……
Side notes...
旁注...
You might also want to have a read through...
您可能还想通读一遍...
回答by nachokk
First of all, if u want access to the JLabel must be in LEVEL CLASS declaration or pass by parameter in the actionListener, cause ur label reference only lives in the main context.
首先,如果您想访问 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);
}
}
}
OR u can do something like this
或者你可以做这样的事情
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
}
}
}