【问题标题】:Difference between initialization of array with two dimensions二维数组初始化的区别
【发布时间】:2015-01-21 12:51:19
【问题描述】:

在我的 JPanel 中,我使用的是 tablelayout.jar Oracle 库(看看 here),所以通常我必须执行以下操作:

private double[][] size = {
        {30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30},
        {30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30}
};
JPanel p = new JPanel();
p.setLayout(new TableLayout(size));

其中“30”分别是 cos 和 rows 的维度。在这种情况下,我们需要方形单元格。所以我可以这样做,例如:

p.add(new JButton(), "1,4" /*"col,row"*/);

我们认为像这样声明“大小”矩阵并不好,因此我们将初始化更改如下:

size = new double[Constants.GUI_ROWS][Constants.GUI_COLS];
for (int i=0; i<Constants.GUI_COLS-1; i++) 
  for (int j=0; j<Constants.GUI_ROWS-1; j++)
    size[i][j] = 30;

在哪里

Constants.GUI_COLS = 19 ({30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30}) 

Constants.GUI_ROWS = 17 ({30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30})

但这不起作用。当我们尝试向 JPanel 添加一些东西时,什么都不会显示。它只有在我们手动编写第一个初始化时才有效。为什么会这样?

【问题讨论】:

  • for 循环条件中不应该是Constants.GUI_COLS而不是Constants.GUI_COLS-1
  • 你试过调试吗?您确定生成的数组等同于硬编码的数组吗?此外,您应该发布您的常量。
  • 我认为问题出在你所说的......硬编码的数组与生成的数组不同......
  • 好吧,不像我,你实际上可以检查它。只需在某处输出Arrays.deepToString(size)
  • 硬编码数组有 行:第一行有 19 个元素,第二行有 17 个元素。生成的数组应该有 19 行:每行 17 个元素。不清楚你想在这里实现什么。

标签: java arrays swing multidimensional-array array-initialization


【解决方案1】:

要实现与手动操作相同的效果,您可以使用

double size[][];
size = new double[2][];
size[0]=new double[19];
size[1]=new double[17];
for (int i=0; i<19; i++)
    size[0][i] = 30;

for (int i=0; i<17; i++)
    size[1][i] = 30;

【讨论】:

  • 谢谢!现在更清楚了!我犯了一个错误,因为我认为这两个初始化是同一件事:(
【解决方案2】:

您将循环条件减一。应该是:

for (int i=0; i<Constants.GUI_COLS; i++) 
  for (int j=0; j<Constants.GUI_ROWS; j++)
    size[i][j] = 30;

注意如果这个调用

p.setLayout(new TableLayout(size));

在此调用之前:

size = new double[Constants.GUI_ROWS][Constants.GUI_COLS];

size 引用的旧数组将被 TableLayout 使用。

【讨论】:

  • 好的...也许我在编写代码时犯了一个错误,但问题不在于...即使我按照您编写的方法进行操作,问题仍然存在。什么都没有显示。我认为根据初始化,矩阵有不同的表示形式......
  • @LoryLory 问题是你是在初始化二维数组的循环之前还是之后调用p.setLayout(new TableLayout(size));
  • 我当然叫 p.setLayout(new TableLayout(size)); AFTER for 循环初始化
猜你喜欢
  • 2012-11-29
  • 2012-05-20
  • 1970-01-01
  • 2021-02-22
  • 2011-12-08
  • 2012-01-27
相关资源
最近更新 更多