java - JScrollPane - 内容和滚动条未呈现

标签 java swing jscrollpane

我正在创建一个小 Game of Life应用。我正在为我的所有单元使用“动态宇宙”(在我的项目中名为 Tiles)。但由于某种原因,我的 JScrollPaneJButtons 没有渲染到框架中。我只是得到一个空的 JFrame。 Controller 正在返回值,按钮正在构建并添加到面板中。只是 jsp.setViewportView(p); 似乎没有更新 UI。

主要:

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

用户界面类:

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.removeAll()将会有问题,因为它可能会删除视口(viewport)和JScrollBar,它也不是必需的,因为设置viewportView 无论如何都会做同样的事情

记住,JScrollPane是一个特殊的组件,它由一个JViewPort和两个JScrollBar组成,实际内容位于 >JViewport,而不是 JScrollPane

ScrollPane

关于java - JScrollPane - 内容和滚动条未呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33185792/

相关文章:

java - 包含 JPanel 的 JScrollPane 不会滚动

java - 从 HSQLDB 获取架构的最简单方法

Java 将多维数组传递给 PHP

java - 有没有办法让 JComboBox 像 HTML Select 一样工作?

java - JMenuItem - 如何确定加速器是否调用了操作?

java - 我正在尝试使用图形并绘制一些矩形

java - 在 Java8 中收集统计信息

Java:需要从字符串中提取数字

java - 如何在以下代码中根据我的喜好设置 JTextArea 和 JTextField 的大小?

java - 如何在带有复选框数组的滚动 Pane 中显示数据库查询的结果?