【问题标题】:Same component on multiple JFrame instances多个 JFrame 实例上的相同组件
【发布时间】:2017-04-23 15:33:49
【问题描述】:
我正在开发一个游戏项目。我创建了一个 GUI 类,我想为游戏的每个玩家创建一个它的实例。所以每个玩家都会有一个游戏画面。
有些信息会显示在特定的播放器屏幕上,有些会很常见。为了显示常见信息,我创建了一个静态 JLabel,在其中放置了一个图标。但我有一个问题,图标只出现在其中一个屏幕上。
为什么会这样?
【问题讨论】:
标签:
java
swing
user-interface
【解决方案1】:
简短的回答:你不能。 Swing 库的一个基本规则是,一个组件只会显示在一个且只有一个容器中,通常是该组件被添加到的最后一个容器。
更长的答案:你不想。您希望以这样一种方式构建您的程序,即程序的模型、它的逻辑基础,与它的视图、GUI 本身完全分离。因此,您要做的是让每个 GUI 元素共享相同的模型,并使用此信息创建自己独特的视图。这也有好处,因为如果玩家想要以不同的视角或视点显示元素,他们可以在不影响其他玩家看到的情况下做到这一点。
旁注:请注意,单个 ImageIcon 可以在 GUI 的多个单独位置共享和查看,因为它不是 Swing 组件,但 JLabel 不能在多个位置查看。
附注 2:请务必阅读:The Use of Multiple JFrames: Good or Bad Practice?,因为其中包含与您的程序结构相关的信息。
旁注 3,关于:
为了显示常见信息,我创建了一个静态 JLabel...
如果可能的话,我会避免使用静态字段。虽然在小型简单的玩具程序中这样做很好,但它不能很好地扩展,因为您使用的静态字段越多,增加代码耦合的风险就越大,从而增加其(圈)复杂性,从而增加它的难以治愈错误的风险。通过隐藏信息、增加类凝聚力和减少代码耦合来遵循良好的 OOP 实践,您将成为一名快乐的编码人员,拥有更简洁、更易于调试和增强程序的代码。