gpt4 book ai didi

java - JLabel 图形在错误的时间发生变化

转载 作者:行者123 更新时间:2023-12-01 13:03:09 25 4
gpt4 key购买 nike

我有一个带有一些图形的老虎机程序,当您拉动控制杆时,图形​​应该会发生变化,并且出于某种原因,它会在首先执行所有其他代码后更改图形。看看:

声明图像:

static ImageIcon jImage = new ImageIcon("C:\\Users\\Harry\\Desktop\\jackpotLeverNotPulled.png");
static ImageIcon jackpot1 = new ImageIcon("C:\\Users\\Harry\\Desktop\\jackpotimage1.png");
static ImageIcon jackpotPulled = new ImageIcon("C:\\Users\\Harry\\Desktop\\jackpotLeverPulled.png");

现在我添加到面板:

static JLabel jlb = new JLabel(jImage);

现在我希望当单击面板上的某个区域时图像会发生变化,但主要的大奖代码首先运行,然后图像会发生变化:

public void mousePressed(MouseEvent e) {

// Returns the X coordinate of where the mouse was click on the panel
System.out.println("X Coordinate: " + e.getX() );


// Returns the Y coordinate of where the mouse was click on the panel
System.out.println("Y Coordinate: " + e.getY() );
System.out.println();

Scanner ansr = new Scanner(System.in);
String yesno;

int random = (int)(Math.random() * 21 );
int percentCheck = (int)(Math.random() * 10 );

if (e.getX ()>975 && e.getX ()<1159 && e.getY ()>82 && e.getY ()<218){
jlb.setIcon(jackpotPulled);
if (cashMoneyz<1) {

System.out.println("Insufficient funds");
image1.setIcon(jackpot1);
} else {

System.out.println("One dollar has been removed from you slot machine balance");
cashMoneyz--;
try {
System.out.println("Spinning...");
Thread.sleep(1000);
System.out.println("Spinning...");
Thread.sleep(1000);
System.out.println("SPINNINGGGGG...OMG SOOO INTENSE");
Thread.sleep(1000);
} catch (InterruptedException ie)
{
}

}
System.out.println("You have this much money (in dollars) left in your slot machine balance: " + cashMoneyz);
System.out.println("");
System.out.println("----------------------------------------------------------------------------------");
}

它执行 if 语句并 try catch ,并且仅在所有操作结束时将图形更改为 jackpotPulled。预先感谢:)

最佳答案

您的代码中基本上有两个问题:

1)label.setImage() 的调用不会立即更新,因为对于 AWT 和 Swing 中的所有内容都是如此。每当触发重绘请求时,它都会简单地添加到重绘队列中,该队列将耐心等待 EDT(事件调度线程)中完成的所有其他任务完成。但由于您在 mousePressed() 中执行其他操作,因此它们将首先运行。一个简单的解决方案是在 mouseReleased() 中进行计算。但还有一个更大的问题。

2)您当前正在做的事情是“挨饿” EDT - 一种糟糕的编程实践 - 因为所有与屏幕相关的调用都必须立即执行。 hibernate EDT 将不允许在运行时进行任何重新绘制。对于任何长时间运行的任务也是如此。它的解决方案是在不同的线程中运行非绘画调用:

private volatile boolean isComputing = false;

public void mousePressed(MouseEvent evt) {
if(isComputing)
return;
isComputing = true;

// .
// .
// .
// change icon here, or any
// other swing related change.
// .
// .

// run game
new Thread(){
public void run(){
// all non-swing computations

SwingUtilities.invokeLater(new Runnable() {
public void run() {
// change back icons,
// and some other swing updates
}
}
isComputing = false;
}
}.start();
}

关于java - JLabel 图形在错误的时间发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23399692/

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