gpt4 book ai didi

java - 在 JPanel 中显示正确的信息

转载 作者:行者123 更新时间:2023-12-01 14:33:44 24 4
gpt4 key购买 nike

我在使用新数据更新 JPanel 时遇到问题。我正在开发一款游戏,我想做的基本概念是加载玩家并显示他在 JPanel 中持有的项目(在盒子布局中列出)我正在使用线程和循环来更新玩家元素。这对于一名玩家来说效果很好,但我的游戏允许用户可以在其他玩家之间进行切换。当我切换到下一个玩家时,我希望加载并更新他们的详细信息。这是行不通的。

这只是代码片段,但我希望有人能够看到我的问题。

    private JFrame frame;   
private JPanel mainPanel;
private Box Item1 Item2, Item3;
static private JPanel centerPanel;


private boolean playerLoaded;
private Player currentPlayer;

private Thread gameThread;




public void run(){

while (running){



for (Player player:allPlayers){
playerLoaded = false;
currentPlayer = player;
player.setCurrentTurn(true);

while (player.isCurrentTurn()){

if (playerLoaded != true){

loadPlayer(player);
loadItems(player);
playerLoaded = true;


}

if ((playerLoaded == true){

updateItems(player);

try {
Thread.sleep(999);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

}


}
}


public void loadPlayer(Player player){
jlCurrentPlayer.setText("Player: " + player.getName());

}

public void loadItems(Player player){
int count = 1;

centerPanel = new JPanel(new GridLayout(1,3));

for (Item Item : player.getAllItems()){

if (count == 1) {
Item1 = Box.createVerticalBox();
Item1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
JLabel jlItem = new JLabel(item.getName());
Item1.add(jlItem);
centerPanel.add(Item1);
}
else if (count ==2){
Item2 = Box.createVerticalBox();
Item2.setBorder(BorderFactory.createLineBorder(Color.BLACK));
JLabel jlItem = new JLabel(item.getName());
Item2.add(jlItem);
centerPanel.add(Item2);
}
else if (count ==3){
Item3 = Box.createVerticalBox();
Item3.setBorder(BorderFactory.createLineBorder(Color.BLACK));
JLabel jlItem = new JLabel(item.getName());
Item3.add(jlItem);
centerPanel.add(Item3);
}

mainPanel.add(centerPanel,BorderLayout.CENTER);

count++;
}

}


public void updateItemstats(Player player){
int count = 1;
if (player.isCurrentTurn()){
for (Item item : player.getAllItems()){

if ((count == 1) && (player.isCurrentTurn())) {
Item1.add(Box.createVerticalGlue());
Item1.add(new JLabel("Value: " + item.getstats().getValue()));
Item1.add(new JLabel("Quality: " + item.getStats().getQuality()));
}
else if (count ==2){
Item2.add(Box.createVerticalGlue());
Item2.add(new JLabel("Value: " + item.getstats().getValue()));
Item2.add(new JLabel("Quality: " + item.getStats().getQuality()));

}
else if (count ==3){
Item3.add(Box.createVerticalGlue());
Item3.add(new JLabel("Value: " + item.getstats().getValue()));
Item3.add(new JLabel("Quality: " + item.getStats().getQuality()));

}
count++;

}
}
}

JButton jbNext = new JButton("Next Player");

jbNext.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
currentPlayer.setCurrentTurn(false);

}
});

对于我的主框架,我使用边框布局。当我切换玩家时发生的情况基本上是更新的信息有时是玩家 1 和 2 的混合。

值 25质量60

值 50质量20。

此外,如果玩家 1 有 1 个元素,而玩家 2 有 3 个元素,并且我从玩家 2 切换到玩家 1,有时玩家 1 会拥有玩家 2 的所有元素,而不是他自己的元素。

我认为这可能是 Item1 2 和 3 面板的问题,因此我尝试在下一个玩家单击 btn 时删除它们,但这只是导致了异常。这很可能仍然是问题所在,我可能没有正确删除它们。

有人可以帮我解决这个问题吗?

最佳答案

您应该为下一个玩家操作监听器中的下一个玩家调用 setCurrentTurn(true)

您是否已将 Player 中的 currentPlayer 变量设置为 volatile ?重要提示:Player.java 中的private Player currentPlayerprivate boolean currentPlayer 都必须是 volatile 。 (看看http://javamex.com/tutorials/synchronization_volatile.shtml)

此外,使用监视器和 wait() 而不是 Thread.sleep,这样您就可以使用 notify() 来唤醒等待线程

以下是针对您的代码的一些建议,但请注意,您必须执行更多操作(例如,在您未显示的 Player.java 类中)。

volatile List<Player> players = ...; // load your list of Player
volatile int currentPlayerIndex = 0;
volatile Player currentPlayer = null;
private final Object WAIT_MONITOR = new Object(); // yes, 'new Object()' !
[...]
public void run() throws InterruptedException {
playerLoop:
while(programRunning) { // maybe while(true)
synchronized (WAIT_MONITOR) {
loadPlayer(currentPlayer);
loadItems(currentPlayer);

updateItems(currentPlayer);
WAIT_MONITOR.wait(1000);
}
}
}

[...]

JButton jbNext = new JButton("Next Player");

jbNext.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
synchronized(WAIT_MONITOR) { // this causes that the contents of run() and this method do not run at the same time.
currentPlayer.setCurrentTurn(false);
if(players.size() > currentPlayerIndex + 1) // don't use >=
currentPlayerIndex++;
else
currentPlayerIndex = 0; // reset at the end of the list
currentPlayer = players.get(currentPlayerIndex);
currentPlayer.setCurrentTurn(true);
WAIT_MONITOR.notifyAll(); // that causes the wait() method above to be continued.
}
}
});

关于java - 在 JPanel 中显示正确的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16659225/

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