Swing Elemente für Inventar?

Devil0s

Aktives Mitglied
Welche Swing elemente und welches Layout nutzt man am besten für ein Inventar bei einem RPG.
Das inventar soll sich beim druecken der taste e oeffnen, mehrere plätze, und ein paar quick slots enthalten.
Das es sich auf Knopfdruck offnet hab ich schon (neues frame und JPanel) und ich hab auch schon ein Kontextmenü gestaltet.
Dies soll sich aber nur oeffnen. Ich hab mir überlegt für jeden slot ein JPanel zu nehmen damit sich das Kontextmenü nur bei den Slots oeffnen lässt.
Mit welchen elementen kann man am besten deren Inhalt in ein anderes verschieben und mit welchem layout kann man die am besten positionieren??


Ich hoffe ihr habt meine Frage richtig verstanden, haltet mich nicht für zu blöde und gebt mir eine gute Antwort.
Devil0s
 
Zuletzt bearbeitet:
IMHO klingt das eher nach einer JList: Die ordnet auch beliebig viele Elemente in einem "Quasi-GridLayout" an, erlaubt direkt die Auswahl und ist Scrollbar, und Drag&Drop kann mit wenigen Zeilen erledigt sein. Zu versuchen, das mit einem JPanel mit JLabels drin nachzubauen könnte aufwändig werden...
 
Wie kann ich die JList am besten als GridLayout darstellen?
das mit den Bildern hab ich mitlerweile hinbekommen?
Codebeispiel wäre interessant.
 
Wenn ich an ein Inventar in Spielen denke, hab ich immer ein 2dimensionales Grid vor Augen.
Wenn´s so auch von Dir beabsichtigt ist, ist mir auch grad schleierhaft, wie man da schnell mal mit ner JList arbeit sollte, aber Marco is ja Fuchs, vielleicht hat er ja nen trick auf Lager.
Ich würde wohl eher auf ne JTable zugreifen oder halt wirklich mit ner Slot-Klasse arbeiten, die von JPanel erbt und deren Instanzen dann in ein GridLayout packen.

Sonst poste doch mal eine Skizze, dann lässt sich das einfacher abgleichen.

Gruß Vanny
 
Da ich im Moment im Urlaub bin und das sozusagen mein Urlaubsproject ist und ich deshalb meinn netbook nutze auf dem ich leider kein Grafikprogramm habe siehts im Moment schlecht aus mit ner Skizze. Ich glaube ich werde das jetzt erstmal mit ursprünglichen Idee fertig zu machen
Aber vielleicht meldet sich Marco auch nochmal 😉
Gibt es nen Weg JPanels mit drag and drop zu verschieben ohne eine eigene methode zu schreiben?
 
Wenn ich an ein Inventar in Spielen denke, hab ich immer ein 2dimensionales Grid vor Augen.
Wenn´s so auch von Dir beabsichtigt ist, ist mir auch grad schleierhaft, wie man da schnell mal mit ner JList arbeit sollte, aber Marco is ja Fuchs, vielleicht hat er ja nen trick auf Lager.

Joa 😎 Der 1337 h@<|<€2 hat natürlich einen Trick: [c]list.setLayoutOrientation(JList.HORIZONTAL_WRAP);[/c] aufrufen :smoke:

Hier noch als KSKB, mit dem ganzen Drag&Drop-Gefraddel außenrum...
Java:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;


public class InventoryListExample
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Vector<Item> listData = new Vector<Item>();
        for (int i=0; i<20; i++)
        {
            listData.add(new Item(String.valueOf(i)));
        }
        JList inventoryList = new JList(listData);
        inventoryList.setCellRenderer(new DefaultListCellRenderer()
        {
            private static final long serialVersionUID = 7455382937012501303L;

            {
                setHorizontalAlignment(JLabel.CENTER);
                setPreferredSize(new Dimension(160,60));
            }

            @Override
            public Component getListCellRendererComponent(
                JList list, Object value, int index, 
                boolean isSelected, boolean cellHasFocus)
            {
                super.getListCellRendererComponent(
                    list, value, index, isSelected, cellHasFocus);
                Item item = (Item)value;
                setText("");
                setIcon(new ImageIcon(item.getImage()));
                return this;
            }
        });
        inventoryList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
        inventoryList.setDragEnabled(true);
        inventoryList.setTransferHandler(new ItemTransferHandler());

        JScrollPane scrollPane = new JScrollPane(inventoryList);
        scrollPane.setBorder(BorderFactory.createTitledBorder("Inventory"));

        JPanel panel = new JPanel(new GridLayout(0,2));
        panel.add(scrollPane);
        panel.add(new DropArea());
        f.getContentPane().add(panel);
        f.pack();
        f.setVisible(true);

    }


    static class DropArea extends JLabel implements DropTargetListener
    {
        private static final long serialVersionUID = -5679944858109178081L;

        public DropArea()
        {
            super("Drop stuff here...");
            @SuppressWarnings("unused")
            DropTarget dropTarget = new DropTarget(this, this);
        }

        private void dropItem(Item item)
        {
            setText("Dropped here: "+item);
        }

        @Override
        public void drop(DropTargetDropEvent e)
        {
            Transferable transferable = e.getTransferable();

            if (transferable.isDataFlavorSupported(
                TransferableItem.ITEM_FLAVOR))
            {
                try
                {
                    e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                    Item item = (Item)transferable.getTransferData(
                        TransferableItem.ITEM_FLAVOR);
                    dropItem(item);
                }
                catch (UnsupportedFlavorException ex)
                {
                    e.rejectDrop();
                }
                catch (IOException ex)
                {
                    e.rejectDrop();
                }
            }
            else
            {
                e.rejectDrop();
            }
            e.getDropTargetContext().dropComplete(true);
        }

        @Override
        public void dragEnter(DropTargetDragEvent e)
        {
        }

        @Override
        public void dragOver(DropTargetDragEvent e)
        {
        }

        @Override
        public void dropActionChanged(DropTargetDragEvent e)
        {
        }

        @Override
        public void dragExit(DropTargetEvent e)
        {
        }
    }


    private static class ItemTransferHandler extends TransferHandler
    {
        private static final long serialVersionUID = -6404485349852032912L;

        @Override
        public Transferable createTransferable(JComponent component)
        {
            JList list = (JList) component;
            Object value = list.getSelectedValue();
            Item item = (Item)value;
            return new TransferableItem(item);
        }

        @Override
        public int getSourceActions(JComponent c)
        {
            return COPY ;
        }
    }    

    private static class TransferableItem implements Transferable
    {
        private static final DataFlavor ITEM_FLAVOR = 
            new DataFlavor(Item.class, "Item");
        private final Item item;

        TransferableItem(Item item)
        {
            this.item = item;
        }

        @Override
        public DataFlavor[] getTransferDataFlavors()
        {
            return new DataFlavor[]{ ITEM_FLAVOR };
        }

        @Override
        public boolean isDataFlavorSupported(DataFlavor flavor)
        {
            return ITEM_FLAVOR.equals(flavor);
        }

        @Override
        public Object getTransferData(DataFlavor flavor) 
        throws UnsupportedFlavorException
        {
            if (isDataFlavorSupported(flavor))
            {
                return item;
            }
            throw new UnsupportedFlavorException(flavor);
        }

    }


    private static class Item
    {
        private final String name;
        private final BufferedImage image;

        public Item(String name)
        {
            this.name = name;
            image = new BufferedImage(150,50, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = image.createGraphics();
            g.setColor(Color.DARK_GRAY);
            g.fillRect(0,0,150,50);
            g.setColor(Color.LIGHT_GRAY);
            g.fillRect(2,2,146,46);
            g.setColor(Color.RED);
            g.drawString(name, 10, 20);
            g.dispose();
        }

        public BufferedImage getImage()
        {
            return image;
        }

        @Override
        public String toString()
        {
            return name;
        }
    }


}
 

Zurück
Oben