我的ActionListener如何在JButton中访问另一个类中的变量?

我正在为一个项目做一台老虎机。 我无法让我的JButton从我的ArrayList生成新的随机数。 我可以在程序启动时随机化数字并设置actionlistener ,但它不能满足我的需要。 它仅用于测试目的。

我的Actionlistener位于不同的Java文件中。 一切正常,单击按钮时,我无法弄清楚如何在plc1plc2plc3的占位符中生成新的random。

我刚刚在3周前开始真正开始编码。 请不要讨厌,这是我的第一个项目。

 package GGCGuiLotto; import java.util.ArrayList; import java.awt.Color; import java.awt.Image; import java.awt.BorderLayout; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Icon; import javax.swing.JOptionPane; import javax.swing.JLabel; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTextField; import java.util.Random; public class GGCGuiLotto { public static void main(String[] args) { //Arraylist of images ImageIcon pic0 = new ImageIcon("pics/pic1.png"); ImageIcon pic1 = new ImageIcon("pics/pic2.png"); ImageIcon pic2 = new ImageIcon("pics/pic3.png"); ImageIcon pic3 = new ImageIcon("pics/pic4.png"); ImageIcon pic4 = new ImageIcon("pics/pic5.png"); ImageIcon pic5 = new ImageIcon("pics/pic6.png"); ImageIcon pic6 = new ImageIcon("pics/pic7.png"); final ArrayList slotlist = new ArrayList(); slotlist.add(pic0); slotlist.add(pic1); slotlist.add(pic2); slotlist.add(pic3); slotlist.add(pic4); slotlist.add(pic5); slotlist.add(pic6); Random ran = new Random(); int plc1 = ran.nextInt(4); int plc2 = ran.nextInt(4); int plc3 = ran.nextInt(4); //generates the frame and the labels are added. JFrame frame = new JFrame(); frame.setSize (400,275); frame.setTitle("GGC Lotto Slots Rcorbin"); frame.setResizable(false); frame.setVisible(true); JPanel pnlReels = new JPanel(); frame.add(pnlReels); JPanel aReel1 = new JPanel(); aReel1.setBackground(new Color(25,25,112)); aReel1.setBounds(15,10,100,100); JPanel bReel2 = new JPanel(); bReel2.setBackground(new Color(25,25,112)); bReel2.setBounds(145,10,100,100); JPanel cReel3 = new JPanel(); cReel3.setBackground(new Color(25,25,112)); cReel3.setBounds(275,10,100,100); pnlReels.add(aReel1); pnlReels.add(bReel2); pnlReels.add(cReel3); JLabel aReel1lbl = new JLabel(); JLabel bReel2lbl = new JLabel(); JLabel cReel3lbl = new JLabel(); aReel1.add(aReel1lbl); bReel2.add(bReel2lbl); cReel3.add(cReel3lbl); aReel1lbl.setIcon(slotlist.get(plc1)); bReel2lbl.setIcon(slotlist.get(plc2)); cReel3lbl.setIcon(slotlist.get(plc3)); //jbutton JButton slotbtn1 = new JButton(); slotbtn1.setText("GGC LOTTO Click ME"); pnlReels.add(slotbtn1); slotbtn1.setBounds(145,50,100,75); //FirstGuiListener act = new FirstGuiListener(); //slotbtn1.addActionListener((ActionListener) act); GenPLCListener genPLC = new GenPLCListener(); slotbtn1.addActionListener((genPLC)); {} if (plc1 == plc2 && plc1 == plc3 && plc2 == plc3) { JOptionPane.showConfirmDialog(null,"Winner! Play Again? ","GGC Lotto Slots RCorbin ",JOptionPane.YES_NO_OPTION); //System.out.println("Winner"); } else { //JOptionPane.showMessageDialog(null,"No Winner Winner Chicken Dinner ! "); System.out.println("Crazy"); } } } 

 package GGCGuiLotto; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JOptionPane; class GenPLCListener extends GGCGuiLotto implements ActionListener{ public void actionPerformed(ActionEvent event){ System.out.println("Works"); JOptionPane.showConfirmDialog(null,"Choose Wisely. ","Click If you Trust!",JOptionPane.YES_NO_OPTION); } } 

试图extends GGCGuiLotto不会做你认为应该做的事情,这可以让你访问相同的实例变量。 所以摆脱它。 相反,您可以 GGCGuiLotto的当前实例GGCGuiLotto给您的侦听器。 并让一些getter和setter从GGCGuiLotto类访问您需要的变量。 我的意思是这样的事情(不完全确定你想要完成什么,所以这只是一个例子)。

 public class GenPLCListener implements ActionListener { private GGCGuiLotto lotto; public GenPLCListener(GGCGuiLotto lotto) { this.lotto = lotto; } @Override public void actionPerfomred(ActionEvent e) { List slotList = lotto.getSlotList(); Collections.shuffle(slotList); // shuffle the list // do something else if need be. } } 

创建侦听器时,将其传递给它。 thisGGCGuiLotto


几个侧面笔记

  • Swing程序与控制台程序不同。 您不希望在main方法中执行所有操作。 对于初学者来说, main方法中的代码可以放入构造函数中。 然后在main方法中创建一个GGCGuiLotto实例。

  • Swing应用程序应该在Event Dispatch Thread上运行。 请参见初始线程


编辑

也许对你的问题更合适的解决方案是使用pullSlot方法的interface ,你可以在GGCGuiLotto类中覆盖GGCGuiLotto ,只需将interface传递给监听器,并在actionPerformed调用pullSlot方法。 像这样的东西

 public interface PullInterface { public void pullSlot(); } public class GGCGuiLotto implements PullInterface { ArrayList slotList = new ArrayList<>(); // global scope. JLabel aReel1lbl = new JLabel(); JLabel bReel2lbl = new JLabel(); JLabel cReel3lbl = new JLabel(); Random rand = new Random(); public GGCGuiLotto() { GenPLCListener listener = new GenPLCListener(this); } @Override public void pullSlot() { // do what you need to do here to implement a pulling of the lever int r1 = rand.nextInt(slotList.size()); int r2 = rand.nextInt(slotList.size()); int r3 = rand.nextInt(slotList.size()); reel1lbl.setIcon(slotList.get(r1)); } } public class GenPLCListener implement ActionListener { private PullInterface pull; public GenPLCListener(PullInterface pull) { this.pull = pull; } @Override public void actionPerformed(ActionEvent e) { pull.pullSlot(); } }