2017-07-25 2 views
0

Je suppose que c'est une vraie question débutant mais je ne trouve pas de réponses ici, dans mon java-book ou ailleurs. J'essaye de construire une interface graphique en utilisant Swing où je peux enregistrer différents types de vin. Je veux ma classe de vin (il y aura une super classe de vin et trois sous-classes: rouge, blanc et rose) à la fois des cordes et des entiers (nom, année, etc.) et un tas d'objets comme Country, District, Maison et plus.Retour objet de JComboBox

je crée l'objet vin d'un JPanel composé maintenant d'un JTextArea le nom et JComboBox pour le pays, je remplir ma boîte combo en utilisant une boucle qui collecte la variable du nom du pays d'objet qui est stocké dans un Arraylist.

Voici ma forme pour le vin rosé, les autres ressemblent à peu près au même.

class RoseWineForm extends JPanel { 

    private JTextField wineName = new JTextField(15); 
    private JComboBox countryBox = new JComboBox(); 

    public RoseWineForm() { 
     JPanel line1 = new JPanel(); 
     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     line1.add(new JLabel("Namn: ")); 
     line1.add(wineName); 
     add(line1); 

     JPanel line2 = new JPanel(); 
     line2.add(new JLabel("Ursprungsland")); 
     line2.add(countryBox); 
     for(Country c : listOfCountries) { 
     countryBox.addItem(c.getCountryName()); 
     } 
     add(line2); 
    } 

    public String getName() { 
     return wineName.getText(); 
    } 

    public Country getCountry() { 
     return ; 
    }} 

Voici le ActionListener qui envoie l'utilisateur aux formes

class NewWineListener implements ActionListener { 
public void actionPerformed (ActionEvent a) { 
    try { 
     JComboBox wineColor = (JComboBox) a.getSource(); 
     if (wineColor.getSelectedIndex() == 0) { 
      RedWineForm red = new RedWineForm(); 
      int answer = JOptionPane.showConfirmDialog(TestVin.this, red, "Nytt rött vin", 
       JOptionPane.OK_CANCEL_OPTION); 
     } else if (wineColor.getSelectedIndex() == 1) { 
      WhiteWineForm white = new WhiteWineForm(); 
      int answer = JOptionPane.showConfirmDialog(TestVin.this, white, "Nytt vitt vin", 
       JOptionPane.OK_CANCEL_OPTION); 
     } else { 
      RoseWineForm rose = new RoseWineForm(); 
      int answer = JOptionPane.showConfirmDialog(TestVin.this, rose, "Nytt rosé vin", 
       JOptionPane.OK_CANCEL_OPTION); 
     } 
    } catch (NumberFormatException e) { 
      JOptionPane.showMessageDialog(TestVin.this, "Fel inmatning!"); 
     } 
    } 

Voici ma classe de pays:

public class Country { 

private String countryName; 

public Country(String countryName) { 
    this.countryName = countryName; 
} 

public String getCountryName() { 
    return countryName; 
} 

public void setCountryName(String newCountryName) { 
    if (newCountryName == null || newCountryName.trim().isEmpty()) { 
     System.out.println("You have to set a name.");  
    } else { 
    countryName = newCountryName; 
    }} 
    public String toString() { 
    return countryName;   

} 
} 

Ma question est: Lorsque je sélectionne le nom du pays dans mon zone de liste déroulante comment puis-je retourner l'objet et non seulement le String appelé countryName afin que je puisse créer mon objet vin avec les variables String name un d Country country?

J'espère que vous comprendrez qu'il y a du suédois là-dedans.

+0

Une seule ligne vide d'espace blanc dans le code source est tout ce qui est * jamais * nécessaire. Les lignes vides après '{' ou avant '}' sont également généralement redondantes. –

Répondre

1

Au lieu d'ajouter que le nom du pays comme vous faites maintenant, vous devrez ajouter l'objet pays lui-même, quelque chose comme ça ira bien:

public RoseWineForm() { 
     JPanel line1 = new JPanel(); 
     setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); 
     line1.add(new JLabel("Namn: ")); 
     line1.add(wineName); 
     add(line1); 

     JPanel line2 = new JPanel(); 
     line2.add(new JLabel("Ursprungsland")); 
     line2.add(countryBox); 
     for(Country c : listOfCountries) { 
      //This does the trick 
      countryBox.addItem(c); 
     } 
     add(line2); 
    } 

Puis dans votre classe « Pays » vous besoin de remplacer la méthode "toString", je crois que vous le faites bien, serait une bonne idée de formater votre code pour le rendre plus lisible.

public class Country { 

    private String countryName; 

    //Constructor, getters and setters 

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

} 

Et chaque fois que vous voulez obtenir l'objet de pays que vous avez sélectionné, vous pouvez simplement:

Country selectedCountry = (Country) countryBox.getSelectedItem(); 

Et obtenir l'ID, le nom ou toute autre propriété que vous auriez besoin de la fonctionnalité que vous souhaitez mettre en place.

Espérons que ça aide.

+0

Cela fonctionne presque je pense mais je fais quelque chose de mal parce que quand je crée mon objet Wine, je reçois une valeur nulle sur Country, je crée un objet de Wine mais la variable Country est nulle.Donc je suppose que soit quand je retourne "selectedCountry" de mon RoseWineForm ou quand je mets le Country dans mes informations JComboBox est perdu. Pouvez-vous me pointer dans la bonne direction? – SamSpj

+0

Pouvez-vous publier le code sur comment créez-vous l'objet Wine et attribuez-lui la valeur Country? Je ne pense pas que les informations du pays perdent quand vous le mettez dans le JComboBox puisque le composant affiche les valeurs, n'est-ce pas? S'il vous plaît, fournissez le code sur la façon dont vous obtenez vos valeurs de l'interface utilisateur pour vous fournir plus d'aide. –

+0

RoseWineForm rose = new RoseWineForm(); int réponse = JOptionPane.showConfirmDialog (TestVin.this, rose, "Nytt rosé vin", JOptionPane.OK_CANCEL_OPTION); si (answer = JOptionPane.OK_OPTION!) { \t \t \t \t \t \t de retour; \t \t} else { RoseWine r = nouveau RoseWine (rose.getName(), rose.getCountry()); allWines.add (r); allRoseWines.add (r); System.out.println (r.toString()); } – SamSpj

0

Je crois que vous recherchez la classe DefaultComboBoxModel car elle vous permet d'allouer dynamiquement les objets. Ensuite, dans le pays, vous devez la fonction toString() pour retourner countryName de sorte que lorsque l'objet DefaultComboBoxModel pousse à la liste déroulante, il affichera le nom, mais il retournera l'objet si cela a du sens. qui, afin de définir le modèle que vous avez créé pour le JPanel, vous pouvez utiliser countryBox.setModel(<name of DefaultComboBoxModel>).