动态替换特定的GUI元素

时间:2011-12-26 10:28:03

标签: java swing windowbuilder

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

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

(我尝试在每次选择一个玩家时进行for循环来更新网格但是如果玩家在被选中后更新了网格,那么更新网格会变得很糟糕,即你必须制作列表获得焦点等所以我正在寻找一个干净的方式)

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

4 个答案:

答案 0 :(得分:3)

您可以使用CardLayout放置9个面板并交换正确的卡片。或者,您可以移除旧组件并添加新组件,而不是在添加后调用revalidate()repaint()

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

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

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

整个tutorial可提供有关使用CardLayouts的信息

答案 3 :(得分:1)

为了实现Concurrency in Swing,您必须为事件调度线程安排一个作业,这样无论发生什么变化都可以在没有任何连接的情况下显示。

这样的事情:

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()方法。这样做,你想要实现的目标。 希望能有所帮助。

此致