Как использовать пользовательские объекты в качестве источника для JComboBox - PullRequest
0 голосов
/ 25 января 2019

У меня есть JComboBox, который я хотел бы отобразить все элементы внутри моего HashSet типа "Глагол", который я создал.Однако, когда я выполняю свою программу, я получаю исключение, которое гласит: «.IllegalArgumentException: setSelectedIndex: 0 out of bounds».Я понимаю, что это может означать, что при доступе к массиву, который я сформировал из набора, он не может найти никаких элементов для индекса по умолчанию (0), который должен быть отключен в ComboBox.Мне интересно, если я использую ComboBox неправильно.

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

Класс приложения

import net.miginfocom.swing.MigLayout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashSet;

public class App extends JPanel {

    private HashSet<Verb> verbs = new HashSet<>();
    private JTextField field = new JTextField(20);
    private JCheckBox checkBox = new JCheckBox("Irregular");
    private JComboBox<Verb> comboBox = new JComboBox<>(new MyComboBoxModel(verbs));

    public App() {

        verbs.add(new Verb("Hello", true));
        //App Layout
        setLayout(new MigLayout("align 50%"));
        CardLayout cardLayout = new CardLayout();

        //Main Panel
        JPanel centerPanel = new JPanel(cardLayout);

        //Card Switcher
        CardSwitcher switcher = new CardSwitcher(centerPanel, cardLayout);

        //Nav Button Panel
        ButtonPanel buttons = new ButtonPanel(switcher);

        //    JPanels for Cards                /////////////
        //ADD VERB CARD
        JPanel pnl_addVerb = new JPanel(new MigLayout());
        pnl_addVerb.add(new JLabel("Enter a verb: "), "wrap");

        // TEXT FIELD
        pnl_addVerb.add(field, "wrap");

        // CHECK BOX
        pnl_addVerb.add(checkBox, "wrap");

        // ADD VERB BUTTON
        JButton addVerb = new JButton("Add");
        addVerb.addActionListener(new BtnHandler(this, 1));
        pnl_addVerb.add(addVerb, "wrap");

        centerPanel.add(pnl_addVerb, "A");


        //VIEW VERBS CARD
        JPanel pnl_ViewVerb = new JPanel(new MigLayout());
        pnl_ViewVerb.add(new JLabel("View Verb"), "wrap");

        // COMBO BOX TO DISPLAY VERBS
        pnl_ViewVerb.add(comboBox);
        comboBox.setSelectedIndex(0);

        centerPanel.add(pnl_ViewVerb, "B");

        //Add nav buttons and center panel to app
        add(buttons, "span");
        add(centerPanel, "span");
    }

    class ButtonPanel extends JPanel{
        public ButtonPanel(CardSwitcher switcher){
            setLayout(new GridBagLayout());

            JButton buttonA = new JButton("Add Verbs");
            add(buttonA);
            buttonA.addActionListener(new NavHandler(1, switcher));

            JButton buttonB = new JButton("View Verbs");
            add(buttonB);
            buttonB.addActionListener(new NavHandler( 2, switcher));
        }
    }

    //Handling of card switching
    class NavHandler implements ActionListener {
        int state;
        CardSwitcher switcher;
        public NavHandler(int state, CardSwitcher switcher){
            this.state = state;
            this.switcher = switcher;
        }
        public void actionPerformed(ActionEvent e){
            switch(state){
                case 1: switcher.switchTo("A");
                    break;
                case 2: switcher.switchTo("B");
                    break;
            }
        }
    }

    //Handling of other buttons/items
    class BtnHandler implements ActionListener{
        App app;
        int state;
        public BtnHandler(App app, int state){
            this.app = app;
            this.state = state;
        }
            public void actionPerformed(ActionEvent e){
                switch(state){
                    case 1:
                        String inf = app.field.getText();
                        if(!app.checkBox.isSelected()){
                            verbs.add(new Verb(inf, true));
                            field.setText("");
                        }
                        for(Verb v : verbs){
                            System.out.println(v.toString());
                        }
                        break;
                    case 2:
                        break;
                }
            }
    }

    class CardSwitcher {
        CardLayout layout;
        Container container;
        public CardSwitcher(Container container, CardLayout layout) {
            this.layout = layout;
            this.container = container;
        }
        public void switchTo(String card) {
            layout.show(container, card);
        }
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame("Verb Program");
                App app = new App();
                frame.getContentPane().add(app);
                frame.setSize(400, 400);
                frame.setVisible(true);
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            }
        });}
    }

Класс глагола

public class Verb {
    public String infinitive;
    boolean regular;

    public Verb(String infinitive, boolean regular){
        this.infinitive = infinitive;
        this.regular = regular;
        System.out.println("Created verb obj " + infinitive);
    }

    @Override
    public String toString() {
        return this.infinitive;
    }

    public boolean equals(Object o){
        Verb v = (Verb)o;
        if(v.infinitive.equals(this.infinitive)){
            return true;
        }
        return false;
    }

    public int hashCode(){
        int hash = 1;
        hash = hash + this.infinitive.hashCode();
        return hash;
    }
}

Класс MyComboBoxModel

import javax.swing.*;
import java.util.HashSet;

public class MyComboBoxModel extends AbstractListModel implements ComboBoxModel {
    HashSet<Verb> set;
    Verb[] arr;
    String selection = null;

    public MyComboBoxModel(HashSet<Verb> set){
        this.set = set;
        this.arr = set.toArray(new Verb[set.size()]);
        System.out.println("Created Combo Box");
    }

    public Object getElementAt(int index){
        return arr[index];
    }

    public int getSize(){
        return arr.length;
    }

    public void setSelectedItem(Object o){
        selection = (String)o;
    }

    public Object getSelectedItem(){
        return selection;
    }
}

Я ожидал, что в результате вы увидите, что глаголы должны отображаться в ComboBox, однако при запуске программы возникает исключение.Если я удаляю строку кода «comboBox.setSelectedIndex (0);», программа запускается, но не отображает никаких глаголов в ComboBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...