Domanda

Sto estendendo un JPanel per visualizzare un gioco da tavolo, e l'aggiunta di un JEditorPane in fondo per contenere un testo di stato. Purtroppo, il tabellone di gioco rende più che bene, ma la JEditorPane è solo una zona grigia vuota fino a quando ho evidenziare il testo in esso, quando renderà qualunque testo è evidenziato (ma non il resto). Se ho la comprensione swing destra, dovrebbe funzionare, perché super.paintComponent (g) dovrebbe rendere gli altri bambini (vale a dire, il JEditorPane). Dimmi, o grande StackOverflow, ciò che Bonehead errore sto facendo?

public GameMap extends JPanel {
  public GameMap() {
    JEditorPane statusLines = new JEditorPane("text/plain","Stuff");
    this.setLayout(new BoxLayout(this,BoxLayout.PAGE_AXIS));
    this.add(new Box.Filler(/*enough room to draw my game board*/));
    this.add(statusLines);
  }
  public void paintComponent(Graphics g){
    super.paintComponent(g);
    for ( all rows ){
      for (all columns){
        //paint one tile
      }
    }
  }
}
È stato utile?

Soluzione

Non vedo nulla di immediatamente boneheaded circa il codice in generale, ma direi che la gerarchia dei componenti sembra un po 'boneheaded.

C'è un motivo per cui non si sta separando gli oggetti fuori meglio? Al fine di mantenere il vostro mantenibile codice e verificabile, l'invitiamo ad estrarre la logica GameBoard in una classe diversa. Questo darebbe la possibilità di fare semplificare la vostra GameMap rimuovendo la paintComponent(...)

public class GameMap extends JPanel{
  private JEditorPane status;
  private GameBoard board;
  public GameMap() {
    status= createStatusTextPane();
    board = new GameBoard();
    this.setLayout(new BoxLayout(this,BoxLayout.PAGE_AXIS));
    this.add(board);
    this.add(status);
  }
  //...all of the other stuff in the class
  // note that you don't have to do anything special for painting in this class
}

E poi il tuo GameBoard potrebbe apparire come

public class GameBoard extends JPanel {
  //...all of the other stuff in the class
  public void paintComponent(Graphics g) {
    for (int row = 0; row < numrows; row++)
      for (int column = 0; column < numcolumns ; column ++)
        paintCell(g, row, column);
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top