2016-04-13 5 views
0

У меня JComboBox загружен объектами, которые имеют свой собственный метод toString. Этот combobox используется для выбора и возвращения этих объектов с помощью ActionListener в этом поле. Все работало нормально, пока я не решил добавить функцию для динамического добавления новых объектов, введя текст в это поле со списком и отправку с помощью кнопки «Отправить».Добавить типизированный текст в JComboBox как объект в этом JComboBox

Например,

мой класс:

public class SomeCustomClass { 
    private int id; 
    private String name; 

    public SomeCustomClass(String name){ 
     this.name = name; 
    } 
    // getters and setters here 
} 

Когда я набираю текст «тестовый текст» в выпадающем списке и представить его, я хочу, чтобы иметь эту коробку с новым объектом «SomeCustomClass ", где name =" Some test text ".

Вариант 1 Создайте собственный стиль из метода String to SomeCustomClass. Является ли это возможным? Это хорошая идея?

Вариант 2 Найти способ поймать строку до запуска триггером ActionListener в combobox, создать новый объект SomeCustomClass с текстом и снова вернуть его в поле со списком. Но как? Я не нашел метод getString (getText) для JComboBox.

Вариант 3 Ваши идеи ...

Я вроде новичок в Java, может быть я что-то пропустил.

+0

Как бы 'id' быть определена? До сих пор, как я вижу, все, что у вас есть, это текст – MadProgrammer

+0

Я могу добавить некоторый конструктор по умолчанию 'id' на конструктор или просто оставить его с помощью' null' или добавить функцию для генерации 'id', если она не определена. – AndriiL

ответ

1

Таким образом, в течение 10 минут тестирования я обнаружил, что ...

  • JComboBox#getSelectedIndex возвратит -1, если значение не существует в модели
  • JComboBox#getSelectedVaue возвратит String, если значение не существует в модели

Таким образом, используя любой из этих (или обоих), вы должны знать, когда это значение существует в модели или нет. Если этого не произойдет, вы должны быть в состоянии создать новый объект, передавая значение String и добавить его к JComboBox (при условии, что вы с помощью DefaultComboBoxModel)

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.DefaultComboBoxModel; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      DefaultComboBoxModel<Fruit> fruitModel = new DefaultComboBoxModel<>(); 
      fruitModel.addElement(new Fruit("Apple")); 
      fruitModel.addElement(new Fruit("Banana")); 
      fruitModel.addElement(new Fruit("Grapes")); 
      fruitModel.addElement(new Fruit("Pears")); 
      JComboBox cb = new JComboBox(fruitModel); 
      cb.setEditable(true); 
      add(cb); 
      cb.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        int index = cb.getSelectedIndex(); 
        Object value = cb.getSelectedItem(); 
        if (!(value instanceof Fruit)) { 
         System.out.println(value + " is not a fruit"); 
         cb.addItem(new Fruit(value.toString())); 
        } else { 
         System.out.println(value + " is a fruit"); 
        } 
       } 
      }); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 

    } 

    public class Fruit { 
     private String name; 

     public Fruit(String name) { 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 

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

    } 

} 
+0

Спасибо большое! Теперь я могу обрабатывать объекты и строки отдельно – AndriiL