我们用4个JLabel制作2x2网格。我想在单击一个字段和其他内容时,在另一个字段上释放鼠标时(或在同一字段上释放时,则相同)显示JLabel(字符串)的内容。
在为每个字段(x; y)提供坐标的for子句中,我可以使用实际位置,同时使用此循环创建坐标
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());
...鼠标中的相同内容
d = e.getComponent();
System.out.println(d.getName());
从理论上讲,当释放鼠标时,我应该获得不同的坐标,但是与按下鼠标时,我总是得到相同的坐标。
例如:c.getName()返回3; 2 AND d.getName()返回3; 2
我该如何更改?
最佳答案
更少的是,此演示演示了如何解决您的问题:
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,因为它更容易实现事件侦听器。关于java - 一次使用两个MouseListener,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22180879/