2016-01-23 2 views
0

Так что я пытаюсь сделать, чтобы пользователь выбирал один вариант из JComboBox и рядом с миниатюрой отображения combobox указанной вещи.Отображение изображения в зависимости от раскрывающегося списка

Я создал список имен файлов, который получает все имена файлов из HashMap и выпадающего списка с именами этих элементов, как, например

stock.put("00", new Item("Bath towel", 5.50, 10, "bathTowel.jpg")); 

Так что теперь имя Bath Towel и имя файла bathTowel.jpg. В моем actionlistener я не уверен, как связать имя файла с именем элемента.

Когда пользователь выбирает банное полотенце, мой прослушиватель действия поймает это имя и как я могу связать Bath Towel с моим hashmap, чтобы вернуть имя файла bathTowel.jpg?

Мой класс с JComboBox:

public class StockDropdown extends StockData { 
    JComboBox stockOptions = new JComboBox(); 
    List<String> filename = new ArrayList<String>(); 

    private JLabel imgDis; 
    StockData sD; 


    public StockDropdown(){ 
     for(String key : StockData.getStock().keySet()) { 
      stockOptions.addItem(StockData.getName(key)); 
      filename.add(StockData.getFilename(key)); 
     } 
     stockOptions.addItemListener(
      new ItemListener() { 
       @Override 
       public void itemStateChanged(ItemEvent ie) { 
        if(ie.getStateChange() == ItemEvent.SELECTED){ 
         String temp = stockOptions.getSelectedItem().toString(); 
         String filePath; 

         for(String key : sD.getStock().keySet()) { 
          if(temp.equals(sD.getName(key))) { 
           filePath = sD.getFilename(key); 
           remove(imgDis); 
           imgDis = new JLabel(setImageSize(filePath)); 
           c.gridy = 1; 
           add(imgDis,c); 
           repaint(); 
           revalidate(); 
          } 
         } 
        } 
       } 
      } 
     ); 
    } 

    private ImageIcon setImageSize(String path) { 
     ImageIcon image1 = new ImageIcon(path); 
     Image image2 = image1.getImage().getScaledInstance(200,200,0); 
     return new ImageIcon(image2); 
    }; 


    public JComboBox getComboBox(){ 
     return stockOptions; 
    } 

} 

Мой класс с данными:

public class StockData { 
    private static class Item { 
     private final String name; 
     private final double price; 
     private int quantity; 
     private String filename; 

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

     public String getName() { 
      return name; 
     } 

     public double getPrice() { 
      return price; 
     } 

     public int getQuantity() { 
      return quantity; 
     } 

     public String getFilename() { 
      return filename; 
     } 
    } 

    public final static Map<String, Item> stock = new HashMap(); 

    static { 
     stock.put("00", new Item("Bath towel", 5.50, 10, "bathTowel.jpg")); 
     stock.put("11", new Item("Plebney light", 20.00, 5, "gorillaSuit.jpg")); 
     stock.put("22", new Item("Gorilla suit", 30.00, 7, "oven.jpg")); 
     stock.put("33", new Item("Whizz games console", 50.00, 8, "plebneyLight.jpg")); 
     stock.put("44", new Item("Oven", 200.00, 4, "whizzGamesConsole.jpg")); 
    } 

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

    public static String getName(String key) { 
     Item item = stock.get(key); 
     if (item == null) 
      return null; 
     return item.getName(); 
    } 

    public static double getPrice(String key) { 
     Item item = stock.get(key); 
     if (item == null) 
      return -1.0; 
     return item.getPrice(); 
    } 

    public static int getQuantity(String key) { 
     Item item = stock.get(key); 
     if (item == null) 
      return -1; 
     return item.getQuantity(); 
    } 
    public static String getFilename(String key) { 
     Item item = stock.get(key); 
     if (item == null) 
      return null; 
     return item.getFilename(); 
    } 

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

класс, который я использую для отображения JComboBox:

public class PurchaseStock extends JFrame implements ActionListener { 

    StockDropdown stockDropdown = new StockDropdown(); 


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

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


     top.add(stockDropdown.getComboBox()); 

     setResizable(false); 
     setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 

    } 
} 
+1

Является ли мой ответ, что вы были после? – Dan

+1

@ Dan Я прочитал его, спасибо за помощь. У меня не было возможности проверить это, но вы немного узнаете. – Higeath

ответ

1

Вы так близки к достижению что вы хотите с кодом. Чтобы делать то, что вы хотите, вы можете использовать.

public void itemStateChanged(ItemEvent ie) { 
    if(ie.getStateChange() == ItemEvent.SELECTED){ 
     String temp = stockOptions.getSelectedItem().toString(); 
     String filePath; 

     for(String key : sD.getStock().keySet()) { 
      if(temp.equals(sD.getName(key))) { 
       filePath = sD.getFilename(key); 
      } 
     } 
    } 
} 

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

StockData.java

import java.util.*; 

public class StockData { 

    private static class Item { 
     Item(String n, double p, int q, String f) { 
      name = n; 
      price = p; 
      quantity = q; 
      filename = f; 
     } 

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

     public double getPrice() { 
      return price; 
     } 

     public int getQuantity() { 
      return quantity; 
     } 

     public String getFilename() { 
      return filename; 
     } 

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

    public 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, "images/crazyEmoji.jpg")); 
     stock.put("11", new Item("Plebney light", 20.00, 5, "images/sadEmoji.png")); 
     stock.put("22", new Item("Gorilla suit", 30.00, 7, "images/scaredEmoji.jpg")); 
     stock.put("33", new Item("Whizz games console", 50.00, 8, "images/winkEmoji.png")); 
     stock.put("44", new Item("Oven", 200.00, 4, "images/zippedEmoji.jpg")); 
    } 

    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 String getFilename(String key) { 
     Item item = stock.get(key); 
     if (item == null) { 
      return null; // null means no such item 
     } else { 
      return item.getFilename(); 
     } 
    } 

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


} 

StockDropdown.java

import javax.swing.JComboBox; 
import javax.swing.JLabel; 
import javax.swing.JFrame; 
import javax.swing.ImageIcon; 
import java.awt.Image; 
import java.awt.GridBagLayout; 
import java.awt.GridBagConstraints; 
import java.awt.Dimension; 
import java.awt.event.ItemListener; 
import java.awt.event.ItemEvent; 
import java.util.List; 
import java.util.ArrayList; 

public class StockDropdown extends JFrame { 
    private JComboBox stockOptions = new JComboBox(); 
    private JLabel imgDis; 
    private List<String> filename = new ArrayList<String>(); 
    StockData sD; 

    StockDropdown() { 
     super("Fist Window"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new GridBagLayout()); 

     GridBagConstraints c = new GridBagConstraints(); 

     for(String key : sD.getStock().keySet()) { 
      stockOptions.addItem(sD.getName(key)); 
      filename.add(sD.getFilename(key)); 
     } 

     stockOptions.addItemListener(
      new ItemListener() { 
       @Override 
       public void itemStateChanged(ItemEvent ie) { 
        if(ie.getStateChange() == ItemEvent.SELECTED){ 
         String temp = stockOptions.getSelectedItem().toString(); 
         String filePath; 

         for(String key : sD.getStock().keySet()) { 
          if(temp.equals(sD.getName(key))) { 
           filePath = sD.getFilename(key); 
           remove(imgDis); 
           imgDis = new JLabel(setImageSize(filePath)); 
           c.gridy = 1; 
           add(imgDis,c); 
           repaint(); 
           revalidate(); 
          } 
         } 
        } 
       } 
      } 
     ); 
     c.gridy = 0; 
     add(stockOptions,c); 


     imgDis = new JLabel(setImageSize("images/crazyEmoji.jpg")); 
     c.gridy = 1; 
     imgDis.setPreferredSize(new Dimension(200,200)); 
     add(imgDis,c); 

     pack(); 
     setVisible(true); 
    } 

    private ImageIcon setImageSize(String path) { 
     ImageIcon image1 = new ImageIcon(path); 
     Image image2 = image1.getImage().getScaledInstance(200,200,0); 
     return new ImageIcon(image2); 
    }; 

    public JComboBox getComboBox(){ 
     return stockOptions; 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       StockDropdown frame = new StockDropdown(); 
      } 
     }); 
    } 
} 

Это производит то, что выглядит как

Option 1 Option 2

Incase вы не заметили, я также изменил изображения

Редактировать

Вместо того, чтобы в JComboBox в отдельный класс сделать это в том же качестве JFrame класса.

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

import javax.swing.JComboBox; 
import javax.swing.JLabel; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.ImageIcon; 
import java.awt.Image; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ItemListener; 
import java.awt.event.ItemEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.util.List; 
import java.util.ArrayList; 

public class PurchaseStock extends JFrame implements ActionListener { 
    private JComboBox stockOptions = new JComboBox(); 
    private JLabel imgDis; 
    private List<String> filename = new ArrayList<String>(); 
    StockData sD; 

    PurchaseStock() { 
     super("Fist Window"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 

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

     for(String key : sD.getStock().keySet()) { 
      stockOptions.addItem(sD.getName(key)); 
      filename.add(sD.getFilename(key)); 
     } 

     stockOptions.addItemListener(
      new ItemListener() { 
       @Override 
       public void itemStateChanged(ItemEvent ie) { 
        if(ie.getStateChange() == ItemEvent.SELECTED){ 
         String temp = stockOptions.getSelectedItem().toString(); 
         String filePath; 

         for(String key : sD.getStock().keySet()) { 
          if(temp.equals(sD.getName(key))) { 
           filePath = sD.getFilename(key); 
           middle.remove(imgDis); 
           imgDis = new JLabel(setImageSize(filePath)); 
           middle.add(imgDis); 
           middle.repaint(); 
           middle.revalidate(); 
          } 
         } 
        } 
       } 
      } 
     ); 

     top.add(stockOptions); 



     imgDis = new JLabel(setImageSize("images/crazyEmoji.jpg")); 
     imgDis.setPreferredSize(new Dimension(200,200)); 
     middle.add(imgDis); 

     pack(); 
     setVisible(true); 
    } 

    private ImageIcon setImageSize(String path) { 
     ImageIcon image1 = new ImageIcon(path); 
     Image image2 = image1.getImage().getScaledInstance(200,200,0); 
     return new ImageIcon(image2); 
    }; 

    public JComboBox getComboBox(){ 
     return stockOptions; 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 

    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       PurchaseStock frame = new PurchaseStock(); 
      } 
     }); 
    } 
} 

Edit 2

Вот ваши три класса

StockData.Java

import java.util.*; 

public class StockData { 

    private static class Item { 
     Item(String n, double p, int q, String f) { 
      name = n; 
      price = p; 
      quantity = q; 
      filename = f; 
     } 

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

     public double getPrice() { 
      return price; 
     } 

     public int getQuantity() { 
      return quantity; 
     } 

     public String getFilename() { 
      return filename; 
     } 

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

    public 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, "images/crazyEmoji.jpg")); 
     stock.put("11", new Item("Plebney light", 20.00, 5, "images/sadEmoji.png")); 
     stock.put("22", new Item("Gorilla suit", 30.00, 7, "images/scaredEmoji.jpg")); 
     stock.put("33", new Item("Whizz games console", 50.00, 8, "images/winkEmoji.png")); 
     stock.put("44", new Item("Oven", 200.00, 4, "images/zippedEmoji.jpg")); 
    } 

    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 String getFilename(String key) { 
     Item item = stock.get(key); 
     if (item == null) { 
      return null; // null means no such item 
     } else { 
      return item.getFilename(); 
     } 
    } 

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


} 

StockDropdown.java

import javax.swing.JComboBox; 
import javax.swing.JLabel; 
import javax.swing.ImageIcon; 
import java.awt.Image; 
import java.awt.Dimension; 
import java.awt.event.ItemListener; 
import java.awt.event.ItemEvent; 
import java.util.List; 
import java.util.ArrayList; 

public class StockDropdown extends JComboBox { 
    List<String> filename = new ArrayList<String>(); 

    private JLabel imgDis; 
    StockData sD; 
    PurchaseStock pS; 


    public StockDropdown(PurchaseStock pS) { 
     this.pS = pS; 

     imgDis = new JLabel(setImageSize("images/crazyEmoji.jpg")); 
     imgDis.setPreferredSize(new Dimension(200,200)); 
     pS.getMiddle().add(imgDis); 
     pS.getMiddle().repaint(); 
     pS.getMiddle().revalidate(); 

     for(String key : sD.getStock().keySet()) { 
      addItem(sD.getName(key)); 
     } 

     addItemListener(
      new ItemListener() { 
       @Override 
       public void itemStateChanged(ItemEvent ie) { 
        if(ie.getStateChange() == ItemEvent.SELECTED){ 
         String temp = getSelectedItem().toString(); 
         String filePath; 

         for(String key : sD.getStock().keySet()) { 
          if(temp.equals(sD.getName(key))) { 
           filePath = sD.getFilename(key); 
           pS.getMiddle().remove(imgDis); 
           imgDis = new JLabel(setImageSize(filePath)); 
           pS.getMiddle().add(imgDis); 
           pS.getMiddle().repaint(); 
           pS.getMiddle().revalidate(); 
          } 
         } 
        } 
       } 
      } 
     ); 
    } 

    private ImageIcon setImageSize(String path) { 
     ImageIcon image1 = new ImageIcon(path); 
     Image image2 = image1.getImage().getScaledInstance(200,200,0); 
     return new ImageIcon(image2); 
    }; 
} 

PurchaseStock.java

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.BorderLayout; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class PurchaseStock extends JFrame implements ActionListener { 
    private JPanel top = new JPanel(); 
    private JPanel middle = new JPanel(); 
    StockData sD; 

    PurchaseStock() { 
     super("Fist Window"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 

     add("North", top); 
     add("Center", middle); 

     top.add(new StockDropdown(this)); 

     pack(); 
     setVisible(true); 
    } 

    public JPanel getMiddle() { 
     return middle; 
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 

    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       PurchaseStock frame = new PurchaseStock(); 
      } 
     }); 
    } 
} 

Это отделяет ваш JComboBox код из JFrame класса, однако, я до сих пор считаю, что это лучшая идея поставить JComboBox с JFrame. Это также использует BorderLayout, чтобы избежать путаницы.

+1

Я медленно пытаюсь реализовать это, можно ли взглянуть на обновленный код? Я использую отдельный класс для отображения этого JComboBox, поэтому я не совсем уверен, как бороться с переменной c, которая является вашим gridlayout. – Higeath

+1

@Higeath. Я редактировал код для работы с вашим макетом. Вместо того, чтобы иметь отдельный класс для JComboBox, гораздо проще сделать это в одном классе. Если вам действительно нужен один класс для 'JFrame' и один для комментария' JComboBox', и я поставлю его вместе для вас – Dan

+1

, главное, почему я хочу его отдельно, потому что я добавлю гораздо больше вещей к этой кнопке JFrame Jtextareas и таких, и я не хочу загромождать код – Higeath

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