“一次”使用两个MouseListener

时间:2014-03-04 19:13:46

标签: java swing grid jlabel mouselistener

让我们他们有一个由2个JLabel制成的2x2网格。我想在单击字段和其他内容时显示JLabel(String)的内容,当在另一个字段上释放鼠标时(或者在同一字段上释放时相同)。

在我的for子句中给出了每个字段(x; y)的坐标,我可以使用实际位置,同时使用这个循环来创建坐标

for (int y = s - 1; y >= 0; y--) { //starting with int s,v = 2
for (int x = 0; x < v; x++) {
  field[x][y] = new JLabel((x) + ";" + (y));
  field[x][y].setName((x) + ";" + (y));

使用

添加一个监听器
field[x][y].addMouseListener(new myMouseListener()); 

并在我的类mousePressed

中获取这样的setName()
Component c = e.getComponent();
sysout(c.getName());

...在mouseReleased中同样的事情

d = e.getComponent();
System.out.println(d.getName());

在理论上我释放鼠标时应该得到不同的坐标,但是我总是得到与按下鼠标时相同的坐标。

例如:c.getName()返回3; 2 AND d.getName()返回3; 2

我该如何改变?

1 个答案:

答案 0 :(得分:1)

更不用说,这个演示展示了如何解决您的问题:

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class JLabelsDemo {

    JFrame frame = new JFrame();
    JLabel[][] label = new JLabel[2][2];
    GridLayout gridLayout = new GridLayout(2, 2, 10, 10);

    public JLabelsDemo() {

        frame.setLayout(gridLayout);
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                label[i][j] = new JLabel("");
                label[i][j].setOpaque(true);
                label[i][j].setBackground(Color.red);
                final String msg = "JLabel " + i + "," + j;
                label[i][j].addMouseListener(new MouseAdapter() {
                    @Override
                    public void mouseClicked(MouseEvent e) {
                        JOptionPane.showMessageDialog(null, msg);
                    }

                });
                frame.add(label[i][j]);
            }

        }
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        //frame.pack();
        frame.setSize(320, 240);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JLabelsDemo();
            }
        });
    }
}

但我仍然建议不要将JLabels用作可点击的组件。相反,使用JButton是因为更容易实现事件监听器。

相关问题