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

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

やりたいことを実現する方法はいくつかあります。(これが何であるかは完全にはわかりませんが、いくつかの方法があると確信しています;-))。

興味深い質問の 1 つは、画像/ラベルの境界を誰が決定するかということです。それらは特定のレイアウトを持つパネルに配置されていますか? たとえば、それらが のパネルに含まれている場合、パネル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 に答える