2017-07-25 5 views
0

Ich denke, das ist eine echte Newbie Frage, aber ich kann keine Antworten hier finden, in meinem Java-Buch oder anderswo.Rückgabe Objekt von JComboBox

Ich versuche eine GUI mit Swing zu erstellen, wo ich verschiedene Arten von Wein registrieren kann. Ich möchte meine Weinklasse (es gibt eine Wein-Super-Klasse und drei Unterklassen: Rot, Weiß und Rose), die sowohl aus Strings und Ganzzahlen bestehen (Name, Jahr usw.) als auch aus einer Reihe von Objekten wie Country, District, Haus und mehr.

Ich schaffe den Wein Objekt aus einem JPanel jetzt eines JTextArea für den Namen aus und JComboBox für das Land, bevölkern ich meine Combo-Box mit einer for-Schleife, die den Namen Variable aus dem Objekt Land sammelt, die in einem gespeichert wird Anordnungsliste.

Hier ist meine Form für Rosé, die anderen sehen ungefähr gleich aus.

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 ; 
    }} 

Hier ist die ActionListener, die den Benutzer auf die Formen

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!"); 
     } 
    } 

Hier ist mein Land Klasse sendet:

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;   

} 
} 

Meine Frage ist: Wenn ich Namen wählen Sie das Land in meinem Kombinationsfeld Wie gebe ich das Objekt zurück und nicht nur das String namens countryName, damit ich mein Weinobjekt mit den Variablen String name anlegen kann d Country country?

Hoffe, Sie können verstehen, dass es einige schwedisch gibt.

+0

Eine einzelne leere Zeile Leerraum im Quellcode ist alles, was * jemals * benötigt wird. Leere Zeilen nach '{' oder vor '}' sind normalerweise redundant. –

Antwort

1

Statt nur den Namen des Landes hinzuzufügen, wie Sie jetzt tun, müssen Sie das Land Objekt selbst, so etwas addieren wird gut:

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); 
    } 

dann in der Klasse „Country“ Sie werden müssen Sie die "toString" -Methode überschreiben, ich glaube, Sie tun es gut, wäre eine gute Idee, um Ihren Code besser lesbar zu formatieren.

public class Country { 

    private String countryName; 

    //Constructor, getters and setters 

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

} 

Und wenn Sie das Land Objekt erhalten möchten Sie ausgewählt haben, können Sie einfach:

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

und nutzen Sie die ID, den Namen oder eine andere Eigenschaft, die Sie für die Funktionalität benötigen würden Sie möchten implementieren.

Ich hoffe, es hilft.

+0

Das funktioniert fast ich denke, aber ich mache etwas falsch, denn wenn ich mein Wine-Objekt erstellen, bekomme ich einen Null-Wert für Country, ich erstelle ein Objekt von Wine, aber die Country-Variable ist null.Ich denke also, wenn ich "selectedCountry" von meiner RoseWineForm zurückgebe oder wenn ich das Land in meine JComboBox lege, gehen Informationen verloren. Kannst du mich in die richtige Richtung weisen? – SamSpj

+0

Können Sie den Code zum Erstellen des Wine-Objekts und zum Zuweisen des Country-Werts posten? Ich glaube nicht, dass die Länderinformationen verloren gehen, wenn Sie sie in die JComboBox schreiben, da die Komponente die Werte anzeigt, oder? Bitte geben Sie den Code an, wie Sie Ihre Werte von der Benutzeroberfläche erhalten, um Ihnen mehr Hilfe zu bieten. –

+0

RoseWineForm Rose = neue RoseWineForm(); Int Antwort = JOptionPane.showConfirmDialog (TestVin.this, Rose, "Nytt Roséwein", JOptionPane.OK_CANCEL_OPTION); if (answer = JOptionPane.OK_OPTION!) { \t \t \t \t \t \t Rückkehr; \t \t} sonst { RoseWine r = neue RoseWine (rose.getName(), rose.getCountry()); allWein.add (r); AllRoseWines.add (r); System.out.println (r.toString()); } – SamSpj

0

Ich glaube, Sie suchen nach DefaultComboBoxModel Klasse, da dies ermöglicht Ihnen, die Objekte dynamisch zuweisen. Dann in Land müssen Sie @Override die toString() Funktion countryName so zurückgeben, wenn das DefaultComboBoxModel Objekt an die Combobox drückt, wird es den Namen zeigen, aber es wird Objekt zurückgeben, wenn das Sinn macht. Um das von Ihnen erstellte Modell auf JPanel zu setzen, können Sie countryBox.setModel(<name of DefaultComboBoxModel>) verwenden.

Verwandte Themen