JScrollPane - 内容和滚动条不呈现

问题描述:

我正在创建一个小的Game of Life应用程序。我为我的所有单元使用了一个'动态宇宙'(在我的项目中命名为Tiles)。但由于某种原因,我的JScrollPaneJButtons未渲染到帧中。我只是得到一个空的JFrame。控制器正在返回值,按钮正在构建并添加到面板。只是jsp.setViewportView(p);似乎没有更新用户界面。JScrollPane - 内容和滚动条不呈现

主营:

GOLController controller = new GOLController(); 
controller.run(); 
SwingUtilities.invokeLater(() -> { 
    GameOfLifeFrame frame = new GameOfLifeFrame(controller); 
    frame.init(); 
}); 

UI类:

package org.gameoflife.ui; 

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.HeadlessException; 
import java.util.List; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import org.gameoflife.controller.GOLController; 
import org.gameoflife.model.Tile; 

public class GameOfLifeFrame extends JFrame { 

    private final GOLController controller; 
    private JScrollPane jsp; 

    public GameOfLifeFrame(GOLController controller) throws HeadlessException { 
     super("Game of Life"); 
     this.controller = controller; 
    } 


    public void init() { 
     jsp = new JScrollPane(); 
     add(jsp); 

     setLocationRelativeTo(null); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setExtendedState(JFrame.MAXIMIZED_BOTH); 
     setVisible(true); 

     controller.setLock(); 
     this.draw(); 
     controller.releaseLock(); 
    } 

    public void draw(){ 
     List<List<Tile>> currentState = controller.getTiles(); 
     GridLayout layout = new GridLayout(currentState.size(), currentState.get(0).size()); 

     JPanel p = new JPanel(layout); 
     currentState.stream().forEach((currentTiles) -> { 
      currentTiles.stream().map((t) -> { 
      JButton b=new JButton(" "); 
      b.setBackground(t.isHasLife() ? Color.GREEN : Color.BLACK); 
      return b; 
      }).forEach((b) -> { 
       p.add(b); 
      }); 
     }); 
     jsp.removeAll(); 
     jsp.setViewportView(p); 
    } 

} 

我可能忽视的东西真的很愚蠢的,任何帮助表示赞赏。

+0

这'jsp.remo veAll()'会有问题,因为它很可能会删除视口,这也不是必需的,因为设置'viewportView'会做同样的事情,无论如何 – MadProgrammer

+0

感谢作品:)谢谢。你可以发布它作为答案。 – Reinard

此:jsp.removeAll()将是有问题的,因为它有可能删除的视口和JScrollBar S,它也没有必要,因为设置viewportView会做同样的事情,反正

记住,JScrollPane是specailsed组件,它由一个JViewPort和两个JScrollBar S,实际内容生活在JViewport,而不是JScrollPane

ScrollPane