通过单击特定图像获取有关特定对象的信息

时间:2014-03-20 12:39:02

标签: java image swing mouselistener clicking

我制作了以下课程,其中包含有关用户的信息 - 姓名,年龄照片。

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(没有年龄或名称的值)。 如何获取特定用户的姓名和年龄?

3 个答案:

答案 0 :(得分:1)

不是问题的答案,但是:

  1. 按照惯例,类的构造函数是在类的方法之前定义的。

  2. 为什么要使用方法getName()getAge()创建一个User类,但是您没有定义getImage()方法?始终如一!您不应该直接访问变量,并且当您想要从类访问数据时应该定义“getter”方法。

  3. 从示例中学习,不要制定自己的标准。

    要跟进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更适合您的需求。