我正在创建一个游戏,其中每个玩家填充3x3网格并且他们都具有不同的网格状态(玩家对象具有实例变量作为网格,并且网格由许多JPanel
s组成)。
左边有一个JList
个玩家,右边显示网格。当我点击列表中的玩家姓名时,有没有办法动态更改网格?
(我尝试在每次选择一个玩家时进行for
循环来更新网格但是如果玩家在被选中后更新了网格,那么更新网格会变得很糟糕,即你必须制作列表获得焦点等所以我正在寻找一个干净的方式)
编辑:另外,我考虑过动态更改对象的引用并更新UI但是我有一些动作事件强制我使变量FINAL。所以我也不能这样做。
答案 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()方法。这样做,你想要实现的目标。 希望能有所帮助。
此致