Domanda

( seconda domanda in poche ore )

Kay così sto facendo una variante degli scacchi in java, ho il mio programma di console di lavoro come lo voglio, ma ora sto cercando di convertirlo in una GUI altalena, pur mantenendo intatte le cose console. Così fino ad ora ho la mia serie di piazze con pezzi in loro per la console, e una matrice a 2 dimensioni di JPanels con pezzi in loro per la GUI. Non ho implementato pezzi in movimento nella GUI eppure così sto ancora facendo dalla console, ma l'interfaccia grafica attuale non si aggiorna dopo ho spostato un pezzo ... anche se lo fa sulla console (scusate se questo è confusione).

L'interfaccia grafica è costituita da un costruttore che chiama alcuni metodi drawBoard () e drawSidebar () e imposta le dimensioni, i titoli etcetc ... quindi questo è ciò che il metodo principale appare come:

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

e drawBoard () in caso non fa alcuna differenza:

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

il repaint e prorogare metodi non sembrano essere chiamata a tutti, anche se la console è in fase di aggiornamento: (

È stato utile?

Soluzione

Io non capisco quello che stai facendo. Ma non ha senso per ricreare l'intero pannello bordo ogni volta che una mossa è fatta. Tutti i componenti Swing possono avere un solo genitore, per la soluzione più semplice è quella di spostare solo il pezzo da un pannello all'altro. Quindi il codice sarebbe qualcosa di simile:

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

Altri suggerimenti

Sembra che non si è mai in realtà la rimozione di qualsiasi cosa, da 'boardPanel', anche se si sta reimpostando la sua LayoutManager.

Un approccio più sicuro potrebbe essere quello di rimuovere il 'boardPanel' dal suo contenitore, quindi creare una nuova istanza per 'boardPanel,' aggiungere che al contenitore, quindi aggiungere gli altri pezzi JPanel a questa nuova 'boardPanel.' In effetti, si sarebbe ricostruire l'intera gerarchia JPanel dopo ogni mossa.

Come avete notato, swing può essere molto pignoli, una volta che si avvia il tentativo di aggiungere / spostare / rimuovere i componenti dopo che sono stati aggiunti ai contenitori. Per i giochi, spesso l'approccio migliore sarebbe quella di avere 1 JComponent / Component e utilizzare metodi Java2D per disegnare su di esso. Swing è in genere utilizzato solo per le applicazioni basate su moduli.

La modifica del layout non fa nulla.

È necessario chiamare boardPanel.removeChildren ()

Tuttavia, questo sta per essere estremamente lento.

In realtà, ciò che si dovrebbe fare è avere il proprio JPanel, sovrascrivere paintComponent () e disegnare le immagini nelle dimensioni appropriate utilizzando Java grafica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top