Jpanel: оба реализуют свой собственный PaintComponent () и рендеринг детей не работает

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

Вопрос

Я расширяющую JPANEL для отображения игровой доски и добавляя джеедиторпана внизу, чтобы удерживать некоторые текст статуса. К сожалению, игровой доске оказывается просто в порядке, но джедаторист - это просто пустая серая область, пока я не подчеркиваю текст в нем, когда он будет представлять собой все, что текст выделен (но не остальное). Если я понимаю качели справа, он должен работать, потому что Super.paintComponent (G) должен оказывать другие дети (то есть джедатористы). Скажи мне, о великолепном стопорном потоке, какую ошибку Bonehead я делаю?

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
      }
    }
  }
}
Это было полезно?

Решение

Я не вижу ничего, сразу костей о вашем коде в целом, но я бы сказал, что иерархия компонентов кажется немного костей.

Есть ли причина, почему вы больше не разделяете свои объекты? Для того, чтобы сохранить ваш код, поддерживаемый и реагируемый, я бы поощрял вас извлечь GameBoard логика в другой класс. Это даст вам возможность сделать упрощение вашего GameMap Сняв 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
}

А потом твой GameBoard может выглядеть как

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);
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top