0

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

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);
       }

我知道——这是完全错误的。我无法获取有关特定用户的数据,因为我从“选定”中获取值,该值仅包含带有图像的 JLabel(没有年龄或姓名的值)。我应该怎么做才能获得某个用户的姓名和年龄?

4

3 回答 3

1

不是问题的答案,而是:

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

  2. 为什么你创建了一个带有方法的 User 类,getName()getAge()你没有定义getImage()方法?始终如一!你不应该直接访问变量,当你想从一个类访问数据时应该定义一个“getter”方法。

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

要跟进 Andrew 的评论,您应该创建一个自定义渲染器以在 JList 中显示来自 User 类的图标。阅读 Swing 教程中关于编写自定义单元格渲染器的部分以获取更多信息和显示图标的示例。该示例使用 JComboBox,但 JList 的概念是相同的。

然后您可以使用 ListSelectionListener 来处理图像的选择。这是一种更好的方法,因为当用户使用鼠标或键盘时这将起作用。

于 2014-03-20T15:11:57.847 回答
0

我正在开发的游戏有一个类似的问题,我制作了一个 tilePane 类。TilePane 类扩展了 JPanel 并具有姓名、年龄、照片等字段(或仅包含用户字段)。单击照片时,获取父 tilePane,然后获取 tilePane 的相应字段。这是我的代码片段:

public void mouseClick(MouseEvent e) {
...
    } else if (e.getSource() instanceof TilePane) {
                TilePane clickPane = (TilePane) e.getSource();
...
于 2014-03-20T12:57:16.550 回答
0

有几种方法可以实现您想做的事情。(我不完全确定这是什么,但我确信有几种方法;-))。

一个有趣的问题可能是谁决定了图像/标签的界限。它们是否放入具有特定布局的面板中?例如,当它们包含在带有 a 的面板中时,GridLayout您可以根据面板上某个鼠标位置对应的“网格单元”计算图像的索引。如果它们是自由定位的(在带有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 会更好地满足您的需求。

于 2014-03-20T15:28:43.093 回答