2016-01-18 4 views
0

Я новичок Java, и я хотел бы получить все значения из другого класса, который использует HashMap для заполнения моего JComboBoxДобавление строк значения HashMap в JComboBox

public class StockData { 

private static class Item { 

    Item(String n, double p, int q) { 
     name = n; 
     price = p; 
     quantity = q; 
    } 

    // get methods 
    public String getName() { 
     return name; 
    } 

    public double getPrice() { 
     return price; 
    } 

    public int getQuantity() { 
     return quantity; 
    } 

    // instance variables 
    private final String name; 
    private final double price; 
    private int quantity; 
} 

// with a Map you use put to insert a key, value pair 
// and get(key) to retrieve the value associated with a key 
// You don't need to understand how this works! 
private final static Map<String, Item> stock = new HashMap(); 

static { 
    // if you want to have extra stock items, put them in here 
    // use the same style - keys should be Strings 
    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(); 
    } 
} 
} 

, и я хотел бы поставить все эти ценности как банное полотенце, Plebney light и т. д. в моем JCombobox.

package stock; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 

public class PurchaseItem extends JFrame implements ActionListener { 
    // StockData ss = new StockData(); 
     JComboBox<String> box = new JComboBox<>(stock.values().stream().map(Item::getName).toArray(String[]::new)); 
JComboBox b = new JComboBox(); 
} 
+0

И что конкретно представляет собой ваш вопрос или проблема? – Corubba

ответ

1

Предположим, что ваш объект Item имеет функцию GetName вы могли бы написать это:

JComboBox<String> box = new JComboBox<>(
     stock.values().stream() 
     .map(Item::getName) 
     .toArray(String[]::new) 
    ); 

Я думаю, что лучший способ понять синтаксис для вас, чтобы пойти и прочитать Javadoc методов, вызываемых. Еще небольшое объяснение .values ​​() возвращает набор всех значений на карте запаса, а затем поток, как говорит документация, возвращает последовательный поток с коллекцией в качестве источника, тогда карта вызывает функцию getName() (я предполагаю, что у вас есть: public String getName()) для каждого объекта в потоке, а затем вы превратите все строки, которые у вас есть, в массив строк. По результату это так же, как:

JComboBox<String> box = new JComboBox<>(); 
     for(Item item:stock.values()){ 
      box.addItem(item.getName()); 
     } 

EDIT:

Если переменная акции в другом классе, то PurchaseItem чем PurchaseItem не может видеть его. Вы можете сделать это подвергается либо путем изменения секретности или сделав функцию получить за него:

public static Map<String, Item> getStock() { 
    return stock; 
    } 

Поскольку для функции я изначально писал вам, что вы нужны vlaues вы могли бы сделать геттер для vlaue набора, как это:

public static Collection<Item> getStock() { 
    return stock.values(); 
} 

, а затем modifie код так:

JComboBox<String> box = new JComboBox<>(
     NameOfTheClassWhichContainsStock.getStock().stream() 
     .map(Item::getName) 
     .toArray(String[]::new) 
); 

EDIT2: Ваш класс Item является частным, так что не видно снаружи StockD ata, поэтому его невозможно найти. Если вы измените класс Item для общественности и импортировать StockData в классе PurchaseItem, то вы можете написать:

JComboBox<String> box = new JComboBox<>(StockData.getStock() 
    .values() 
    .stream() 
    .map(StockData.Item::getName) 
    .toArray(String[]::new) 
); 

EDIT3: состояние на моем компьютере:

package stockdata; 

import java.util.HashMap; 
import java.util.Map; 

public class StockData { 

public static class Item { 

    Item(String n, double p, int q) { 
     name = n; 
     price = p; 
     quantity = q; 
    } 

    // get methods 
    public String getName() { 
     return name; 
    } 

    public double getPrice() { 
     return price; 
    } 

    public int getQuantity() { 
     return quantity; 
    } 

    // instance variables 
    private final String name; 
    private final double price; 
    private int quantity; 
} 

// with a Map you use put to insert a key, value pair 
// and get(key) to retrieve the value associated with a key 
// You don't need to understand how this works! 
private final static Map<String, Item> stock = new HashMap<>(); 

static { 
    // if you want to have extra stock items, put them in here 
    // use the same style - keys should be Strings 
    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(); 
    } 
} 
} 

// ====== ================================================== =========

package stockdata; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.*; 
import stockdata.StockData; 

public class PurchaseItem extends JFrame implements ActionListener { 
    // StockData ss = new StockData(); 
    JComboBox<String> box = new JComboBox<>(StockData.getStock().values().stream().map(StockData.Item::getName).toArray(String[]::new)); 
    JComboBox b = new JComboBox(); 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
} 

EDIT4:

public double getPriceForName(String itemName){ 

    return StockData.getStock() 
      .values() 
      .stream() 
      .filter(item->item.getName().equals(itemName))//filter only those whit the given name 
      .mapToDouble(StockData.Item::getPrice)//get item price 
      .findFirst()//Item name should be unique then it is ok to do this 
      .getAsDouble();//if there is no item with the given name this will throw a NoSuchElementException 
} 

public int getQuantityForName(String itemName){ 

    return StockData.getStock() 
      .values() 
      .stream() 
      .filter(item->item.getName().equals(itemName))//filter only those whit the given name 
      .mapToInt(StockData.Item::getQuantity)//get item quantity 
      .findFirst()//Item name should be unique then it is ok to do this 
      .getAsInt();//if there is no item with the given name this will throw a NoSuchElementException 
} 
+0

JComboBox box = new JComboBox <> (StockData.values ​​(). Stream(). Map (Item :: getName) .toArray (String [] :: new)); Хорошо начинайте понимать, что все еще получают ошибку со значениями(), это внутренняя функция java или мне нужно сделать эту функцию? и элемент подсвечивается, а также смотрит на него. – Higeath

+0

values ​​() - это функция интерфейса карты. Вы (@Higeath) можете найти функции интерфейса карты здесь: https://docs.oracle.com/javase/8/docs/api/java/util/Map.html. –

+0

Если вы разместите больше своего кода, я могу помочь вам найти проблему. –

Смежные вопросы