0
我正在創建一個小的Game of Life應用程序。我爲我的所有單元使用了一個'動態宇宙'(在我的項目中命名爲Tiles)。但由於某種原因,我的JScrollPane
和JButtons
未渲染到幀中。我只是得到一個空的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);
}
}
我可能忽視的東西真的很愚蠢的,任何幫助表示讚賞。
這'jsp.remo veAll()'會有問題,因爲它很可能會刪除視口,這也不是必需的,因爲設置'viewportView'會做同樣的事情,無論如何 – MadProgrammer
感謝作品:)謝謝。你可以發佈它作爲答案。 – Reinard