我正在尝试制作一个程序,当单击一个按钮然后在屏幕上显示输出时,它会生成一个随机数。但是,我无法通过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
的单个实例你可以...
使用Observer style pattern可以告诉一些有兴趣的一方正在生成新的号码...
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
与代码的其余部分解耦,因为它不依赖于代码的任何其他部分,而且还使其具有极高的可重用性,因为它不在乎数字在何处或如何使用,即由观察者/听众决定...旁注...
您可能还需要通读...
Initial Threads
Code Conventions for the Java Programming Language