2016-11-08 3 views
1

Я создал JComboBox внутри JFrameSwing - Пользовательское JComboBox Item

JComboBox itemsComboBox = new JComboBox(); 

А потом создал класс

public class ItemCombo { 

    Product p; 

    public ItemCombo(Product p) { 
     this.p = p; 
    } 

    @Override 
    public String toString(){ 
     return p.getName(); 
    } 

    public Float getPrice() { 
     return p.getPrice(); 
    }  
} 

и, насколько идет мои знания о комбо-боксах, теперь я должен был в состоянии сделать

itemsComboBox.addItem(new ItemCombo(Product)); 

но, он говорит, что он не может преобразовать объект ItemCombo в строку. Что я делаю не так? Есть ли другой способ создания пользовательского JComboBox?

+0

К сожалению, код в ответ fixed-- нужно передать модель в комбо-конструктор –

ответ

2

Вы обнаружите, что лучше добавлять/удалять элементы из модели JComboBox, а не из JComboBox напрямую. Поэтому создайте объект DefaultComboBoxModel<ItemCombo>, сделайте его моделью JComboBox<ItemCombo>. Затем добавьте элементы в модель, и вы должны быть золотыми. Например:

DefaultComboBoxModel<ItemCombo> comboModel = new DefaultComboBoxModel<>(); 
JComboBox<ItemCombo> itemsComboBox = new JComboBox<>(comboModel); // *** fixed *** 

// ...... 

comboModel.addItem(new ItemCombo(someProduct)); 

Доказательство концепции кода:

import java.awt.Dimension; 
import javax.swing.*; 

public class TestCombo extends JPanel { 
    private static final Product[] products = { 
      new Product("One", 1.0), 
      new Product("Two", 2.0), 
      new Product("Three", 3.0), 
      new Product("Four", 4.0), 
      new Product("Five", 5.0), 
    }; 

    private DefaultComboBoxModel<ItemCombo> comboModel = new DefaultComboBoxModel<>(); 
    private JComboBox<ItemCombo> itemsComboBox = new JComboBox<>(comboModel); 

    public TestCombo() { 
     add(itemsComboBox); 
     for (Product product : products) { 
      comboModel.addElement(new ItemCombo(product)); 
     } 
     itemsComboBox.addActionListener(e -> { 
      ItemCombo itemCombo = (ItemCombo) itemsComboBox.getSelectedItem(); 
      System.out.println("Selection: " + itemCombo.getProduct()); 
     }); 

     setPreferredSize(new Dimension(400, 150)); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("TestCombo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new TestCombo()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 


class ItemCombo { 

    private Product product; 

    public ItemCombo(Product p) { 
     this.product = p; 
    } 

    @Override 
    public String toString(){ 
     return product.getName(); 
    } 

    public double getPrice() { 
     return product.getPrice(); 
    } 

    public Product getProduct() { 
     return product; 
    } 
} 

class Product { 

    private String name; 
    private double price; 

    public Product(String name, double price) { 
     this.name = name; 
     this.price = price; 
    } 

    public String getName() { 
     return name; 
    } 

    public double getPrice() { 
     return price; 
    } 

    @Override 
    public String toString() { 
     return "Product [name=" + name + ", price=" + price + "]"; 
    } 
} 
+0

Спасибо! Это очень помогло мне! –

+0

@VitorCosta: Добро пожаловать. Пожалуйста, ознакомьтесь с разделом "доказательство концепции". –

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