2009-11-13 4 views
1

(secondes question en quelques heures)Java Swing repeindre()

Kay donc je fais une variante d'échecs en java, je travaille mon programme de la console que je veux, mais maintenant je suis en train pour le convertir en une interface graphique swing tout en gardant les choses de la console intacte. Donc, jusqu'à maintenant, j'ai mon tableau de carrés avec des morceaux pour la console, et un tableau bidimensionnel de JPanels avec des morceaux pour l'interface graphique. Je ne l'ai pas mis en œuvre à déplacer les pièces dans l'interface graphique encore si je fais encore de la console, mais l'interface graphique réelle ne met pas à jour après que je l'ai déplacé un morceau ... même si elle le fait sur la console (désolé si cela prête à confusion).

L'interface se compose d'un constructeur qui appelle certaines méthodes drawBoard() et drawSidebar() et définit la taille, titres etcetc ... donc c'est ce que la principale méthode ressemble à:

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

et drawBoard () Incase cela fait une différence:

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

les repeindre et les méthodes revalider ne semblent pas appeler du tout, même si la console est mise à jour :(

Répondre

4

Je ne comprends pas vraiment ce que vous faites. Mais cela n'a pas de sens de recréer l'ensemble du tableau à chaque fois qu'un mouvement est effectué. Tous les composants Swing ne peuvent avoir qu'un seul parent, la solution la plus simple consiste simplement à déplacer la pièce d'un panneau à l'autre. Ainsi, le code serait quelque chose comme:

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

il l Il semble que vous ne retiriez jamais rien de 'boardPanel', même si vous réinitialisez son LayoutManager. Une approche plus sûre pourrait être de supprimer 'boardPanel' de son conteneur, puis de créer une nouvelle instance pour 'boardPanel', d'ajouter cela au conteneur, puis d'ajouter les autres éléments JPanel à ce nouveau 'boardPanel.' Effectivement, vous reconstruiriez toute la hiérarchie JPanel après chaque déplacement.

Comme vous l'avez remarqué, Swing peut être très pointilleux une fois que vous commencez à essayer d'ajouter/déplacer/supprimer des composants après qu'ils ont été ajoutés aux conteneurs. Pour les jeux, la meilleure approche consiste souvent à utiliser 1 méthode JComponent/Component et à utiliser des méthodes Java2D pour dessiner dessus. Swing est généralement utilisé uniquement pour les applications basées sur des formulaires.

2

Changer la mise en page ne fait rien.

Vous devez appeler boardPanel.removeChildren()

Cependant, cela va être extrêmement lent.

Vraiment, ce que vous devez faire est d'avoir votre propre JPanel, remplacer paintComponent() et d'en tirer les images dans les dimensions appropriées en utilisant Java Graphics.