2014-10-06 3 views
1

Хорошо, я работаю над довольно большой программой.JCombo + переопределить toString

Я постараюсь поставить только то, что вам нужно.

Так прямо сейчас, comboBox заполняет (с переопределением toString), и выбирается первый элемент.

Когда я выбираю разные параметры и меняю содержимое comboBox, новый список помещается в comboBox, и первый элемент выбирается снова.

Я могу видеть обновление, поэтому я знаю, что он правильно заполняется.

Проблема что когда я выбираю что-либо в comboBox, ничего не происходит.

Первый элемент остается выбранным, ни одна из моих линий System.out.println не печатает, поэтому ничего не выполняется.

Когда я удаляю переопределение toString, все работает по назначению.

Странная часть, прошлое, когда имея это переопределение toString удаляется, он падает обратно на родительский класс, который имеет переопределение toString.

Что происходит?

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

Я добавляю объекты в comboBox, но отображаю немного информации.

public class Belt extends Part{ 
    //variable initialization and methods 
    @override 
    public String toString(){ 
    String display = this.getCode() + " - " + this.color; 
    return display; 
} 

public final class Something implements ActionListener{ 
    //variable initialization and methods 
    //there are several methods that call the fillBeltCombo() 

    GridBagConstraints c = new GridBagConstraints(); 
    private void pad(GridBagConstraints c){ 
     c.anchor = GridBagConstraints.NORTHWEST; 
     c.weightx = 1; 
     c.insets.left = 10; 
     c.insets.right = 10; 
     c.insets.top = 5; 
     c.insets.bottom = 5; 
    } 

    beltCombo = new JComboBox(); 
    beltCombo.setVisible(true); 
    c.gridwidth = 2; 
    c.gridx = 4; 
    c.gridy = 9; 
    beltCombo.addActionListener((ActionEvent eventBelt) -> { 
     JComboBox beltCodeCombo1 = (JComboBox) eventBelt.getSource(); 
     if(beltCombo.getItemCount()>0){ 
      currentProduct.setBelt((Belt)beltCodeCombo1.getSelectedItem()); 
     }else{/*do nothing*/} 
    }); 
    pane.add(beltCombo, c); 

    public static void fillBeltCombo(ArrayList<Belt> list){ 
     beltCombo.removeAllItems(); 
     int size = list.size(); 
     for(int x=0; x<size; x++){ 
      beltCombo.addItem(list.get(x)); 
     } 
    } 
} 
+0

Что такое 'c' выше? Как в 'c.gridwidth = 2;'. Кроме того, каждый раз, когда вызывается инициатор действия, вы создаете новый поле со списком. Возможно, это причина, по которой вы не видите обновления существующего поля со списком. Был ли новый блок со списком умышленным? – markspace

+0

@ markspace Добавил мои GridBagConstraints в код, чтобы показать, что такое 'c'. Что касается создания нового comboBox каждый раз при вызове слушателя, я не помню его аргументации. Я выбрал это где-то на этих форумах при реализации ActionListener. Так что да, это было намеренно (и это работает на моих comboBoxes, у которых нет другого переопределения toString), но я не могу защитить, почему я его использую. Просто стала привычкой. – brentb

+0

Итак, теперь вопрос в том, когда вы говорите «когда я выбираю что-нибудь в comboBox, ничего не происходит», в котором вы ссылаетесь? Для каждого клика у вас будет одна коробка combox. – markspace

ответ

0

добре, поэтому на основе вчерашнего успешного создания (который я был расстроен) я продолжал играть в скелете, пока не сломал снова. - Скорректированные классы, отражающие фактические типы данных, с которыми я имел дело. - Добавлен мой метод переопределения равным < ------- проблема

Случилось так, что когда я изначально создавал переопределение равных, все toStrings были одинаковыми и отображались в comboBox. Таким образом, равно переопределение выглядел

@Override public boolean equals(Object other){ 
    if (other == null) return false; 
    return (String.valueOf(other)).equals(this.description); 
} 

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

this.getCode() + " - " + this.color; 

и его сравнивали с num, которое возвращало false.

Теперь исправьте меня, если я ошибаюсь, но мораль этой истории выглядит так: JComboBox не позволит вам выбрать что-то из списка, который не соответствует чему-то в списке. Итак, поскольку my equals override изменил способ сравнения объектов: Строковое значение объекта по сравнению со строковой переменной объекта тот же объект не был равен самому себе. Скорректированный код:

@Override public boolean equals(Object other){ 
    if (other == null) return false; 
    return ((Parent)other).description.equals(this.description); 
} 
0

Так что, совет markspace, я создал MCVE (лучшее, что я мог бы, сохраняя при этом, что делает моя программа). Все, что там сделано в моей реальной программе, хотя и сложнее. Я еще не уверен, что моя программа делает неправильно, однако я выяснил, что то, что я пытаюсь сделать, возможно, я могу выбрать элемент из второго comboBox при использовании переопределения toString в подклассе. Теперь я просто отслеживать проблемы вниз в реальном коде ...

package minitest; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.util.ArrayList; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class MainClass { 
    JFrame frame; 
    JPanel pane; 
    JLabel label1, label2; 
    JComboBox comboA, comboB; 
    ArrayList<Parent> parents = new ArrayList<>(); 
    ArrayList<Grandchild> grandkids = new ArrayList<>(); 
    Parent parent1 = new Parent(1); 
    Parent parent2 = new Parent(2); 
    Grandchild grandkid1 = new Grandchild(1,1,"oneone"); 
    Grandchild grandkid2 = new Grandchild(1,2,"onetwo"); 
    Grandchild grandkid3 = new Grandchild(2,1,"twoone"); 
    Grandchild grandkid4 = new Grandchild(2,2,"twotwo"); 
    public class Parent{ 
     protected int num; 
     public Parent(int num){ 
      this.num = num; 
     } 
     @Override public String toString(){ 
      return String.valueOf(num); 
     } 
    } 
    public class Child extends Parent{ 
     private double dbl; 
     public Child(int num, double dbl){ 
      super(num); 
      this.dbl = dbl; 
     } 
    } 
    public class Grandchild extends Child{ 
     private String str; 
     public Grandchild(int num, double dbl, String str){ 
      super(num, dbl); 
      this.str = str; 
     } 
     @Override public String toString(){ 
      return this.num + " - " + this.str; 
     } 
    } 
    //Fill passed combo with each item from passed ArrayList 
    public void fillCombo(ArrayList list, JComboBox target){ 
     target.removeAllItems(); 
     int size = list.size(); 
     for(int x = 0; x < size; x++){ 
      target.addItem(list.get(x)); 
     } 
    } 
    //remove all items from combobox except selected item 
    public void comboUpdate(JComboBox combo){ 
     if(combo.getSelectedItem()==null){ 
      /*donothing*/ 
     }else{ 
      int size = (combo.getItemCount()-1); 
      System.out.println("size: "+size); 
      for (int x=size; x>=0; x--) { 
       if(combo.getSelectedItem().equals(combo.getItemAt(x))){ 
        /*donothing*/ 
        System.out.println(combo.getSelectedItem()+" is selected"); 
       }else{ 
        System.out.println(combo.getItemAt(x)+" is now removed"); 
        combo.removeItemAt(x); 
       } 
      } 
     } 
    } 
    //Add each item from passed ArrayList if not equal to the selected item 
    public void removeDuplicate(JComboBox combo, ArrayList array){ 
     System.out.println("removeDuplicate: "+array); 
     if(combo.getSelectedItem()==null){ 
      System.out.println("combo.getSelectedItem==null"); 
      fillCombo(array, combo); 
     }else{ 
      boolean validChoice = false; 
      int arraySize = array.size(); 
       for(int x = 0; x < arraySize; x++){ 
        if(combo.getSelectedItem().equals(array.get(x))){ 
         System.out.println(combo.getSelectedItem()+" == "+array.get(x)); 
         validChoice = true; 
        }else{ 
         System.out.println(combo.getSelectedItem()+" != "+array.get(x)); 
         combo.addItem(array.get(x)); 
        } 
       } 
      if(validChoice == false){ 
       System.out.println("removeItemAt(0)"); 
       combo.removeItemAt(0); 
      } 
     } 
    } 
//fill comboB with grandchild objects whos int match the selected partent objects int 
    public void fillComboB(){ 
     System.out.println("grandkids: "+grandkids); 
     ArrayList<Grandchild> temp = copyArrayList(grandkids); 
     System.out.println("temp: "+temp); 
     comboUpdate(comboB); 
     int size = (temp.size()-1); 
     for(int x=size; x>=0; x--){ 
      if(temp.get(x).num==((Parent)comboA.getSelectedItem()).num){ 
       /*donothing*/ 
       System.out.println("donothing: temp.get("+x+")="+temp.get(x)); 
      }else{ 
       System.out.println("temp.remove("+x+")="+temp.get(x)); 
       temp.remove(x); 
      } 
     } 
     removeDuplicate(comboB, temp); 
    } 
    public ArrayList copyArrayList(ArrayList list){ 
     ArrayList<Object> temp = new ArrayList<>(); 
     int size = list.size(); 
     for(int x=0; x<size; x++){ 
      temp.add(list.get(x)); 
     } 
     return temp; 
    } 
    public MainClass(){ 
     parents.add(parent1); 
     parents.add(parent2); 
     grandkids.add(grandkid1); 
     grandkids.add(grandkid2); 
     grandkids.add(grandkid3); 
     grandkids.add(grandkid4); 
     frame = new JFrame("frame"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pane = new JPanel(); 
     pane.setLayout(new GridBagLayout()); 
     GridBagConstraints c = new GridBagConstraints(); 
     comboA = new JComboBox(); 
     fillCombo(parents, comboA); 
     c.gridx = 0; 
     c.gridy = 0; 
     comboA.addActionListener((ActionEvent eventComboA) -> { 
      System.out.println("eventComboA"); 
      JComboBox comboA1 = (JComboBox) eventComboA.getSource(); 
      if(comboA.getItemCount()>0){ 
       System.out.println("comboA.getItemCount>0: "+(Parent)comboA1.getSelectedItem()); 
       fillComboB(); 
      } 
     }); 
     pane.add(comboA, c); 

     comboB = new JComboBox(); 
     c.gridx = 0; 
     c.gridy = 1; 
     comboB.addActionListener((ActionEvent eventComboB) -> { 
      System.out.println("eventComboB"); 
      JComboBox comboB1 = (JComboBox) eventComboB.getSource(); 
      if(comboB.getItemCount()>0){ 
       System.out.println("comboB.getItemCount>0: "+(Grandchild)comboB1.getSelectedItem()); 
      } 
     }); 
     pane.add(comboB, c); 

     frame.setContentPane(pane); 
     frame.setSize(150,150); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
    private static void runGUI(){ 
     JFrame.setDefaultLookAndFeelDecorated(false); 
     MainClass create = new MainClass(); 
    } 
    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(() -> { 
      runGUI(); 
     }); 
    } 
} 
Смежные вопросы