通过单击JPanel获取JPanel [] []坐标

时间:2015-06-02 09:59:05

标签: java arrays swing jpanel coordinates

我创建了一个JPanel[][]数组。

private JPanel[][] pnlFeld;

用面板填充

for (int i = 0; i < world.getSize(); i++) {
        for (int j = 0; j < world.getSize(); j++) {
            pnlFeld[i][j] = new JPanel();
            pnlFeld[i][j].setBorder(new EtchedBorder());
            pnlFeld[i][j].addMouseListener(ml);
            pnlFeld[i][j].setBackground(off);
            add(pnlFeld[i][j]);
        }
    }

现在我想通过点击它们来获取数组坐标([][]),我不知道如何做到这一点。

我只添加了更改我点击的面板颜色的方法,与我的问题无关。

MouseListener ml = new MouseListener() {

        @Override
        public void mouseEntered(MouseEvent e) {
            if (world.getMode().equals("Malen")) {
                if (e.getSource() instanceof JPanel)
                    e.getComponent().setBackground(on);
            //  check();
            } 
            else if (world.getMode().equals("Radieren")) {
                if (e.getSource() instanceof JPanel)
                    e.getComponent().setBackground(off);
            //  check();
            }
        }

        @Override
        public void mousePressed(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e)) {
                if (world.getMode().equals("Setzen")) {
                    if (e.getSource() instanceof JPanel) {
                        if (e.getComponent().getBackground() == off) {
                            e.getComponent().setBackground(on);
                        } else
                            e.getComponent().setBackground(off);
                    }
                //  check();
                }
            }
        }

        @Override
        public void mouseClicked(MouseEvent e) {}

        @Override
        public void mouseExited(MouseEvent e) {}

        @Override
        public void mouseReleased(MouseEvent e) {}
    };

4 个答案:

答案 0 :(得分:1)

实际上,您可以使用getBounds()来获取组件的位置和大小。如果你的意思是数组索引可能有多个解决方案。

  1. 定义地图并将所有面板放在带字符串的地图中,例如i +“:”+ j(或定义简单的pojo类,包含2个字段i和j。

  2. 为每个JPanel创建唯一的侦听器以保留i和j。

  3. 使用GridBagLayout将面板放在包含器中,然后可以使用gridBagLayoutInstance.getConstraints(theClickedPanel)并检查约束的行列

答案 1 :(得分:1)

  

点击> <?php > $getMenus = $db->next_record($db->query("SELECT COUNT(*) as total, product_menu_meals FROM product_menus WHERE 1")); > > $getMeals = (json_decode($getMenus['product_menu_meals'], true)); > > if(in_array($mainMeal['meal_id'], array_filter($getMeals['Monday'])) || > in_array($mainMeal['meal_id'], array_filter($getMeals['Tuesday'])) || > in_array($mainMeal['meal_id'], array_filter($getMeals['Wednesday'])) || > in_array($mainMeal['meal_id'], array_filter($getMeals['Thursday'])) || > in_array($mainMeal['meal_id'], array_filter($getMeals['Friday']))){echo $getMenus['total'];}; > ?> Menus

获取JPanel[][]坐标

JPanelJButton[][]一起使用,以便更轻松地进行编码并获得更好的用户体验。 ActionListenerActionEvent方法,可识别已激活的按钮。

这个chess GUI使用棋盘上64个位置的按钮。

答案 2 :(得分:0)

如果您在循环中创建MouseListener,则可以在监听器的代码中使用i en j。缺点是你会有更多的监听器实例。

答案 3 :(得分:0)

我建议您在声明和初始化面板的循环中将每个JPanel的名称设置为ij。如图所示

pnlFeld[i][j].setName(i + "" + j);

mouseClicked事件中检查事件源是否为JPanel的实例并解析名称以获取x和y坐标,如下所示:

Integer.parseInt(p.getName().subString(0,1))
Integer.parseInt(p.getName().subString(1));