我遇到无法正确访问实例Point数据的问题。
我创建一个GridPanels多维数组,并使用Point实例化每个数组。
首次创建时,一切都会按预期进行。
pic1 http://img.skitch.com/20100218-fciwr7t73ci2gajafmfxa2yf9q.jpg
但是,当我单击GridPanel时,Listener类总是从创建的最后一个GridPanel接收Point(在这种情况下为(3,3)。)
但是,当我传递一个int而不是Point时,将显示被单击的GridPanel的int(就像您期望的那样)。
有人知道这是怎么回事吗?
谢谢
import javax.swing.JFrame;
/**
* Driver class.
*/
public class Test {
/**
* The main method.
* @param args Command line arguments.
*/
public static void main(String[] args) {
JFrame frame = new JFrame("TEST");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TestPanel panel = new TestPanel();
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
}
}
import java.awt.GridLayout;
import java.awt.Point;
import javax.swing.JPanel;
/**
* Creates a 4 by 4 grid of GridPanels.
*/
public class TestPanel extends JPanel {
static final int ROW_SIZE = 4;
static final int COL_SIZE = 4;
private GridPanel[][] g = new GridPanel[ROW_SIZE][COL_SIZE];
public TestPanel() {
Point coords = new Point();
setLayout(new GridLayout(ROW_SIZE, COL_SIZE));
for (int i = 0; i < ROW_SIZE; i++) {
for (int j = 0; j < COL_SIZE; j++) {
coords.setLocation(i, j);
g[i][j] = new GridPanel(coords);
add(g[i][j]);
}
}
}
}
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* Contains the MouseListener.
*/
public class GridPanel extends JPanel {
private JLabel label;
private Point p;
public GridPanel(Point p) {
this.p = p;
label = new JLabel("" + p);
add(label);
setBackground(Color.WHITE);
setPreferredSize(new Dimension(200, 50));
addMouseListener(new SelectListener());
}
private class SelectListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
label.setText("" + p);
}
}
}
最佳答案
问题是您正在重复使用存储在coords
中的同一点。您需要为每个网格元素创建一个新点。您看起来好像每个面板中都存储了不同的点值,因为每个面板具有不同的标签。但在行
label = new JLabel("" + p);
您正在创建一个包含
p
当前值的字符串。但是p
可以稍后更改,并且标签不会随之更改。因此,解决您问题的最简单方法是更改生产线
this.p = p;
至
this.p = new Point(p); // Create a defensive copy.
看起来您当前对对象和字段之间的差异有些困惑。例如,
Point p = new Point(3, 4);
Point p2 = p;
p.x = 7;
System.out.println(p2.x);
将产生
7
,因为只有一点被操纵,尽管它由两个字段指向。使用=不会创建该点的副本。(很抱歉,如果我要解释您已经知道的事情!)
关于java - MouseListener无法正确读取点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2292021/