java - GridLayout 与尺寸不成比例

标签 java swing jpanel jlabel

我一直在为一个项目用 java 做填字游戏。但是,我无法解决将填字游戏绘制到 JPanel 中时遇到的一个问题

该程序从二维字符数组中获取数据,并用它生成自定义类型 JLabels 的网格。这是代码:

public void update(Observable o, Object o1) {
    if(model.getMatrix() != null){
        configurePanel(model.getRows(), model.getCols());
        this.add(panel);
        this.pack();
        this.revalidate();
        this.repaint();
    }

}

private void configurePanel(int w, int h) {
    if (panel!=null){
        this.remove(panel);
    }

    panel = new JPanel();

    panel.setBounds(40, 40, w*50, h*50);
    panel.setLayout(new GridLayout(w, h));

    labels = createLabels(model.getMatrix());

    for (int i = 0; i < w; i++){
        for(int j = 0; j < h; j++){

            panel.add(labels[i][j]);
        }           
    }
}

private CWlabel[][] createLabels(char[][] matrix) {
    int w = matrix.length;
    int h = matrix[0].length;
    labels = new CWlabel[w][h];

    for (int i = 0; i < w; i++){
        for(int j = 0; j < h; j++){
            char c = matrix[i][j];
            labels[i][j] = new CWlabel();
            labels[i][j].setBorder(BorderFactory.createLineBorder(Color.black));
            labels[i][j].setOpaque(true);
            if (c != ' '){
                labels[i][j].setBackground(Color.white);
            } else {
                labels[i][j].setBackground(Color.black);
            }
        }
    }
    return labels;
}

我的主要问题是在configurePanel()中,其中面板的大小设置为与填字游戏尺寸成比例,这应该确保其中的每个组件都是完美的正方形,但情况并非如此as seen here

在所示的示例中,差异很细微,但仍然很明显。奇怪的是,如果我手动替换,

panel.setBounds(40, 40, w*50, h*50);

与,

panel.setBounds(40, 40, 400, 450);

结果似乎与行数和列数成正比,如图 here

最佳答案

据我统计,您有 9 行和 8 列,因此调用 configurePanel 如下所示:

configurePanel(model.getRows(), model.getCols());

将导致宽度为 450 和高度为 400,但您需要宽度为 400 和高度450。因此切换第一个和第二个参数,如下所示:

configurePanel(model.getCols(), model.getRows());

注意:您不应该使用绝对定位,它会导致许多格式问题(调整组件大小、添加组件等)。您应该使用具有更多自定义功能的布局管理器,例如 GridBagLayoutMigLayout .

关于java - GridLayout 与尺寸不成比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39358588/

相关文章:

java - 如何在 android 中使用 "dynamic"视频文件填充 ListView ?

java - Hibernate的SequenceStyleGenerator生成序列下面得到的序列值

java - Java 中的语法排序

java - 为什么 .paintComponent() 定义在 JComponent 上?

java - 如何让TableSorter将一行保持在固定位置?

java - JFrame/JPanel 刷新和文本字段

java - 在 JPanels 上设置边框粗细?

java - 从过滤器重定向到 JSP 时传递属性 : Session vs Request

java - 重绘在自定义面板中不起作用

java - 键入时,从存储的现有文本中将单词(文本)插入到 JTextArea 中