JPanel: tanto la implementación de mi propia paintComponent () y la prestación de los niños no funciona

StackOverflow https://stackoverflow.com/questions/2752593

Pregunta

Les extiendo un JPanel para mostrar un tablero de juego, y la adición de un JEditorPane en la parte inferior para sostener un texto de estado. Por desgracia, el tablero de juego hace muy bien, pero el JEditorPane es sólo un área gris en blanco hasta que resaltar el texto en ella, cuando se trata de prestar cualquier texto resaltado (pero no el resto). Si estoy en lo correcto entendimiento Swing, que debería funcionar, porque super.paintComponent (g) debería hacer que los otros niños (es decir, el JEditorPane). Dime, oh gran stackoverflow, lo estúpido error estoy haciendo?

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
      }
    }
  }
}
¿Fue útil?

Solución

No veo nada boneheaded inmediatamente sobre su código en general, pero yo diría que su jerarquía de componentes parece un poco estúpida.

¿Hay alguna razón por la que no se van a separar sus objetos fuera mejor? Con el fin de mantener su mantenible código y comprobable, me animo a extraer la lógica GameBoard en una clase diferente. Esto le daría la capacidad de hacer simplificar su GameMap quitando el 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
}

Y entonces su GameBoard podría parecerse

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);
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top