У меня есть 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.