Java 如何在加载ObjectInputStream时更新GUI元素

Java 如何在加载ObjectInputStream时更新GUI元素,java,swing,objectinputstream,Java,Swing,Objectinputstream,我正在编写一个棋盘游戏,我正在尝试添加保存/加载功能。我一直在使用FileInputStream和ObjectInputStream来实现这一点。我认为加载功能工作正常,但是可视化GUI元素没有更新,比如播放器位置。有没有一种简单的方法来实现这一点,比如调用repaint()或其他什么?我试过了,但还是认不出来。任何帮助都将不胜感激。这是我的密码: package worldofsweets; import javax.swing.*; import java.awt.*; import ja

我正在编写一个棋盘游戏,我正在尝试添加保存/加载功能。我一直在使用FileInputStream和ObjectInputStream来实现这一点。我认为加载功能工作正常,但是可视化GUI元素没有更新,比如播放器位置。有没有一种简单的方法来实现这一点,比如调用repaint()或其他什么?我试过了,但还是认不出来。任何帮助都将不胜感激。这是我的密码:

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

}