Как я могу сохранить состояние своей программы и загрузить ее?

Я пытаюсь сохранить и перезагрузить состояние моей программы Swing, которая в данном случае является игрой сапер. Мой код для платы ниже.

package mines; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Random; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; public class Board extends JPanel { public static void main (String[] args) {} private final int NUM_IMAGES = 13; private final int CELL_SIZE = 15; private final int COVER_FOR_CELL = 10; private final int MARK_FOR_CELL = 10; private final int EMPTY_CELL = 0; private final int MINE_CELL = 9; private final int COVERED_MINE_CELL = MINE_CELL + COVER_FOR_CELL; private final int MARKED_MINE_CELL = COVERED_MINE_CELL + MARK_FOR_CELL; private final int DRAW_MINE = 9; private final int DRAW_COVER = 10; private final int DRAW_MARK = 11; private final int DRAW_WRONG_MARK = 12; private int[] field; private boolean inGame; private int mines_left; private Image[] img; private int mines = 40; private int rows = 16; private int cols = 16; private int all_cells; private JLabel statusbar; public Board(JLabel statusbar) { this.statusbar = statusbar; img = new Image[NUM_IMAGES]; for (int i = 0; i < NUM_IMAGES; i++) { img[i] = (new ImageIcon(this.getClass().getResource((i) + ".png"))).getImage(); } setDoubleBuffered(true); addMouseListener(new MinesAdapter()); newGame(); } public void newGame() { Random random; int current_col; int i = 0; int position = 0; int cell = 0; random = new Random(); inGame = true; mines_left = mines; all_cells = rows * cols; field = new int[all_cells]; for (i = 0; i < all_cells; i++) field[i] = COVER_FOR_CELL; statusbar.setText(Integer.toString(mines_left)); i = 0; while (i < mines) { position = (int) (all_cells * random.nextDouble()); if ((position  0) { cell = position - 1 - cols; if (cell >= 0) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; cell = position - 1; if (cell >= 0) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; cell = position + cols - 1; if (cell = 0) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; cell = position + cols; if (cell < all_cells) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; if (current_col = 0) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; cell = position + cols + 1; if (cell < all_cells) if (field[cell] != COVERED_MINE_CELL) field[cell] += 1; cell = position + 1; if (cell  0) { cell = j - cols - 1; if (cell >= 0) if (field[cell] > MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } cell = j - 1; if (cell >= 0) if (field[cell] > MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } cell = j + cols - 1; if (cell  MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } } cell = j - cols; if (cell >= 0) if (field[cell] > MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } cell = j + cols; if (cell  MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } if (current_col = 0) if (field[cell] > MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } cell = j + cols + 1; if (cell  MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } cell = j + 1; if (cell  MINE_CELL) { field[cell] -= COVER_FOR_CELL; if (field[cell] == EMPTY_CELL) find_empty_cells(cell); } } } public void paint(Graphics g) { int cell = 0; int uncover = 0; for (int i = 0; i < rows; i++) { for (int j = 0; j  COVERED_MINE_CELL) { cell = DRAW_WRONG_MARK; } else if (cell > MINE_CELL) { cell = DRAW_COVER; } } else { if (cell > COVERED_MINE_CELL) cell = DRAW_MARK; else if (cell > MINE_CELL) { cell = DRAW_COVER; uncover++; } } g.drawImage(img[cell], (j * CELL_SIZE), (i * CELL_SIZE), this); } } if (uncover == 0 && inGame) { inGame = false; statusbar.setText("Game won"); } else if (!inGame) statusbar.setText("Game lost"); } class MinesAdapter extends MouseAdapter { public void mousePressed(MouseEvent e) { int x = e.getX(); int y = e.getY(); int cCol = x / CELL_SIZE; int cRow = y / CELL_SIZE; boolean rep = false; if (!inGame) { newGame(); repaint(); } if ((x < cols * CELL_SIZE) && (y  MINE_CELL) { rep = true; if (field[(cRow * cols) + cCol]  0) { field[(cRow * cols) + cCol] += MARK_FOR_CELL; mines_left--; statusbar.setText(Integer.toString(mines_left)); } else statusbar.setText("No marks left"); } else { field[(cRow * cols) + cCol] -= MARK_FOR_CELL; mines_left++; statusbar.setText(Integer.toString(mines_left)); } } } else { if (field[(cRow * cols) + cCol] > COVERED_MINE_CELL) { return; } if ((field[(cRow * cols) + cCol] > MINE_CELL) && (field[(cRow * cols) + cCol] < MARKED_MINE_CELL)) { field[(cRow * cols) + cCol] -= COVER_FOR_CELL; rep = true; if (field[(cRow * cols) + cCol] == MINE_CELL) inGame = false; if (field[(cRow * cols) + cCol] == EMPTY_CELL) find_empty_cells((cRow * cols) + cCol); } } if (rep) repaint(); } } } } 

Есть несколько возможных вариантов …

Ты мог

Используйте API Properties , который обеспечивает сохранение и загрузку.

API работает как Map , позволяя вам хранить пары ключ / значение, которые вы можете сохранить и загрузить по мере необходимости.

API позволяет хранить только значения String , поэтому вам нужно будет преобразовать значения, отличные от String, вручную.

Просто не забудьте сохранить их, поскольку API не автоматически сохраняет изменения

Посмотрите на свойства для более подробной информации.

Ты мог

Создайте собственный XML-файл или используйте что-то вроде JAXB, которое позволяет связывать свойства объекта и экспортировать / импортировать их в / из XML

Этот подход был бы более гибким, чем использование Properties , но вводит уровень сложности

Ты мог

Используйте API Preferences , который позволяет хранить значения String и примитивов, без необходимости выполнять любой тип конверсии.

API Preferences также автоматически загружает и сохраняет его содержимое, но он будет делать это там, где он хочет, поэтому вы теряете контроль над тем, где хранится контент.

Ты мог

Например, используйте автономную / однопользовательскую базу данных, например, H2 или HSQLDB . Это немного сложнее, но позаботится об основных требованиях к хранению.

Это также потребует дополнительного времени для обновления, если вы измените свои требования, что-то вроде использования « Properties или « Preferences и может быть немного переборщиком, если все, что вы храните, – это данные ячейки … IMHO

Ты мог

Попробуйте использовать сериализацию объектов, но API никогда не предназначался для долговременного хранения состояний объектов, а carrie – это проблема с задачами, и я бы лично избегал этого, но это я.

В Java-приложении существует множество способов для сериализации приложения. данные.

  • Для апплетов есть куки.
  • Для приложений. запущен с использованием JWS, PersistenceService
  • Любое приложение. может использовать API Preferences .

Все эти формы сериализации предназначены для материалов, которые могут быть закодированы в имя и значение на основе String.

  • Файл Properties также хорош для информации типа name / value.
  • Для более сложных данных я бы создал компонент и использовал XMLEncoder / XMLDecoder .
  • Zip-файл хорош для сериализации данных, которые могут быть во многих разных формах (например, часть XML, часть свойств, некоторые снимки экрана).

Если вы используете свойства, XML или Zip-архив, это хорошее место для сохранения информации. является подкаталогом user.home . Он воспроизводимый и приложение. должны иметь права на чтение / запись.

  • Как сериализовать объект Exception в C #?
  • Сериализация экземпляра classа для JSON
  • Как десериализовать XML-документ
  • .NET NewtonSoft JSON десериализует карту для другого имени свойства
  • Передача сложных навигационных параметров с помощью MvvmCross ShowViewModel
  • Дессериализация XML для объектов в C #
  • Имеются ли атрибуты DataContract для WCF
  • Настройте SparkContext с помощью sparkConf.set (..) при использовании искровой оболочки
  • Поле Gson Serialize, если оно не пустое или не пустое
  • Как сериализовать объект в строку
  • Что библиотека JSON хорошо работает для вас в .NET?
  • Interesting Posts

    Прослушать изменение значения моего текстового поля

    Как объединить несколько изображений в одно изображение в Android?

    C # HttpClient 4.5 multipart / form-data upload

    Редактирование записей контекстного меню Windows после операции перетаскивания правой кнопкой мыши

    SSL и непонимание вручную

    Ошибка: XDG_RUNTIME_DIR не установлен в среде. Gtk-WARNING **: невозможно открыть дисплей:

    Как рисовать границу только на одной стороне линейного макета?

    ‘object’ не содержит определения для ‘X’

    Обработчик против AsyncTask

    Строгое поведение управляющей вкладки в Notepad ++

    Форма слишком большого исключения

    Получить соответствующие координаты всех слов на странице с помощью itextsharp

    Какое программное обеспечение для виртуальных машин предпочтительнее для запуска предварительного просмотра Windows 8?

    Как программно изменить настройку адреса конечной точки WCF app.config?

    Выпускать / обновлять IP-адрес через терминал в OS X

    Давайте будем гением компьютера.