JPanel: beide Umsetzung meiner eigenen paintcomponent () und Kinder-Rendering nicht funktioniert
-
02-10-2019 - |
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
}
}
}
}
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);
}
}