2009-11-13 2 views
1

(второго вопроса в течение нескольких часов)Java Swing перекрасить()

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

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

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

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

ответ

4

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

previousPanel.remove(piece); 
currentPanel.add(piece); 
previousPanel.revalidate(); 
previousPanel.repaint(); 
currentPanel.revalidate(); 
2

это л ooks, как будто вы никогда ничего не удаляете из «boardPanel», даже если вы сбросите его LayoutManager.

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

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

2

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

Вы должны вызвать boardPanel.removeChildren()

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

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

Смежные вопросы