2

介绍:

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

我有所有文件的 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.

感谢您的时间和努力。

4

3 回答 3

2

您可以使用JPanel'setName()/getName()方法将变量存储在那里。

然后在监听器中使用((JPanel)event.getSource()).getName();

于 2013-08-12T14:00:30.103 回答
1

或者,创建一个GridLayout实例JButton,每个按钮都有一个合适的,如此Action所示。每个都可以持有对自己的引用。ActionFile

于 2013-08-12T14:02:20.450 回答
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());
    }
});
于 2013-08-12T14:06:01.910 回答