2015-10-17 115 views
0

我正在創建一個小的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

回答

1

此:jsp.removeAll()將是有問題的,因爲它有可能刪除的視口和JScrollBar S,它也沒有必要,因爲設置viewportView會做同樣的事情,反正

記住,JScrollPane是specailsed組件,它由一個JViewPort和兩個JScrollBar S,實際內容生活在JViewport,而不是JScrollPane

ScrollPane