gpt4 book ai didi

java - 从线程中的数组获取值时出错(JAVA GUI 老虎机游戏)

转载 作者:行者123 更新时间:2023-11-30 02:42:31 27 4
gpt4 key购买 nike

我正在使用 java 创建一个老虎机游戏。用户单击“旋转按钮”后,我需要获取 3 张图片的值,这些图片将作为 GUI 中的插槽分配给 3 个标签,由 GUI 分配和数组。但是,当我在将最后一个元素分配给插槽之前添加线程来显示数组中的图片变化时,无法正确获取图片的正确值。相反,它显示分配给插槽的前 3 张图片的值。

GUI class

public class SlotMachineGUI extends JFrame {

private JLabel titleLabel;
private JLabel pcnameLabel;
private JLabel symLbl;
private JLabel symLb2;
private JLabel symLb3;
private JLabel creditTxtLbl;
private JLabel creditValLbl;
private JLabel betTxtLbl;
private JLabel betValLbl;
private JLabel winsTxtLbl;
private JLabel winsValLbl;
private JLabel lossValLbl;
private JLabel lossTxtLbl;


private JButton spinBtn;
private JButton resetBtn;
private JButton addCoinBtn;
private JButton betOneBtn;
private JButton betMaxBtn;
private JButton startBtn;

private JPanel pcPanel;
private JPanel btnPanel;
private JPanel mainBtnPanel;
private JPanel detailPanel;
private JPanel mainPanel;
private JPanel namePanel;


private int count = 0;
private int creditV = 10;
private final int maxCredit = 3;
private int picVal1=0;
private int picVal2=0;
private int picVal3=0;
private int wonCredit=0;
int val1=0;
int val2 = 0;
int val3=0;


private int credit;

public SlotMachineGUI() {
setSize(800, 400);


//to title
titleLabel = new JLabel("--Slot Machine--");
titleLabel.setFont(new Font("", 2, 30));
titleLabel.setForeground(Color.decode("#FF0000"));
titleLabel.setHorizontalAlignment(JLabel.CENTER);
add("North", titleLabel);

pcPanel = new JPanel(new GridLayout(1, 3, 0, 0));
pcPanel.setBackground(Color.WHITE);


symLbl = new JLabel(new ImageIcon("src/cswrk2/clear.png"));
symLb2 = new JLabel(new ImageIcon("src/cswrk2/clear.png"));
symLb3 = new JLabel(new ImageIcon("src/cswrk2/clear.png"));

symLbl.setBorder(BorderFactory.createLineBorder(Color.black));
symLb2.setBorder(BorderFactory.createLineBorder(Color.black));
symLb3.setBorder(BorderFactory.createLineBorder(Color.black));

pcPanel.add(symLbl);
pcPanel.add(symLb2);
pcPanel.add(symLb3);

btnPanel = new JPanel(new GridLayout(2, 1, 0, 0));
btnPanel.setBackground(Color.decode("#310138"));

spinBtn = new JButton("Spin");
resetBtn = new JButton("Reset");

btnPanel.add(spinBtn);
btnPanel.add(resetBtn);

detailPanel = new JPanel(new GridLayout(2, 4, 0, 0));
detailPanel.setBackground(Color.decode("#000000"));

creditTxtLbl = new JLabel("Credit Left ");
creditTxtLbl.setFont(new Font("", 1, 14));
creditTxtLbl.setForeground(Color.white);
creditValLbl = new JLabel(String.valueOf(creditV));
creditValLbl.setFont(new Font("", 1, 14));
creditValLbl.setForeground(Color.white);

betTxtLbl = new JLabel("Bet ");
betTxtLbl.setFont(new Font("", 1, 14));
betTxtLbl.setForeground(Color.white);
betValLbl = new JLabel("0");
betValLbl.setFont(new Font("", 1, 14));
betValLbl.setForeground(Color.white);

winsTxtLbl = new JLabel("Wins ");
winsTxtLbl.setFont(new Font("", 1, 14));
winsTxtLbl.setForeground(Color.white);
winsValLbl = new JLabel("Wins Val ");
winsValLbl.setFont(new Font("", 1, 14));
winsValLbl.setForeground(Color.white);

lossTxtLbl = new JLabel("Wins ");
lossTxtLbl.setFont(new Font("", 1, 14));
lossTxtLbl.setForeground(Color.white);
lossValLbl = new JLabel("Wins Val ");
lossValLbl.setFont(new Font("", 1, 14));
lossValLbl.setForeground(Color.white);

detailPanel.add(creditTxtLbl);
detailPanel.add(creditValLbl);
detailPanel.add(betTxtLbl);
detailPanel.add(betValLbl);
detailPanel.add(winsTxtLbl);
detailPanel.add(winsValLbl);
detailPanel.add(lossTxtLbl);
detailPanel.add(lossValLbl);

mainPanel = new JPanel(new GridLayout(2, 1, 0, 0));
mainPanel.setBackground(Color.decode("#310138"));
mainPanel.add(pcPanel);
// mainPanel.add(btnPanel);
mainPanel.add(detailPanel);
add("East", btnPanel);
add("Center", mainPanel);

mainBtnPanel = new JPanel(new GridLayout(1, 4, 0, 0));
mainBtnPanel.setBackground(Color.decode("#310138"));

addCoinBtn = new JButton("Add Coin");
betOneBtn = new JButton("Bet One");
betMaxBtn = new JButton("Bet Max");
startBtn = new JButton("Starts");

mainBtnPanel.add(addCoinBtn);
mainBtnPanel.add(betOneBtn);
mainBtnPanel.add(betMaxBtn);
mainBtnPanel.add(startBtn);

add("South",mainBtnPanel);
setVisible(true);

addCoinBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {


}
});
spinBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {



{
Thread thread1 = new Thread(new Runnable() {

Reel spinner1 = new Reel();
//System.out.println(spinner1.spin());
Symbol[] url1 = spinner1.spin();
@Override
public void run() {

for (Symbol symbol : url1) {

try {
ImageIcon a=symbol.getImage();
Thread.sleep(100);
val1=symbol.getValue();
symLbl.setIcon(a);



} catch (InterruptedException ex) {
Logger.getLogger(SlotMachineGUI.class.getName()).log(Level.SEVERE, null, ex);
}


}
}
});
thread1.start();

picVal1=val1;
System.out.println(picVal1);

}
{
Thread thread2 = new Thread(new Runnable() {

Reel spinner2 = new Reel();
//System.out.println(spinner1.spin());
Symbol[] url2 = spinner2.spin();
@Override
public void run() {

for (Symbol symbol : url2) {

try {
ImageIcon a=symbol.getImage();
Thread.sleep(100);
val2=symbol.getValue();
symLb2.setIcon(a);



} catch (InterruptedException ex) {
Logger.getLogger(SlotMachineGUI.class.getName()).log(Level.SEVERE, null, ex);
}

}

}
});
thread2.start();
picVal1=val2;
System.out.println(picVal1);
}
{
Thread thread3 = new Thread(new Runnable() {

Reel spinner3 = new Reel();
//System.out.println(spinner1.spin());
Symbol[] url3 = spinner3.spin();
@Override
public void run() {

for (Symbol symbol : url3) {

try {
ImageIcon a=symbol.getImage();
Thread.sleep(100);
val3=symbol.getValue();
symLb3.setIcon(a);



} catch (InterruptedException ex) {
Logger.getLogger(SlotMachineGUI.class.getName()).log(Level.SEVERE, null, ex);
}


}
}
});
thread3.start();
picVal3=val3;
System.out.println(picVal3);
System.out.println();
}
//symLbl = new JLabel(new ImageIcon("src/cswrk2/Banana.png"));

if(val1==val2 && val2==val3 && val3==val1){
System.out.println("samanaaaaaaai");
wonCredit=((count)*picVal1);
creditV+=wonCredit;
creditValLbl.setText(String.valueOf(creditV));
betValLbl.setText(String.valueOf(0));

JOptionPane.showMessageDialog(startBtn,
"You won "+wonCredit+" credits",
"!!JACKPOT!!",
JOptionPane.PLAIN_MESSAGE);



}
}
});
betOneBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
if(count<4){

betValLbl.setText(String.valueOf(count));
creditV--;
creditValLbl.setText(String.valueOf(creditV));
count++;

}else{
count--;
}


}
});
betMaxBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
creditV-=maxCredit;
//creditValLbl.setText(String.valueOf(creditV));
betValLbl.setText(String.valueOf(maxCredit));

}
});
startBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub

}
});



}

public static void main(String[] args) {
SlotMachineGUI mainWindow = new SlotMachineGUI();
}
}

Reel Class

import java.util.Random;


public class Reel {
Symbol Cherry = new Symbol();
Symbol Lemon = new Symbol();
Symbol Plum = new Symbol();
Symbol WaterMellon = new Symbol();
Symbol Bell = new Symbol();
Symbol Seven = new Symbol();

public Reel(){


}

public Symbol[] spin(){
Symbol[] symArr=new Symbol[6];

Random r = new Random();
for (int i =0 ; i<symArr.length ; i++){
int randomNum = r.nextInt(6)+1;
//System.out.println(randomNum);
switch (randomNum) {
case 1:
Seven.setValue(7);
Seven.setImage();
symArr[i]=Seven;
break;
case 2:
Bell.setValue(6);
Bell.setImage();
symArr[i]=Bell;
break;
case 3:
WaterMellon.setValue(5);
WaterMellon.setImage();
symArr[i]=WaterMellon;
break;
case 4:
Plum.setValue(4);
Plum.setImage();
symArr[i]=Plum;
break;
case 5:
Lemon.setValue(3);
Lemon.setImage();
symArr[i]=Lemon;
break;
case 6:
Cherry.setValue(2);
Cherry.setImage();
symArr[i]=Cherry;
break;

}
}
return symArr;


}
}

Symbol Class(implements from ISymbol interface)

import javax.swing.ImageIcon;

public class Symbol implements ISymbol {

private int imgValue;
private ImageIcon imgPath;

@Override
public void setImage() {
//System.out.println("valur "+imgValue);

switch (imgValue) {
case 7:
ImageIcon svn = new ImageIcon("src/img/redseven.png");
imgPath = svn;
break;
case 6:
ImageIcon bell = new ImageIcon("src/img/bell.png");
imgPath = bell;
break;
case 5:
ImageIcon wmln = new ImageIcon("src/img/watermelon.png");
imgPath = wmln;
break;
case 4:
ImageIcon plum = new ImageIcon("src/img/plum.png");
imgPath = plum;
break;
case 3:
ImageIcon lmn = new ImageIcon("src/img/lemon.png");
imgPath = lmn;
break;
case 2:
ImageIcon chry = new ImageIcon("src/img/cherry.png");
imgPath = chry;
break;
}
//System.out.println(imgPath);
//System.out.println("Image value "+imgValue);
}


@Override
public void setValue(int v) {
// TODO Auto-generated method stub
this.imgValue=v;

}

@Override
public ImageIcon getImage() {
// TODO Auto-generated method stub
return imgPath;
}

@Override
public int getValue() {
// TODO Auto-generated method stub
return imgValue;


}






}

ISymbol interface

import javax.swing.ImageIcon;

public interface ISymbol {
public void setImage();
public ImageIcon getImage();
public void setValue(int v);
public int getValue();


}

最佳答案

Swing GUI 组件只能从 Event Dispatch Thread (EDT) 更新。

如果您尝试以固定延迟重复更新 GUI,请考虑使用 Timer执行 GUI 更新。 Timer 将按照指定的时间间隔触发 ActionEvent,并且该 ActionEvent 将出现在 EDT 上,以便您可以安全地更新 Swing 组件。

如果需要很长时间或不确定的时间来确定要加载哪些图像(可能是因为它们是从服务中获取的),那么您可能需要添加 SwingWorker混合以避免在等待图像数组返回时阻塞 EDT。

(如果您发布 SSCCE,我将通过一个示例来更新我的答案,说明如何在代码中使用它们 - 目前缺少 ReelSymbol 类会阻止您的代码编译)

* 更新 *

查看 SSCCE 后,问题似乎更多地与线程有关,而不是 EDT 和工作线程之间的交互。在下面的代码中,我做了一些更改,我相信这些更改可以解决您所描述的问题:

  • 将检查获胜者的逻辑移至单独的线程 resultThread 上,该线程启动三个旋转器等待其完成,然后再确定旋转是否是一个优胜者。

  • 删除了 thread1thread2thread3 周围的 block ,以便 resultThread 可以引用它们

  • 通过使用 SwingUtilities.invokeLater() 将 swing 组件更新移至 EDT(注意:这是 Oracle 推荐的与 Swing 组件交互的做法,但我不认为这是一个该解决方案的基本部分)

SlotMachineGUI.java

            import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SlotMachineGUI extends JFrame {

private JLabel titleLabel;
private JLabel pcnameLabel;
private JLabel symLbl;
private JLabel symLb2;
private JLabel symLb3;
private JLabel creditTxtLbl;
private JLabel creditValLbl;
private JLabel betTxtLbl;
private JLabel betValLbl;
private JLabel winsTxtLbl;
private JLabel winsValLbl;
private JLabel lossValLbl;
private JLabel lossTxtLbl;


private JButton spinBtn;
private JButton resetBtn;
private JButton addCoinBtn;
private JButton betOneBtn;
private JButton betMaxBtn;
private JButton startBtn;

private JPanel pcPanel;
private JPanel btnPanel;
private JPanel mainBtnPanel;
private JPanel detailPanel;
private JPanel mainPanel;
private JPanel namePanel;

private int count = 0;
private int creditV = 10;
private final int maxCredit = 3;
private int picVal1 = 0;
private int picVal2 = 0;
private int picVal3 = 0;
private int wonCredit = 0;
int val1 = 0;
int val2 = 0;
int val3 = 0;

private int credit;

public SlotMachineGUI() {
setSize(800, 400);

//to title
titleLabel = new JLabel("--Slot Machine--");
titleLabel.setFont(new Font("", 2, 30));
titleLabel.setForeground(Color.decode("#FF0000"));
titleLabel.setHorizontalAlignment(JLabel.CENTER);
add("North", titleLabel);

pcPanel = new JPanel(new GridLayout(1, 3, 0, 0));
pcPanel.setBackground(Color.WHITE);

symLbl = new JLabel(new ImageIcon("src/cswrk2/clear.png"));
symLb2 = new JLabel(new ImageIcon("src/cswrk2/clear.png"));
symLb3 = new JLabel(new ImageIcon("src/cswrk2/clear.png"));

symLbl.setBorder(BorderFactory.createLineBorder(Color.black));
symLb2.setBorder(BorderFactory.createLineBorder(Color.black));
symLb3.setBorder(BorderFactory.createLineBorder(Color.black));

pcPanel.add(symLbl);
pcPanel.add(symLb2);
pcPanel.add(symLb3);

btnPanel = new JPanel(new GridLayout(2, 1, 0, 0));
btnPanel.setBackground(Color.decode("#310138"));

spinBtn = new JButton("Spin");
resetBtn = new JButton("Reset");

btnPanel.add(spinBtn);
btnPanel.add(resetBtn);

detailPanel = new JPanel(new GridLayout(2, 4, 0, 0));
detailPanel.setBackground(Color.decode("#000000"));

creditTxtLbl = new JLabel("Credit Left ");
creditTxtLbl.setFont(new Font("", 1, 14));
creditTxtLbl.setForeground(Color.white);
creditValLbl = new JLabel(String.valueOf(creditV));
creditValLbl.setFont(new Font("", 1, 14));
creditValLbl.setForeground(Color.white);

betTxtLbl = new JLabel("Bet ");
betTxtLbl.setFont(new Font("", 1, 14));
betTxtLbl.setForeground(Color.white);
betValLbl = new JLabel("0");
betValLbl.setFont(new Font("", 1, 14));
betValLbl.setForeground(Color.white);

winsTxtLbl = new JLabel("Wins ");
winsTxtLbl.setFont(new Font("", 1, 14));
winsTxtLbl.setForeground(Color.white);
winsValLbl = new JLabel("Wins Val ");
winsValLbl.setFont(new Font("", 1, 14));
winsValLbl.setForeground(Color.white);

lossTxtLbl = new JLabel("Wins ");
lossTxtLbl.setFont(new Font("", 1, 14));
lossTxtLbl.setForeground(Color.white);
lossValLbl = new JLabel("Wins Val ");
lossValLbl.setFont(new Font("", 1, 14));
lossValLbl.setForeground(Color.white);

detailPanel.add(creditTxtLbl);
detailPanel.add(creditValLbl);
detailPanel.add(betTxtLbl);
detailPanel.add(betValLbl);
detailPanel.add(winsTxtLbl);
detailPanel.add(winsValLbl);
detailPanel.add(lossTxtLbl);
detailPanel.add(lossValLbl);

mainPanel = new JPanel(new GridLayout(2, 1, 0, 0));
mainPanel.setBackground(Color.decode("#310138"));
mainPanel.add(pcPanel);
// mainPanel.add(btnPanel);
mainPanel.add(detailPanel);
add("East", btnPanel);
add("Center", mainPanel);

mainBtnPanel = new JPanel(new GridLayout(1, 4, 0, 0));
mainBtnPanel.setBackground(Color.decode("#310138"));

addCoinBtn = new JButton("Add Coin");
betOneBtn = new JButton("Bet One");
betMaxBtn = new JButton("Bet Max");
startBtn = new JButton("Starts");

mainBtnPanel.add(addCoinBtn);
mainBtnPanel.add(betOneBtn);
mainBtnPanel.add(betMaxBtn);
mainBtnPanel.add(startBtn);

add("South", mainBtnPanel);
setVisible(true);

addCoinBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {


}
});
spinBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
Thread thread1 = new Thread(new Runnable() {

Reel spinner1 = new Reel();
//System.out.println(spinner1.spin());
Symbol[] url1 = spinner1.spin();

@Override
public void run() {

for (Symbol symbol : url1) {

try {
ImageIcon a = symbol.getImage();
Thread.sleep(100);
val1 = symbol.getValue();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
symLbl.setIcon(a);
}
});
} catch (InterruptedException ex) {
Logger.getLogger(SlotMachineGUI.class.getName()).log(Level.SEVERE, null, ex);
}


}
}
});

picVal1 = val1;
System.out.println(picVal1);

Thread thread2 = new Thread(new Runnable() {

Reel spinner2 = new Reel();
//System.out.println(spinner1.spin());
Symbol[] url2 = spinner2.spin();

@Override
public void run() {

for (Symbol symbol : url2) {

try {
ImageIcon a = symbol.getImage();
Thread.sleep(100);
val2 = symbol.getValue();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
symLb2.setIcon(a);
}
});
} catch (InterruptedException ex) {
Logger.getLogger(SlotMachineGUI.class.getName()).log(Level.SEVERE, null, ex);
}

}

}
});
picVal1 = val2;
System.out.println(picVal1);
Thread thread3 = new Thread(new Runnable() {

Reel spinner3 = new Reel();
//System.out.println(spinner1.spin());
Symbol[] url3 = spinner3.spin();

@Override
public void run() {

for (Symbol symbol : url3) {

try {
ImageIcon a = symbol.getImage();
Thread.sleep(100);
val3 = symbol.getValue();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
symLb3.setIcon(a);
}
});

} catch (InterruptedException ex) {
Logger.getLogger(SlotMachineGUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
});

picVal3 = val3;
System.out.println(picVal3);
System.out.println();

Thread resultThread = new Thread(new Runnable() {
@Override
public void run() {
thread1.start();
thread2.start();
thread3.start();

try {
thread1.join();
thread2.join();
thread3.join();

if (val1 == val2 && val2 == val3 && val3 == val1) {
System.out.println("samanaaaaaaai");
wonCredit = ((count) * picVal1);
creditV += wonCredit;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
creditValLbl.setText(String.valueOf(creditV));
betValLbl.setText(String.valueOf(0));

JOptionPane.showMessageDialog(startBtn,
"You won " + wonCredit + " credits",
"!!JACKPOT!!",
JOptionPane.PLAIN_MESSAGE);
}
});

}

} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

resultThread.start();
}
});
betOneBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
if (count < 4) {

betValLbl.setText(String.valueOf(count));
creditV--;
creditValLbl.setText(String.valueOf(creditV));
count++;

} else {
count--;
}


}
});
betMaxBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
creditV -= maxCredit;
//creditValLbl.setText(String.valueOf(creditV));
betValLbl.setText(String.valueOf(maxCredit));

}
});
startBtn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub

}
});


}

public static void main(String[] args) {
SlotMachineGUI mainWindow = new SlotMachineGUI();
}
}

关于java - 从线程中的数组获取值时出错(JAVA GUI 老虎机游戏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41229438/

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