【问题标题】:Java Swing Gridlayout: Accessing Specific CoordinateJava Swing Gridlayout:访问特定坐标
【发布时间】:2011-12-06 01:37:25
【问题描述】:

我正在创建一个 Java swing GUI,并且我已经格式化了一个 JPanel 以使用 GridLayout。我需要访问网格的特定“框”(即特定坐标),但我看不到这样做的方法。

我该怎么做?

【问题讨论】:

  • 您是否有机会为Towers of Hanoi 构建视图?
  • “需要访问网格的特定“框”(即特定坐标)” 1) 这为最终用户提供了哪些程序功能?网格的单元格中有什么?
  • @trashgod 不,我没有与河内塔合作——尽管我正在为游戏制作 GUI。
  • @Andrew Thompson 它允许我正在制作的游戏的玩家查看他们是否在他们猜测的单元格中“命中”或“错过”。这将被标记为 JLabel "O"

标签: java swing jpanel layout-manager grid-layout


【解决方案1】:

您不应依赖 GUI 代码(视图)为您提供有关程序数据(模型)的信息。最好的解决方案是从一开始就“知道”哪个组件在哪里——也许您应该有一个数据结构(2D 数组?)来保存组件,并在将某些内容添加到网格时进行更新。

不过,如果您想要快速且非常肮脏的修复,您可以使用JPanel.getComponentAt() 开始玩游戏。但是,这需要像素坐标,因此您需要进行一些逆向工程来计算给定方格占用了多少空间。方格之间的空间is given by your GridLayout object。这是不推荐无论如何。我只是为了完整性而将其包括在内(因为它是对您问题的更直接的回答)。

【讨论】:

  • 好吧,我想我知道我做错了什么。我只是添加了一堆 JLabel 来用 X 填充网格,然后当玩家猜测某些坐标时,X 会变成数字。不过,我没有将 JLabels 存储在任何数据结构中。我现在就试试,谢谢!
  • @KubaSub,不要存储 JLabels ......你会再次混合模型和视图。让游戏在没有 GUI 的情况下也可以玩,然后将 GUI 添加到游戏中……这样您就不会想将 UI 组件用作数据或数据存储。
  • @Paul 提出了一个很好的观点;另见MCV example
  • 感谢您的帮助,不幸的是,在阅读不存储标签之前,我已经完成了我的 MCV 任务。不过,我明白了,拥有一个包含我的组件的二维数组到底是什么意思?我一定是误会了。
  • 假设您有Mark 类,它存储XO。为了表示给定的游戏状态,您可以有一个像这样的二维数组:{{new Mark("O"), new Mark("X"), new Mark()}, {new Mark("X"), ...} ...} 要显示它,您将遍历数组并执行类似label.setText(marks[r][c].toString()) 之类的操作,其中rc 是上面的数组,toString() 方法返回相应的符号。所以你有了模型——Marks 的集合——和视图——JLabels。
【解决方案2】:

GridLayout 中,“容器被分成大小相等的矩形。”您可以在希望显示为空的地方添加一个空的透明组件,例如new JLabel("")。另见GridBagLayoutUsing Layout Managers

【讨论】:

  • 您可能会从这个使用切换按钮网格的game 获得一些想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
相关资源
最近更新 更多