无法将不同的鼠标事件侦听器添加到不同的面板

时间:2013-08-12 13:47:13

标签: java swing jpanel mouseevent event-listener

简介

我试图在网格视图中显示文件夹中的所有文件,当单击该文件时,我应该在命令行上打印出该名称。

我有所有文件的jpanel,所以我试图检测点击jpanel并在循环中为该面板分配操作。

我的问题,

当使用for循环时,我有变量“name”,它保存文件名,我试图像这样添加鼠标监听器,

panel[i].addMouseListener(new MouseAdapter(){
    public void mouseClicked(MouseEvent e){
        System.out.println("MOUSE_RELEASED_EVENT:for "+name);
    }
});

正如您所注意到的,我正在迭代i,因此将鼠标滑块添加到所有面板,但问题是变量名称本身正在鼠标滑块中使用。

示例

如果上面写的不是解释它的方法,我的意思是说我有两个文件,A和B.

我正在寻找的是,首先是鼠标监听器,

System.out.println("MOUSE_RELEASED_EVENT:for A"); //Since name="A" here.

第二个文件是,

System.out.println("MOUSE_RELEASED_EVENT:for B");  //Since name="B" here.

但是它不会发生这种情况,变量名本身附加到鼠标侦听器,而我得到的总是名称的最终值,在我的示例中“B”总是如此。因为它是循环中name的最后一个值。

如何解决这个问题?

作为额外的,有人可以告诉我是否可以在子面板的BorderLayout中修改大小,无论我使用什么,它们都会调整大小,setSize, setPreferredSize, setMaximumSize, setMinimumSize.

感谢您的时间和努力。

3 个答案:

答案 0 :(得分:2)

您可以使用JPanel的{​​{1}}方法存储变量。

然后在听众中使用setName()/getName()

答案 1 :(得分:1)

或者,制作GridLayoutJButton个实例,每个按钮都有一个合适的Action,如图here所示。每个Action都可以保留对自己File的引用。

答案 2 :(得分:0)

对于将来的引用,我的最终代码,如StanislavL所建议的,我首先设置了jpanel的名称,

然后单击时检索它,并且工作正常。

    panel[i].setName(name);
panel[i].addMouseListener(new MouseAdapter(){
    public void mouseClicked(MouseEvent e){
        System.out.println("MOUSE_RELEASED_EVENT:for "+ ((JPanel)e.getSource()).getName());
    }
});