Использование hashmap для отображения данных в JTextField и его обновления

Ниже приведен код, который создает элементы, которые имеют кодовое имя, цену и количество соответственно.

 public class StockData {
    private static class Item {
        Item(String n, double p, int q) {
            name = n;
            price = p;
            quantity = q;
        }
        public String getName() {
            return name;
        }
        public double getPrice() {
            return price;
        }
        public int getQuantity() {
            return quantity;
        }
        private final String name;
        private final double price;
        private int quantity;
    }
    public final static Map<String, Item> stock = new HashMap();
    static {
        stock.put("00", new Item("Bath towel", 5.50, 10));
        stock.put("11", new Item("Plebney light", 20.00, 5));
        stock.put("22", new Item("Gorilla suit", 30.00, 7));
        stock.put("33", new Item("Whizz games console", 50.00, 8));
        stock.put("44", new Item("Oven", 200.00, 4));
    }
    public static Map<String, Item> getStock() {
       return stock;
     }
    public static String getName(String key) {
        Item item = stock.get(key);
        if (item == null) {
            return null; // null means no such item
        } else {
            return item.getName();
        }
    }
    public static double getPrice(String key) {
        Item item = stock.get(key);
        if (item == null) {
            return -1.0; // negative price means no such item
        } else {
            return item.getPrice();
        }
    }
    public static int getQuantity(String key) {
        Item item = stock.get(key);
        if (item == null) {
            return -1; // negative quantity means no such item
        } else {
            return item.getQuantity();
        }
    }

    public static void update(String key, int extra) {
        Item item = stock.get(key);
        if (item != null) {
            item.quantity += extra;
        }
    }
}

А вот другой класс, который является частью моего графического интерфейса, который выглядит следующим образом: http://imgur.com/Jhc4CAz

и моя идея в том, чтобы вы набрали код элемента, например. 22 затем введите, сколько вы хотели бы добавить к акции, например, 5 нажмите кнопку Добавить, чтобы добавить в переменную, но немедленно обновит текст в поле, как вы видите на экране.

Я действительно озадачился хэш-картой / списком. Я не думаю, что есть смысл копировать все данные из хэш-карты в список и, в значительной степени, умножая их, должен быть лучший способ добиться этого.

public class UpdateStock extends JFrame implements ActionListener {

JTextField stockNo = new JTextField(4);
JButton addButton = new JButton("ADD");
JSpinner quantitySlider = new JSpinner();
JTextArea catalog = new JTextArea(7, 30);
List items = new ArrayList();

public UpdateStock(){
    setLayout(new BorderLayout());
    setBounds(100, 100, 450, 500);
    setTitle("Update Stock");
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

    JPanel top = new JPanel();
    add("North", top);
    JPanel middle = new JPanel();
    add("Center", middle);

    top.add(stockNo);
    top.add(quantitySlider);
    top.add(addButton);

    catalog.setLineWrap(true);
    catalog.setWrapStyleWord(true);
    catalog.setEditable(false);
    middle.add(new JScrollPane(catalog));
    for(String key : StockData.getStock().keySet()) {
        catalog.append("Item: " + key +"\n");
        items.add(StockData.getName(key));
        catalog.append("Name: " + StockData.getName(key) +
                "  Price: " + StockData.getPrice(key) +
                " Qty: " + StockData.getQuantity(key)+"\n");
    }
    setResizable(false);
    setVisible(true);
}

}

1 ответ

Ваш код сразу помещает текст в JTextArea потому что вы говорите это. Это прямо в конструкторе:

for(String key : StockData.getStock().keySet()) {
    catalog.append("Item: " + key +"\n");
    items.add(StockData.getName(key));
    catalog.append("Name: " + StockData.getName(key) +
            "  Price: " + StockData.getPrice(key) +
            " Qty: " + StockData.getQuantity(key)+"\n");
}

Если вы хотите подождать, пока пользователь не выберет элемент, прежде чем задавать какой-либо текст, зарегистрируйте ActionListener на addButton используя его addActionListener() метод. Используйте этот слушатель actionPerformed() метод для установки текста. Не забудьте также удалить приведенный выше код из вашего конструктора.

Я вижу, вы уже знаете о ActionListener класс, так как он реализован UpdateStock, но это немного странно (хотя и совершенно правильно!) делать это таким образом; Я не думаю, что видел много подклассов JFrame реализовать это напрямую. Обычный шаблон заключается в использовании анонимногоActionListener и просто зарегистрируйте это вместо этого. Если вы действительно хотите использовать UpdateStock как ActionListenerтогда вам понадобится actionPerformed() метод, определенный в UpdateStock и вам нужно будет зарегистрироваться this как слушатель действий на вашей кнопке.

Другие вопросы по тегам