【问题标题】:Get position/index of a JPanel in a GridLayout?在 GridLayout 中获取 JPanel 的位置/索引?
【发布时间】:2011-06-08 14:36:16
【问题描述】:

我正在尝试遵循 MVC 设计,目前正在我的 Controller 类中创建一个 MouseAdapter。我的一个模型类中有一个与 GridLayout 大小相同的数组。 因此,当有人单击网格中某处的 JPanel 时,我会让 MouseAdapter 通知模型并执行某些操作。 JPanel 在另一个类 View 中。

但是为此我需要那个特定 JPanel 的索引/位置,有什么方法可以得到它吗?

我查看了 MouseEvent 的 GetX 和 GetY 方法的状态:

GetX - 返回事件相对于源组件的水平 x 位置。

Get Y - 返回事件相对于源组件的垂直 y 位置。

相对于源组件,是不是说JPanel的左上角是0、0?那我怎么知道 GridLayout 中的哪些面板被点击了呢?

【问题讨论】:

    标签: java model-view-controller swing mouseevent grid-layout


    【解决方案1】:

    将您需要的信息放入您添加到组件的鼠标侦听器中。在设置中执行此操作比进行映射和查找更容易。

    【讨论】:

    • 我没有的东西怎么放?我不知道会点击哪个 JPanel,这就是我需要索引的原因。添加 GridLayout 时,您执行 setLayout(new GridLayout(8, 8)) 之类的操作。对于单击的特定 JPanel,我需要这两个数字。有没有办法使用两个 for 循环来循环网格,就像它是一个数组一样?然后也许将每个元素与 event.getSource() 进行比较? JPanel 可能不是唯一的,所以可能不会那样工作。
    • 我倾向于像这样组织它:跨行(和列)循环调用一个方法来添加每个组件。 for (int row=0; row<rowNum; ++row) { add(row, col); }。将add 定义为private void add(final int row, final int col) { Component comp = new Component(); comp.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent event) { ... do something with row and col ... }}); container.add(comp); }
    • 嗯,这可以工作,但 MouseAdapter 是在一个与 JPanel 不同的类中定义的。一个问题,两个“不同”的 JPanel 总是指两个不同的对象,对吧?即使它们具有相同的颜色等?因为那时我可以创建一个 JPanel 数组并在每个 JPanel 和添加到 GridLayout 的每个 JPanel 之间创建一个引用,然后只需比较 getSource() 和该引用,看看它们是否引用同一个对象并从那里获取索引来自变量数组?
    • 我尝试了我所说的,但要做到这一点,我必须在我的控制器中添加对模型和视图类的引用,这在 MVC 设计方面是不是很糟糕?
    【解决方案2】:

    您可以在视图类中构建一个 Map 并创建一个方法

    public void getJPanelPos(JPanel panel) 
    

    获取 tyhe 事件的 JPanel 源的位置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      相关资源
      最近更新 更多