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

我的Actionlistener在另一个Java文件中。一切正常,我只是想不出如何在单击按钮时在plc1plc2plc3的占位符中生成新的随机数。

我刚刚在大约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<ImageIcon> slotlist = new ArrayList<ImageIcon>();
    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的当前实例传递给您的监听器。并具有一些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<ImageIcon> slotList = lotto.getSlotList();
        Collections.shuffle(slotList);  // shuffle the list
        // do something else if need be.
    }
}

创建监听器时,将this传递给它。 thisGGCGuiLotto的实例

少量注释
  • Swing程序与控制台程序不同。您不想在main方法中做所有事情。首先,可以将main方法中的代码放入构造函数中。然后在GGCGuiLotto方法中创建main的实例。
  • Swing应用程序应在事件调度线程上运行。参见Initial Threads


  • 编辑

    对于您的问题,也许更合适的解决方案是使用interface方法创建一个pullSlot,您可以在GGCGuiLotto类中覆盖该方法,然后将interface传递给监听器,然后在pullSlot中调用actionPerformed方法。像这样
    public interface PullInterface {
        public void pullSlot();
    }
    
    public class GGCGuiLotto implements PullInterface {
        ArrayList<ImageIcon> 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();
        }
    }
    

    10-05 19:18