JPanel: beide Umsetzung meiner eigenen paintcomponent () und Kinder-Rendering nicht funktioniert

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

Frage

Ich erweitere ein JPanel ein Spielbrett angezeigt werden, und das Hinzufügen einer JEditorPane am unteren Rand einige Statustext zu halten. Leider macht das Spielbrett ganz gut, aber die JEditorPane ist nur eine leere graue Fläche, bis ich den Text in ihm zu markieren, wenn es machen wird, was Text markiert ist (aber nicht den Rest). Wenn ich Verständnis Swing-Recht habe, sollte es funktionieren, weil super.paintComponent (g) sollte die anderen Kinder machen (das heißt die JEditorPane). Sag mir, o großer Stackoverflow, was bonehead Fehler bin ich machen?

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
      }
    }
  }
}
War es hilfreich?

Lösung

Ich sehe nichts sofort boneheaded über Ihren Code im Allgemeinen, aber ich würde sagen, dass Ihre Komponentenhierarchie scheint ein wenig boneheaded.

Gibt es einen Grund, warum Sie nicht Ihre Objekte trennen sich besser aus? Um Ihren Code wartbar und prüfbar zu halten, würde ich empfehlen Ihnen, GameBoard Logik in eine andere Klasse zu extrahieren. Dies würde Ihnen die Möglichkeit, durch das Entfernen der GameMap simplify Ihre paintComponent(...) zu tun

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
}

Und dann GameBoard aussehen könnte

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);
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top