Java 如何在加载ObjectInputStream时更新GUI元素
我正在编写一个棋盘游戏,我正在尝试添加保存/加载功能。我一直在使用FileInputStream和ObjectInputStream来实现这一点。我认为加载功能工作正常,但是可视化GUI元素没有更新,比如播放器位置。有没有一种简单的方法来实现这一点,比如调用repaint()或其他什么?我试过了,但还是认不出来。任何帮助都将不胜感激。这是我的密码:Java 如何在加载ObjectInputStream时更新GUI元素,java,swing,objectinputstream,Java,Swing,Objectinputstream,我正在编写一个棋盘游戏,我正在尝试添加保存/加载功能。我一直在使用FileInputStream和ObjectInputStream来实现这一点。我认为加载功能工作正常,但是可视化GUI元素没有更新,比如播放器位置。有没有一种简单的方法来实现这一点,比如调用repaint()或其他什么?我试过了,但还是认不出来。任何帮助都将不胜感激。这是我的密码: package worldofsweets; import javax.swing.*; import java.awt.*; import ja
package worldofsweets;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.*;
import java.util.*;
import java.io.*;
import javax.swing.filechooser.FileSystemView;
public class WorldOfSweets {
public static int currentPlayer = 0;
public static int maxPlayers = 0;
private Deck cardDeck;
private TurnIndicator turn;
private Board gameBoard;
private PlayerChooser playerChooser;
private JLabel numPlayers;
private boolean turnActive = true;
private StartButton start;
private DiscardPile discard;
public WorldOfSweets() {
JFrame gameFrame = new JFrame("World Of Sweets");
gameFrame.setBounds(200, 200, 1000, 800);
gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BoxLayout boxLayout = new BoxLayout(gameFrame.getContentPane(), BoxLayout.Y_AXIS);
Object[] options = {"New Game",
"Load Game"};
int n = JOptionPane.showOptionDialog(gameFrame,
"Would you like to start a new game or load a previous game?",
"World Of Sweets",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[0]);
if(n==1){
JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
int returnValue = jfc.showOpenDialog(null);
// int returnValue = jfc.showSaveDialog(null);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = jfc.getSelectedFile();
loadGame(selectedFile);
}
} else {
playerChooser = new PlayerChooser();
gameBoard = new Board(playerChooser.getPlayerNames());
discard = new DiscardPile();
cardDeck = new Deck(discard);
}
JPanel boardPanel = new JPanel();
boardPanel.add(gameBoard);
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
JPanel textUpdate = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 10));
turn = new TurnIndicator();
start = new StartButton(true);
cardDeck.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
Card currCard = cardDeck.draw();
Color newSpace = currCard.getColor();
if (currCard.getType() == "1") {
gameBoard.move(newSpace, currentPlayer);
}
else if (currCard.getType() == "2") {
gameBoard.move(newSpace, currentPlayer);
gameBoard.move(newSpace, currentPlayer);
}
else if (currCard.getType() == "M") {
gameBoard.move(newSpace, currentPlayer);
}
//cardDeck.setBackground(newSpace);
disableButton(cardDeck);
enableButton(start);
}
});
numPlayers = new JLabel("# players");
cardDeck.setPreferredSize(new Dimension(150, 300));
discard.setPreferredSize(new Dimension(150,300));
JButton saveLoad = new JButton("Save/Load");
saveLoad.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
int returnValue = jfc.showSaveDialog(null);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = jfc.getSelectedFile();
saveGame(selectedFile, gameBoard, cardDeck, discard, playerChooser);
}
}
});
buttonPanel.add(saveLoad);
//buttonPanel.add(cardType);
buttonPanel.add(cardDeck);
buttonPanel.add(discard);
buttonPanel.add(start);
buttonPanel.add(turn);
buttonPanel.add(numPlayers);
gameFrame.setLayout(boxLayout);
gameFrame.add(gameBoard);
gameFrame.add(buttonPanel);
//gameFrame.add(discard);
gameFrame.setVisible(true);
numPlayers.setText("# players: " + playerChooser.getNumPlayers());
maxPlayers = playerChooser.getNumPlayers();
turn.changeTurn(playerChooser.getPlayerNames()[0]);
currentPlayer = 1;
disableButton(start);
start.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (turnActive)
{
turnActive = false;
start.flipButton(turnActive);
if (gameBoard.playerWin(currentPlayer) == true)
{
//System.out.println("currPlayer:" + currentPlayer);
turn.setText(playerChooser.getPlayerNames()[currentPlayer-1] + " wins!");
numPlayers.setText("");
disableButton(cardDeck);
disableButton(start);
}
else
{
setNextPlayer();
turn.changeTurn(playerChooser.getPlayerNames()[currentPlayer-1]);
}
}
else if (!turnActive)
{
turnActive = true;
start.flipButton(turnActive);
enableButton(cardDeck);
disableButton(start);
}
}
});
}
public static void main(String[] args) {
WorldOfSweets game = new WorldOfSweets();
}
public void setNextPlayer() {
if (currentPlayer == maxPlayers)
currentPlayer = 1;
else
currentPlayer++;
}
public void disableButton (JButton btn) {
btn.setBorderPainted( false );
btn.setFocusPainted( false );
btn.setEnabled( false );
}
public void enableButton (JButton btn) {
btn.setBorderPainted( true );
btn.setFocusPainted( true );
btn.setEnabled( true );
}
public void saveGame(File file, Board b, Deck d, DiscardPile dp, PlayerChooser p) {
try {
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(b);
oos.writeObject(d);
oos.writeObject(dp);
oos.writeObject(p);
oos.flush();
oos.close();
}
catch (Exception e) {
System.out.println("exception save ");
}
}
public void loadGame(File file) {
try {
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
gameBoard = (Board) ois.readObject();
//int[] playerPos = (int[]) ois.readObject();
//String[] playerNames = (String[]) ois.readObject();
cardDeck = (Deck) ois.readObject();
discard = (DiscardPile) ois.readObject();
playerChooser = (PlayerChooser) ois.readObject();
ois.close();
}
catch (Exception e) {
System.out.println("exception load");
}
}
}