перекраска Java качели () - PullRequest
       6

перекраска Java качели ()

1 голос
/ 14 ноября 2009

( второй вопрос за несколько часов )

Кей, я делаю шахматный вариант в java, у меня консольная программа работает так, как я хочу, но сейчас я пытаюсь преобразовать ее в графический интерфейс Swing, в то же время сохраняя консоль без изменений. Итак, до сих пор у меня есть массив квадратов с фигурами для консоли и двумерный массив JPanels с фигурами для графического интерфейса. Я еще не реализовал перемещение частей в графическом интерфейсе, поэтому я все еще делаю это с консоли, но фактический графический интерфейс не обновляется после перемещения части ... даже если это происходит на консоли (извините, если это сбивает с толку).

Графический интерфейс пользователя состоит из конструктора, который вызывает некоторые методы drawBoard () и drawSidebar () и устанавливает размеры, заголовки и так далее ... вот как выглядит основной метод:

public static void main(String args[]) {
    ChessGUI GUI = new ChessGUI();
    Board console = new Board();
    do {
        console.printBoard();
        console.getScore();
        console.getMove();
        GUI.boardPanel.revalidate();
        GUI.sidePanel.revalidate();
        GUI.repaint();
    } while (true);
}

и drawBoard (), если это имеет значение:

public void drawBoard() {
    LayoutManager layout = new GridLayout(NUMBER_OF_ROWS, NUMBER_OF_COLS);
    boardPanel.setLayout(layout);
    boardPanel.setPreferredSize(new Dimension(200, 450));
    chessBoard = new JPanel[NUMBER_OF_ROWS][NUMBER_OF_COLS];
    for (int i = 0; i < NUMBER_OF_ROWS; i++) {
        for (int j = 0; j < NUMBER_OF_COLS; j++) {
            chessBoard[i][j] = new JPanel();
            chessBoard[i][j].setBackground(getColor(i,j));
            int index = i * 4 + j;
            if (!(boardArray.chessBoard[index].square.isEmpty())) {
                Piece piece = (Piece) boardArray.chessBoard[index].square.firstElement();
                chessBoard[i][j].add(new JLabel(piece.toString()));
            }
            boardPanel.add(chessBoard[i][j]);
        }
    }
}

методы перерисовки и повторной проверки, похоже, вообще не вызывают, хотя консоль обновляется: (

Ответы [ 3 ]

4 голосов
/ 14 ноября 2009

Я не очень понимаю, что вы делаете. Но нет смысла воссоздавать всю панель доски каждый раз, когда делается ход. Все компоненты Swing могут иметь только одного родителя, поэтому проще всего перенести элемент с одной панели на другую. Таким образом, код будет выглядеть примерно так:

previousPanel.remove( piece );
currentPanel.add( piece );
previousPanel.revalidate();
previousPanel.repaint();
currentPanel.revalidate();
2 голосов
/ 14 ноября 2009

Смена макета ничего не делает.

Вам нужно вызвать boardPanel.removeChildren ()

Однако, это будет очень медленно.

На самом деле вам нужно иметь собственный JPanel, перезаписать paintComponent () и нарисовать изображения в соответствующие измерения с помощью Java Graphics.

2 голосов
/ 14 ноября 2009

Похоже, что вы никогда ничего не удаляете из BoardPanel, даже если вы сбрасываете его LayoutManager.

Более безопасный подход может заключаться в том, чтобы удалить BoardPanel из его контейнера, затем создать новый экземпляр для BoardPanel, добавить его в контейнер, а затем добавить другие части JPanel в этот новый BoardPanel. По сути, вы будете восстанавливать всю иерархию JPanel после каждого хода.

Как вы заметили, Swing может быть довольно привередливым, если вы начнете пытаться добавлять / перемещать / удалять компоненты после их добавления в контейнеры. Для игр часто лучшим подходом было бы иметь 1 JComponent / Component и использовать методы Java2D для рисования поверх него. Swing обычно используется только для приложений на основе форм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...