初始化许多对象的引用变量?

时间:2010-10-15 21:44:50

标签: java swing

我在为Java类构建战舰游戏的网格时遇到了一些麻烦。到目前为止,我可以轻松地创建一个for循环来将JPanel或JButton对象添加到JFrame。但是,我的问题是我在玩游戏时需要再次使用这些面板或按钮(例如点击一个按钮,看看你的对手是否在该广场上放了一艘船等等)。 Java中是否有一种简单的方法来初始化大量对象的引用变量?或者我必须单独申报所有这些吗?

4 个答案:

答案 0 :(得分:5)

您可以尝试JPanels(或任何其他对象)的多维数组。创建一个与网格大小相同的数组。下面的行初始化一个包含5行和5列的数组。

JPanel[][] battleField = new JPanel[5][5];

使用嵌套for循环在数组中创建面板。

for (int rowIndex = 0; rowIndex < battleField.length; rowIndex++)
{
    for (int cellIndex = 0; cellIndex < battleField[rowIndex]; cellIndex++)
    {
         battleField[rowIndex][cellIndex] = new JPanel();
    }
}

如果你想稍后引用battleField数组,你只需将它变成一个实例变量。

答案 1 :(得分:4)

对于战舰游戏,您很可能希望在点击后检索按钮的位置。您可以使用按钮作为键以及它所在的点作为值来创建哈希表。

HashMap<JButton, Point> buttonMap = new HashMap<JButton, Point>();

for (int x = 0; x < COLUMNS; x++)
{
  for (int y = 0; y < ROWS; y++)
  {
     JButton btn = new JButton();
     btn.addActionListener(this);
     buttonMap.put(btn, new Point(x, y));
     //then add the button to your container
  }
}

在你的actionPerformed方法中,你可以将按钮转换为它所在的位置。

JButton btn = (JButton)actionEvent.getSource();
Point p = buttonMake.get(btn);

当然,您需要正确处理错误情况,例如来源不是按钮或按钮不在地图中......

答案 2 :(得分:2)

您可以随时扩展JButton以跟踪所需的信息。一个简单的例子:

class MyButton extends JButton{
    private MyGameInfo mygameInfo;
    private int buttonId;
    //More fields....
    //Getters/Setters
}

然后,不是在布局中创建和添加JButton个对象,而是创建MyButton个对象(这也是一个JButton,因此您的布局不会受到影响),并为游戏逻辑使用其额外的功能。

答案 3 :(得分:2)

作为参考,这里是一个使用按钮网格的相关matching game。这个相关的answer演示了模型 - 视图 - 控制器模式在简单游戏中的应用。