簡體   English   中英

JFrame - 根據選擇的JList特定操作

[英]JFrame - JList specific actions depending on selection

我創建了一個基本上從oracle站點復制'ListDemo.java'的列表。 我收錄了一張我的照片。

public static class BackpackList extends JPanel implements ListSelectionListener {

    private JList list;
    private DefaultListModel listModel;

    private static final String useString = "Use";
    private JButton useButton;

    public BackpackList() {
        super(new BorderLayout());

        listModel = new DefaultListModel();
        listModel.addElement("Flashlight");
        listModel.addElement("Health potion");
        listModel.addElement("Snacks");

        //Create the list and put it in a scroll pane.
        list = new JList(listModel);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setSelectedIndex(0);
        list.addListSelectionListener(this);
        list.setVisibleRowCount(10);
        JScrollPane listScrollPane = new JScrollPane(list);

        useButton = new JButton(useString);
        useButton.setActionCommand(useString);
        useButton.addActionListener(new UseListener());

        //Create a panel that uses BoxLayout.
        JPanel buttonPane = new JPanel();
        buttonPane.setLayout(new BoxLayout(buttonPane,
                                           BoxLayout.LINE_AXIS));
        buttonPane.add(useButton);
        buttonPane.add(Box.createHorizontalStrut(5));
        buttonPane.add(new JSeparator(SwingConstants.VERTICAL));
        buttonPane.add(Box.createHorizontalStrut(5));
        buttonPane.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));

        add(listScrollPane, BorderLayout.CENTER);
        add(buttonPane, BorderLayout.PAGE_END);

    }

    class UseListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            //This method can be called only if
            //there's a valid selection
            //so go ahead and remove whatever's selected.
            int index = list.getSelectedIndex();
            listModel.remove(index);

            int size = listModel.getSize();

            if (size == 0) { //Nobody's left, disable firing.
                useButton.setEnabled(false);
            }
            else { //Select an index.
                if (index == listModel.getSize()) {
                    //removed item in last position
                    index--;
                }

                list.setSelectedIndex(index);
                list.ensureIndexIsVisible(index);
            }
        }
    }


    @Override
    public void valueChanged(ListSelectionEvent e) {
        if (e.getValueIsAdjusting() == false) {

            if (list.getSelectedIndex() == -1) {
            //No selection, disable fire button.
                useButton.setEnabled(false);
            }
            else {
            //Selection, enable the fire button.
                useButton.setEnabled(true);
            }
        }

    }
}

問題1:我正在為基本的基於文​​本的游戲設置背包。 我想根據您在列表中選擇的項目設置具體操作。 制作它的代碼是什么,所以健康葯水會做些不同於零食的東西?

在此輸入圖像描述

問題2:我如何才能讓它,所以它會說大致為“X2小吃”線的東西,如果你有2個小吃或“X3小吃”,如果你有3名小吃等。

背包需要跟蹤其他地方定義的物品。 JList可以保存任何類型對象的列表,因此您需要做的是為庫存項創建對象。 下面顯示了使用枚舉的示例:

public class InventoryManager {

    public enum InventoryItem {
        LIGHT("Flashlight") {
            boolean isOn;
            @Override public void doAction() {
                isOn = !isOn;
            }
            @Override public String toString() {
                return name;
            }
        },
        POTION("Health Potions") {
            @Override public void doAction() {
                Game.getPlayer().setHealth(Game.getPlayer().getHealth() + 25);
                remove(1);
            }
        },
        SNACK("Snacks") {
            @Override public void doAction() {
                Game.getPlayer().setEnergy(Game.getPlayer().getEnergy() + 10);
                remove(1);
            }
        };

        private final String name;
        private int quantity = 0;

        private InventoryItem(String n) {
            name = n;
        }

        public abstract void doAction();

        public void add(int q) {
            if ((quantity += q) < 0) quantity = 0;
        }

        public void remove(int q) {
            add(-q);
        }

        @Override public String toString() {
            return name + " x" + quantity;
        }
    }

    public static InventoryItem[] getHeldItems() {
        EnumSet<InventoryItem> items = EnumSet.allOf(InventoryItem.class);

        Iterator<InventoryItem> it = items.iterator();
        while (it.hasNext()) {
            if (it.next().quantity < 1) {
                it.remove();
            }
        }

        return items.toArray(new InventoryItem[items.size()]);
    }
}

枚舉示例完全是靜態的,所以實際上這樣做會有一些問題(我選擇它主要是因為它是最短的代碼)。 但最終你將擁有一個帶有抽象方法的超類Item,子類以不同的方式實現。 然后,您將使用所持有的項填充JList。 當用戶從列表中選擇一個項目時, list.getSelectedValue()將返回您可以在游戲中使用的Item對象。

// or Item can be an interface classes implement

public abstract class Item {
    public void doAction() {
        Game.updateState();
    }
}

public class Light extends InventoryItem {
    boolean lighted;
    @Override public void doAction() {
        lighted = !lighted;
        super.doAction();
    }
}

public class Potion extends InventoryItem {
    @Override public void doAction() {
        player.hp++;
        super.doAction();
    }
}

public class Snack extends InventoryItem {
    @Override public void doAction() {
        player.energy++;
        super.doAction();
    }
}

另一種方法是使用直接程序邏輯,例如:

switch (list.getSelectedItem()) {
    case "Flashlight": {
        toggleFlashlight();
        break;
    }

    case "Health Potion": {
        usePotion();
        break;
    }

    case "Snack": {
        useSnack();
        break;
    }
}

但我有一種感覺,試圖用這樣的邏輯做到這一切最終會變得更加復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM