tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
13
ZUGRIFFE
636
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    profiler84 profiler84 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    10
    Hallo,

    Ich versuche ein grafisches Inventar für ein Spiel zu bauen.
    Das Inventar wird mit Daten aus einer XML gespeist die folgende Struktur hat:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    <?xml version="1.0" encoding="UTF-8"?>
    <Inventary-List>
        
    <Item>
        <Type>Shield</Type>
        <Name>Schild der Rache</Name>
        <Description>Das Schild entstammt aus Gondor</Description>
        <Weight>5</Weight>
        <Attack>1</Attack>
        <Attackreq>0</Attackreq>
        <Defense>3</Defense>
        <Defensereq>2</Defensereq>
        <Heal>0</Heal>
        <Image>src/Test_packages/img/shield-slot.png</Image>
    </Item>
     
    <Item>
        <Type>Helmet</Type>
        <Name>Helm der Rache</Name>
        <Description>Der Helm entstammt aus Gondor</Description>
        <Weight>4</Weight>
        <Attack>0</Attack>
        <Attackreq>0</Attackreq>
        <Defense>2</Defense>
        <Defensereq>1</Defensereq>
        <Heal>0</Heal>
        <Image>src/Test_packages/img/helmet-slot.png</Image>
    </Item>
     
    <Item>
        <Type>Armor</Type>
        <Name>Rüstung der Furcht</Name>
        <Description>Dieser Armor entstammt aus blub</Description>
        <Weight>8</Weight>
        <Attack>0</Attack>
        <Attackreq>0</Attackreq>
        <Defense>4</Defense>
        <Defensereq>3</Defensereq>
        <Heal>0</Heal>
        <Image>src/Test_packages/img/armor-slot.png</Image>
    </Item>
     
    </Inventary-List>

    Diese Daten Lese ich aus und speichere sie in einer ArrayList mit folgendem Code:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    
    package Test_packages;
     
    import java.io.*;
    import java.util.ArrayList;
    import org.w3c.dom.*;
    import javax.xml.parsers.*;
    import org.xml.sax.*;
     
    public class GetXMLData{//Start class
        //No generics
        ArrayList<Item> myItemsList;
        Document document;
        
      public GetXMLData (String fName) {//Start constructor
            //create a list to hold the Item objects
            myItemsList = new ArrayList<Item>();
            String fileName = fName;
            readXmlFile(fileName);
        }//End constructor
      
        private ArrayList readXmlFile (String fName) {
        try{// Start try catch
          String xmlFile = fName;
          File file = new File(xmlFile);
          if (file.exists()){
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(xmlFile);
            Element docRoot = document.getDocumentElement();
            
            //get a nodelist of <employee> elements
            NodeList nl = docRoot.getElementsByTagName("Item");
            if(nl != null && nl.getLength() > 0) {
                for(int i = 0 ; i < nl.getLength();i++) {
                    
                    //get the employee element
                    Element el = (Element)nl.item(i);
                    
                    //get the Employee object
                    Item e = getItem(el);
                    //add it to list
                    myItemsList.add(e);
                }
            }//End if
          }
          else{
            System.out.println("File not found!");
          }
        }//End try
        catch(ParserConfigurationException pce) {
            pce.printStackTrace();
        }catch(SAXException se) {
            se.printStackTrace();
        }catch(IOException ioe) {
            ioe.printStackTrace();
        }//End try catch
         return myItemsList; }//End void readXmlFile
        
        private Item getItem(Element itm) {
            String type = getTextValuebyTag(itm,"Type");
            String name = getTextValuebyTag(itm,"Name");
            String description = getTextValuebyTag(itm,"Description");
            int weight = getIntValuebyTag(itm,"Weight");
            int damage = getIntValuebyTag(itm,"Attack");
            int attreq = getIntValuebyTag(itm,"Attackreq");
            int defense = getIntValuebyTag(itm,"Defense");
            int defreq = getIntValuebyTag(itm,"Defensereq");
            int heal = getIntValuebyTag(itm,"Heal");
            //String type = itm.get
            
            //Create a new Employee with the value read from the xml nodes
            Item i = new Item(type,name,description,weight,damage,attreq,defense,defreq,heal);
            
            return i;
        }
      
        private String getTextValuebyTag(Element ele, String tagName) {
            String textVal = null;
            NodeList nl = ele.getElementsByTagName(tagName);
            if(nl != null && nl.getLength() > 0) {
                Element el = (Element)nl.item(0);
                textVal = el.getFirstChild().getNodeValue();
            }
            return textVal;
        }
        
        private int getIntValuebyTag(Element ele, String tagName) {
            //in production application you would catch the exception
            return Integer.parseInt(getTextValuebyTag(ele,tagName));
        }
     
    }//End class
    In weiterer Folge möchte ich die Daten dann über ein Jframe darstellen. Meine konkrete Frage ist wie kann ich die einzelnen Items und ihre Attribute ansprechen, vorallem
    was mache ich wenn Item-Typen öfter vorkommen also im XML <Item><Type>Helmet</Type> öfter vorkommt. Wie verweise ich darauf dass ich z.b. das 2. Item haben will.
    Ich komme hier überhaupt nicht weiter.

    Über einen Vorschlag zur Umsetzung würde ich mich riesig freuen.
    Danke.
     

  2. #2
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    Du könntest beispielsweise alle Items eines Typs in einer eigenen ArrayList speichern, also alle Helme in einer ArrayList, alle Schilde in einer anderen etc. Und die ArrayList's speicherst du in einer Hashmap und verwendest als key den Typnamen, also "Helm", "Schild" usw.
    Wenn du die Möglichkeit hast, kannst du sie auch in Datentabellen speichern, weil sie alle dieselben Attribute haben.
     
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  3. #3
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    In weiterer Folge möchte ich die Daten dann über ein Jframe darstellen. Meine konkrete Frage ist wie kann ich die einzelnen Items und ihre Attribute ansprechen, vorallem
    was mache ich wenn Item-Typen öfter vorkommen also im XML <Item><Type>Helmet</Type> öfter vorkommt. Wie verweise ich darauf dass ich z.b. das 2. Item haben will.
    Die "großen" Spiele nutzen dazu meistens IDs zur Verwaltung, d.h jedes Item hat eine eigene ID, auch wenn vllt der Name oder ähnliches gleich ist, können diese dennoch getrennt verwaltet werden. Und ich würde auch eine HashMap nehmen mit den IDs als Key. Darüber kannst du dir dann auch das Item holen.
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  4. #4
    profiler84 profiler84 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    10
    Vielen vielen Dank für eure Vorschläge, ich werde mal versuchen das umzusetzen. Ich hoffe ich kann noch weiterfragen, wenn ich wieder auf Probleme stoße.
     

  5. #5
    profiler84 profiler84 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    10
    Also ich habe mal eine Liste der Typen generiert mit :
    Code :
    1
    2
    3
    4
    5
    6
    
            NodeList itnl = docRoot.getElementsByTagName("Type");
            for (int i=0; i<itnl.getLength(); i++) {
                   // Get element
                   Node n = (Element)itnl.item(i);
                   System.out.println(n.getFirstChild().getNodeValue());    
            }
    Wie kann ich für jeden Itemtyp die elemente in eine ArrayList speichern?
     

  6. #6
    profiler84 profiler84 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    10
    Ich habe jetzt aus allen Items die gleichen Typs sind in einer ArrayList und diese Lists in eine Hashmap gepackt, wo ich als key den typ definiert habe. Anbei der Code:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    
    package Test_packages;
     
    import java.io.*;
    import java.util.ArrayList;
    import org.w3c.dom.*;
    import javax.xml.parsers.*;
    import org.xml.sax.*;
    import java.util.*;
     
    public class XmlDataList {//Start class
        //No generics
        ArrayList<Item> WeaponList;
        ArrayList<Item> ArmorList;
        ArrayList<Item> HelmetList;
        ArrayList<Item> ShieldList;
        ArrayList<Item> BootList;
        ArrayList<Item> HealList;
        Document document;
        Map<String, ArrayList> map = new HashMap<String, ArrayList>();
     
        
        public static void main(String [] args) {
            XmlDataList xml = new XmlDataList("src/Test_packages/test.xml");
        }
        
        
      public XmlDataList (String fName) {//Start constructor
            //create a list to hold the Item objects
            String fileName = fName;
            readXmlFile(fileName);
            
        }//End constructor
      
        private void readXmlFile (String fName) {
        try{// Start try catch
          String xmlFile = fName;
          File file = new File(xmlFile);
          WeaponList = new ArrayList<Item>();
          ArmorList = new ArrayList<Item>();
          HelmetList = new ArrayList<Item>();
          ShieldList = new ArrayList<Item>();
          BootList = new ArrayList<Item>();
          HealList = new ArrayList<Item>();
          if (file.exists()){
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(xmlFile);
            Element docRoot = document.getDocumentElement();
            
            //get a nodelist of Itemtypes elements
            NodeList itnl = docRoot.getElementsByTagName("Type");
            NodeList nl = docRoot.getElementsByTagName("Item");
            for (int i=0; i<itnl.getLength(); i++) {
                  // The node containing the item i
                   Node n = (Element)itnl.item(i);    
                   String type = n.getFirstChild().getNodeValue();          
                    //get the Item element
                    Element el = (Element)nl.item(i);
                    //get the Item object
                    Item e = getItem(el);
                    //add it to the right list  
                    if (type.equals("Weapon")){
                    WeaponList.add(e);  
                    }
                    else if (type.equals("Armor")){
                    ArmorList.add(e);       
                    }
                    else if (type.equals("Helmet")){
                    HelmetList.add(e);      
                    }
                    else if (type.equals("Shield")){
                    ShieldList.add(e);      
                    }
                    else if (type.equals("Boot")){
                    BootList.add(e);        
                    }
                    else if (type.equals("Heal")){
                    BootList.add(e);        
                        }
                    else  {
                    HealList.add(e);
                    }
                }//End for
            map.put("Weapon", WeaponList);
            map.put("Armor", ArmorList);
            map.put("Helmet", HelmetList);
            map.put("Shield", ShieldList);
            map.put("Boot", BootList);
            map.put("Heal", HealList);
     
          }//End if
          else{
            System.out.println("File not found!");
          }
        }//End try
        catch(ParserConfigurationException pce) {
            pce.printStackTrace();
        }catch(SAXException se) {
            se.printStackTrace();
        }catch(IOException ioe) {
            ioe.printStackTrace();
        }//End try catch
        }//End void readXmlFile
        
        private Item getItem(Element itm) {
            String type = getTextValuebyTag(itm,"Type");
            String id = getTextValuebyTag(itm,"Id");
            String name = getTextValuebyTag(itm,"Name");
            String description = getTextValuebyTag(itm,"Description");
            int weight = getIntValuebyTag(itm,"Weight");
            int damage = getIntValuebyTag(itm,"Attack");
            int attreq = getIntValuebyTag(itm,"Attackreq");
            int defense = getIntValuebyTag(itm,"Defense");
            int defreq = getIntValuebyTag(itm,"Defensereq");
            int heal = getIntValuebyTag(itm,"Heal");
            //String type = itm.get
            
            //Create a new Employee with the value read from the xml nodes
            Item i = new Item(type,id,name,description,weight,damage,attreq,defense,defreq,heal);
            
            return i;
        }
      
        private String getTextValuebyTag(Element ele, String tagName) {
            String textVal = null;
            NodeList nl = ele.getElementsByTagName(tagName);
            if(nl != null && nl.getLength() > 0) {
                Element el = (Element)nl.item(0);
                textVal = el.getFirstChild().getNodeValue();
            }
            return textVal;
        }
        
        private int getIntValuebyTag(Element ele, String tagName) {
            //in production application you would catch the exception
            return Integer.parseInt(getTextValuebyTag(ele,tagName));
        }
     
    }//End class
    Wie kann ich in meiner Mainmethode auf diese hashmaps zu greifen? Könnt ihr mir da weiterhelfen?
     

  7. #7
    profiler84 profiler84 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    10
    So ich habe jetzt geschafft die Hashmap irgendeiner Klasse zu übergeben.
    Trenne die gesuchte Arraylist heraus.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    package Test_packages;
    import java.util.*;
     
    public class test {
     
        public static void main(String [] args) {
            XmlDataList xml = new XmlDataList("src/Test_packages/test.xml");
            Map map = xml.getHashMap();
            //System.out.println(map);
            Object i2 = map.get("Weapon");
            ArrayList al = new ArrayList();
            al.add(i2);
            
    }
    }
    Wie greife ich jetzt auf die Item-Attribute zu die ich vorher aus der xml ausgelesen habe?
     

  8. #8
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    Wie greife ich jetzt auf die Item-Attribute zu die ich vorher aus der xml ausgelesen habe?
    Ein Item aus der ArrayList holen und Getter-Methoden von der Item-Klasse nutzen. Ich frage mich nur, woher du weißt, welches Item aus der ArrayList du holen möchtest...

    Code java:
    1
    2
    
    Object get(int index) 
              Returns the element at the specified position in this list.

    Edit:

    Code java:
    1
    2
    3
    
    Object i2 = map.get("Weapon");
    ArrayList al = new ArrayList();
    al.add(i2);

    Willst du das wirklich so machen?

    Ich glaub du möchtest eher etwas in die Richtung schreiben:

    Code java:
    1
    
    ArrayList al = (ArrayList)map.get("Weapon");
    Geändert von HonniCilest (22.03.10 um 12:31 Uhr)
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  9. #9
    profiler84 profiler84 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    10
    Hallo,

    Ich bin jetzt endlich soweit dass ich die einzelnen Items aus der Arraylist holen kann:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    package Test_packages;
    import java.util.*;
     
    public class test {
     
        public static void main(String [] args) {
            XmlDataList xml = new XmlDataList("src/Test_packages/test.xml");
            Map map = xml.getHashMap();
            ArrayList<Item> i2 = (ArrayList)map.get("Armor");
            Item item = i2.get(0); // 1. Item aus der Arraylist
            System.out.println (item.getDamage() ) ;
                   System.out.println (item.getId() ) ;
    }
    }
    Zurzeit hole ich die Items sowie du geschrieben hast über den index
    Code :
    1
    
    Item item = i2.get(0);
    Ich habe in der xml bei einem Item einfach den Tag <Id> eingefügt und jedes item eine unique id gegeben, womit ich sie dann direkt ansprechen kann. Ich denke dass das so funktioniert oder?
     

  10. #10
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    Zitat Zitat von profiler84 Beitrag anzeigen
    Ich habe in der xml bei einem Item einfach den Tag <Id> eingefügt und jedes item eine unique id gegeben, womit ich sie dann direkt ansprechen kann. Ich denke dass das so funktioniert oder?
    Sollte, wie gesagt, der Vorschlag orientiert sich an den Vorlagen der "großen" Spiele. Die arbeiten alle mit IDs, um Verwechslungen mit Items gleichen Namens etc. auszuschließen.
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  11. #11
    profiler84 profiler84 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    10
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    
    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.
     

  12. #12
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    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.
    Code java:
    1
    
    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 :
    1
    2
    
    Component getInvoker() 
              Returns the component which is the 'invoker' of this popup menu.
    Geändert von HonniCilest (23.03.10 um 13:56 Uhr)
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

  13. #13
    profiler84 profiler84 ist offline Mitglied
    Registriert seit
    Mar 2010
    Beiträge
    10
    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 :
    1
    
    contextmenu.getInvoker().getName()
    bekomme ich ja den Namen der aufrufenden Komponente
    Geändert von profiler84 (23.03.10 um 16:36 Uhr)
     

  14. #14
    Avatar von HonniCilest
    HonniCilest HonniCilest ist offline Mitglied Platin
    Registriert seit
    Jun 2009
    Ort
    Java Insel
    Beiträge
    501
    Nunja, etwa so...

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    //...
    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); }
    //...
    Geändert von HonniCilest (23.03.10 um 16:56 Uhr)
     
    Jeder Fehler, aus dem wir lernen, ist ein Erfolg...
    ...Aber mach' nicht den Fehler, nicht aus deinen Fehlern zu lernen.

Ähnliche Themen

  1. Fehler in Verarbeitung
    Von Sasser im Forum PHP
    Antworten: 8
    Letzter Beitrag: 30.03.09, 18:50
  2. ArrayList in einer ArrayList
    Von xXchrissiXx im Forum Java
    Antworten: 8
    Letzter Beitrag: 10.04.07, 10:14
  3. Attribute in XSL Verarbeitung
    Von mkoeni1 im Forum XML Technologien
    Antworten: 0
    Letzter Beitrag: 08.01.06, 14:53
  4. Inhalt einer ArrayList in andere ArrayList kopieren
    Von Pierre im Forum .NET Archiv
    Antworten: 2
    Letzter Beitrag: 05.07.05, 16:58
  5. CGI zur Formular verarbeitung
    Von NgiseD im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 2
    Letzter Beitrag: 02.07.03, 14:43