gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:02:35 26 4
gpt4 key购买 nike

我正在为一个项目做老虎机。我无法让我的 JButton 从我的 ArrayList 生成新的随机数。我可以在程序启动时随机化数字并设置 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);
}
}

最佳答案

尝试扩展 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 方法中的代码放入构造函数中。然后在 main 方法中创建一个 GGCGuiLotto 的实例。

  • Swing 应用程序应该在事件调度线程上运行。参见 Initial Threads


编辑

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

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();
}
}

关于java - 我的 JButton 的 ActionListener 如何访问另一个类中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22205821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com