2

我正在创建一个游戏,其中每个玩家填充一个 3x3 网格,并且他们都有不同的网格状态(玩家对象有一个实例变量作为网格,并且网格由许多JPanels 组成)。

JList在左边有一个玩家,在右边显示了网格。当我单击列表中的玩家姓名时,有没有办法动态更改网格?

(我尝试在for每次选择玩家时循环更新网格,但是如果玩家在选择后更新网格,更新网格会变得很麻烦,即你必须让列表获得焦点等等。所以我我正在寻找一种干净的方式)

编辑:另外,我考虑过动态更改对象的引用并更新 UI,但是我有一些动作事件迫使我将变量设为 FINAL。所以我也不能这样做。

4

4 回答 4

3

您可以放置​​ 9 个面板CardLayout并交换适当的卡片。或者您可以删除旧组件并添加一个新组件,而不是在添加后调用revalidate()and repaint()

于 2011-12-26T10:54:52.960 回答
3

选择更改时不应更改网格。您应该更改网格显示的数据(即网格的数据模型)。例如,假设网格是一个包含 9 个标签的面板,每个标签显示 a 的一个元素String[][]。你的Grid对象应该有一个setModel(String[][] data)改变网格中每个标签的值。

每次玩家选择发生变化时,您都应该向所选玩家询问其数据,并setData()在网格上调用。如果玩家的数据在被选中时可以更改,您还应该在每次更改时调用 setData()。这可以PropertyChangeEvent通过在其数据更改时触发Player一个监听器来完成,如果触发事件的玩家是选定的玩家,则使用新数据更新网格的监听器。

于 2011-12-26T10:56:53.363 回答
1

所以基本上你有一个玩家列表,其中选定的玩家决定显示哪个网格。如果您将 aCardLayout用于包含网格的面板,您可以要求它在选择更新时显示对应于某个玩家的网格。

不需要特殊的for循环,只需调用CardLayout#show方法即可。

提供了完整的教程,其中包含有关使用 CardLayouts 的信息

于 2011-12-26T10:54:09.703 回答
1

为了在 Swing 中实现并发,您必须为事件调度线程安排一个作业,以便 UI 发生的任何更改都可以显示而不会出现任何问题。

像这样的东西:

public static void main(String... args)
{
  // Used to schedule a job for event-dispatcher thread
  SwingUtilites.invokeLater(new RUnnable()
   {
     public void run()
     {
        // put your code for creating and displaying the GUI here.
        // or call the method which is creating and displaying the GUI here.
     }
   }
  );
}

因此,当您进行更改时,只需使用 revalidate() 和 repaint() 方法。那会做,你想达到什么。希望这会有所帮助。

问候

于 2011-12-26T13:32:38.157 回答