Hilfe bei der Verarbeitung von ArrayList

Ich denke das Problem mit der ArrayListe jetzt im Griff zu haben, leider habe ich ein weiteres Problem :(
Ich erstelle jetzt ein JPanel mit den Daten die ich aus dem XML bekomme mit:
Code:
package Test_packages;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Map;

import javax.swing.border.LineBorder;

public class ShowInventory extends JPanel implements MouseListener
{
	// Declare variables
    private JButton armorButton;
    private JButton weaponButton;
    private JButton shieldButton;
    private JButton helmetButton;
    private JButton bootsButton;
    private JPopupMenu contextmenu = new JPopupMenu();
    private JMenuItem viewDetails, move2bag, dropItem;
    private String weaponsrc, armorsrc, helmetsrc, shieldsrc, bootssrc;
    
 // Retrieve data from xml
	XmlDataList xml = new XmlDataList("src/Test_packages/inventory.xml");
	Map map = xml.getHashMap();
	// Extract the correct ArrayList from Hashmap
	ArrayList<Item> armorlist = (ArrayList)map.get("Armor");
	Item armor = armorlist.get(0); // 1. Item aus der Arraylist
	ArrayList<Item> helmetlist = (ArrayList)map.get("Helmet");
	Item helmet = helmetlist.get(0); // 1. Item aus der Arraylist
	ArrayList<Item> weaponlist = (ArrayList)map.get("Weapon");
	Item weapon = weaponlist.get(0); // 1. Item aus der Arraylist
	ArrayList<Item> shieldlist = (ArrayList)map.get("Shield");
	Item shield = shieldlist.get(0); // 1. Item aus der Arraylist
	ArrayList<Item> bootslist = (ArrayList)map.get("Boots");
	Item boots = bootslist.get(0); // 1. Item aus der Arraylist
    
    public ShowInventory()
    {
    	// Retrieve data from xml
    	XmlDataList xml = new XmlDataList("src/Test_packages/inventory.xml");
		Map map = xml.getHashMap();
		// Extract the correct ArrayList from Hashmap
		ArrayList<Item> armorlist = (ArrayList)map.get("Armor");
		Item armor = armorlist.get(0); // 1. Item aus der Arraylist
		ArrayList<Item> helmetlist = (ArrayList)map.get("Helmet");
		Item helmet = helmetlist.get(0); // 1. Item aus der Arraylist
		ArrayList<Item> weaponlist = (ArrayList)map.get("Weapon");
		Item weapon = weaponlist.get(0); // 1. Item aus der Arraylist
		ArrayList<Item> shieldlist = (ArrayList)map.get("Shield");
		Item shield = shieldlist.get(0); // 1. Item aus der Arraylist
		ArrayList<Item> bootslist = (ArrayList)map.get("Boots");
		Item boots = bootslist.get(0); // 1. Item aus der Arraylist
		
		// Initiate images sources
		armorsrc = armor.getImage();
		helmetsrc = helmet.getImage();
		bootssrc = boots.getImage();
		shieldsrc = shield.getImage();
		weaponsrc = weapon.getImage();
		
		// Create empty labels
        JLabel helmetleft= new JLabel(); 
        JLabel helmetright= new JLabel(); 
        JLabel bootsright= new JLabel(); 
        JLabel bootsleft= new JLabel(); 
        
        // Initiatte JButtons for Inventory and load images
        armorButton = new JButton(new ImageIcon(armorsrc)); 
        armorButton.setBorder(new LineBorder(Color.BLACK));       
        weaponButton= new JButton(new ImageIcon(weaponsrc)); 
        weaponButton.setBorder(new LineBorder(Color.BLACK));
        shieldButton= new JButton(new ImageIcon(shieldsrc));  
        shieldButton.setBorder(new LineBorder(Color.BLACK));
        helmetButton= new JButton(new ImageIcon(helmetsrc));  
        helmetButton.setBorder(new LineBorder(Color.BLACK));
        bootsButton= new JButton(new ImageIcon(bootssrc));  
        bootsButton.setBorder(new LineBorder(Color.BLACK));
        
        // Create right-click context menu
        viewDetails = new JMenuItem("View item");
        contextmenu.add(viewDetails);
        move2bag = new JMenuItem("Move Item to bag");
        contextmenu.add(move2bag);
        dropItem = new JMenuItem("Drop Item");
        contextmenu.add(dropItem);
        
        /** Start add Listeners **/
        armorButton.addMouseListener(this);
        weaponButton.addMouseListener(this);
        shieldButton.addMouseListener(this);
        helmetButton.addMouseListener(this);
        bootsButton.addMouseListener(this);
        // Handle the events of context menu

        viewDetails.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
        	  System.out.println("View Details completed");
          } 
        });
        move2bag.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
        	  System.out.println("Moved to bag");
          } 
        });
        dropItem.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
        	  System.out.println("Item dropped");
          } 
        });
        /** End add Listeners **/
        
        /** Start add Components to Panel **/
        add(helmetleft);
        add(helmetButton);
        add(helmetright);
        add(weaponButton);
        add(armorButton);
        add(shieldButton);
        add(bootsleft);
        add(bootsButton);
        add(bootsright);

    }
	      public void mouseReleased(MouseEvent Me){
	        if(Me.isPopupTrigger()){
	        	contextmenu.show(Me.getComponent(), Me.getX(), Me.getY());
	        }
	      }
	      public void mouseClicked(MouseEvent Me){
}
	      public void mousePressed(MouseEvent Me){
		      }
	      public void mouseExited(MouseEvent Me){
		      }
	      public void mouseEntered(MouseEvent Me){
		      }
		public void actionPerformed(final ActionEvent e) {
				ShowInventory.this.repaint();
			}
    
}

Das klappt soweit so gut, mit den Mouseevents mache ich ein "Rechtsklick"-Kontextmenü auf mit: "View item", "Move to bag" und "Drop" auf.
Zur zeit wird bei auswahl des Kontextmenüs nur ein Text ausgegeben.

Wie kann ich durch auswahl von sagen wir "View item" die Item-Daten aus der ArrayList abfragen? D.h. der Mouselistener muss wissen über
welchem Item die Maus gerade ist und das Kontextmenü aufgerufen wurde. Und auch wenn ich weiss welche Komponente ich anspreche
müsste ich eigentlich für jeden Itemtyp (Helm, Waffe, usw..) einen eigenen MouseListener schreiben, oder? Ich blicke hier nicht ganz durch. Bitte um Hilfe.
 
Wie kann ich durch auswahl von sagen wir "View item" die Item-Daten aus der ArrayList abfragen? D.h. der Mouselistener muss wissen über
welchem Item die Maus gerade ist und das Kontextmenü aufgerufen wurde. Und auch wenn ich weiss welche Komponente ich anspreche
müsste ich eigentlich für jeden Itemtyp (Helm, Waffe, usw..) einen eigenen MouseListener schreiben, oder? Ich blicke hier nicht ganz durch. Bitte um Hilfe.

Java:
event.getSource(); //Gibt die Komponente zurück, bei der das Event ausgelöst wurde.

Edit: Wenn ich jetzt so drüber nachdenke, so denke ich ich habs eben falsch verstanden... Mir fällt kein direkter Weg ein, wie das geht, aber ich würde folgenden Workaround gehen: Wenn du das PopupMenu aufrufst, speicherst du die entsprechende Komponente vorher in einer Variable, welche du im ActionListener später wieder abrufen kannst.

Edit2: Ich hab mir noch ein wenig das JPopupMenu angeshcaut udn fand das klang eigentlich ganz gut:

Code:
Component getInvoker() 
          Returns the component which is the 'invoker' of this popup menu.
 
Zuletzt bearbeitet:
Danke für die schnelle Antwort. Durch .getInvoker() bekomme ich das auslösende Element in meinem Fall ein JButton zurück der mit Bildern aus der Item-Array befüllt ist.
Meine konkrete Frage ist wie kann ich die Verbindung zwischen einem Item und einem JButton herstellen. Ich hole mit getInvoker das Element, ich möchte aber eigentlich auf das Item zurückgreifen das hinter diesem JButton liegt, um dessen Attribute abzufragen. Wäre es auch eine gute möglichkeit jedem JButton einen unique Namen zu vergeben der der ID des Items entspricht? Denn mit:
Code:
contextmenu.getInvoker().getName()
bekomme ich ja den Namen der aufrufenden Komponente
 
Zuletzt bearbeitet:
Nunja, etwa so...

Java:
//...
public void showItem(Item item) {
	int weight = item.getWeight();
	//...
}
//...

//besser wäre hier vermutlich switch-case
if(contextmenu.getInvoker()==armorButton) { showItem(armor); }
else if(contextmenu.getInvoker()==weaponButton) { showItem(weapon); }
else if(contextmenu.getInvoker()==shieldButton) { showItem(shield); }
else if(contextmenu.getInvoker()==helmetButton) { showItem(helmet); }
else if(contextmenu.getInvoker()==bootsButton) { showItem(boot); }
//...
 
Zuletzt bearbeitet:
Zurück