让我们他们有一个由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
我该如何改变?
答案 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是因为更容易实现事件监听器。