我制作了以下课程,其中包含有关用户的信息 - 姓名,年龄照片。
public class User{
private int age;
private String name;
ImageIcon icon;
JLabel image;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public User(){
this.age = 0;
this.name = "";
}
public User(int age, String name){
this.age = age;
this.name = name;
icon = new ImageIcon(name + ".jpg");
image = new JLabel(icon, JLabel.Center);
}
}
我想在JPanel上创建包含用户脸部的图像集。我希望在点击他的照片后获得每个用户的详细信息。所以我把这段代码放在主类中:
MouseListener myClick = new MouseListener(){
@Override
public void mouseClicked(MouseEvent e)
{
User selected = new User();
selected.image = (JLabel) e.getComponent();
System.out.println(selected.getAge() + " " + selected.getName());
}
};
和
User[] users = new User[32];
for (int i = 0; i < 32; i++)
{
panel.add(users[i].image);
users[i].image.addMouseListener(myClick);
}
我知道 - 这是完全错误的。我无法获取有关特定用户的数据,因为我从“selected”获取值,其中仅包含带图像的JLabel(没有年龄或名称的值)。 如何获取特定用户的姓名和年龄?
答案 0 :(得分:1)
不是问题的答案,但是:
按照惯例,类的构造函数是在类的方法之前定义的。
为什么要使用方法getName()
和getAge()
创建一个User类,但是您没有定义getImage()
方法?始终如一!您不应该直接访问变量,并且当您想要从类访问数据时应该定义“getter”方法。
从示例中学习,不要制定自己的标准。
要跟进Andrew的评论,您应该创建一个自定义渲染器,以显示JList中User类的Icon。阅读Writing a Custom Cell Renderer上的Swing教程中的部分以获取更多信息以及显示图标的示例。该示例使用JComboBox,但JList的概念相同。
然后,您可以使用ListSelectionListener来处理图像的选择。这是一种更好的方法,因为当用户使用鼠标或键盘时,这将起作用。
答案 1 :(得分:0)
我有一个与我正在进行的游戏类似的问题,我创建了一个tilePane类。 TilePane类扩展了JPanel,并具有名称,年龄,照片等字段(或仅包含用户字段)。单击照片时,获取父tilePane,然后获取tilePane的相应字段。这是我的代码片段:
public void mouseClick(MouseEvent e) {
...
} else if (e.getSource() instanceof TilePane) {
TilePane clickPane = (TilePane) e.getSource();
...
答案 2 :(得分:0)
有几种方法可以实现您想要做的事情。 (我不完全确定这是什么,但我确信有几种方法; - ))。
一个有趣的问题可能是谁决定了图像/标签的界限。它们是否被放入具有特定布局的面板中?例如,当它们包含在具有GridLayout
的面板中时,您可以根据&#34;网格单元&#34;来计算图像的索引。这对应于面板上的某个鼠标位置。如果它们是自由定位的(在具有null
布局的面板上),那么您可以创建一个简单的地图,如
class ImageMap<T>
{
private final Map<Rectangle2D, T> map;
ImageMap()
{
map = new LinkedHashMap<Rectangle2D, T>();
}
public T get(double x, double y)
{
for (Entry<Rectangle2D, T> entry : map.entrySet())
{
Rectangle2D key = entry.getKey();
if (key.contains(new Point2D.Double(x,y)))
{
return entry.getValue();
}
}
return null;
}
void setBounds(T t, Rectangle2D r)
{
Rectangle2D copy = new Rectangle2D.Double(
r.getX(), r.getY(), r.getWidth(), r.getHeight());
map.put(copy, t);
}
}
然后,您可以使用来自用户的信息填充此地图:
ImageMap<User> map = new ImageMap<User>();
List<User> users = ...;
for (User user : users)
{
map.setBounds(user, user.getImage().getBounds());
}
当您收到鼠标事件时,您可以查询此
MouseEvent e = ...;
User user = map.get(e.getX(), e.getY());
但这是否合适取决于你的用例。也许具有适当CellRenderer的JList更适合您的需求。