[Java] ComboBox String Index auslesen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von killerm@ster, 11. September 2012 .

  1. 11. September 2012
    ComboBox String Index auslesen

    Hey,

    hab folgenden Code bis jetzt:
    Beachtet die ganzen imports nicht

    Spoiler
    import java.awt.*;
    import java.awt.datatransfer.*;
    import java.awt.event.*;
    import java.awt.Point;
    import java.awt.print.*;
    import java.awt.Toolkit;
    import java.io.*;
    import java.net.*;
    import javax.swing.*;
    import javax.swing.JComboBox;
    import javax.swing.border.*;
    import javax.swing.event.*;
    import javax.swing.filechooser.FileFilter;
    import javax.swing.undo.*;
    import java.text.*;
    import java.util.*;

    public class Waehrungsrechner extends JFrame implements ActionListener
    {
    JLabel lblZeichen = new JLabel("=");
    JTextField TextEingabe = new JTextField("1");
    JLabel lblAusgabe = new JLabel("1");
    JPanel p1 = new JPanel();
    String[] Waehrungen = { "Euro", "US-Dollar", "Britisches Pfund", "Rubel", "Yen", "Franken" };
    JComboBox WaehrungList1 = new JComboBox(Waehrungen);
    JComboBox WaehrungList2 = new JComboBox(Waehrungen);

    public Waehrungsrechner()
    {
    WaehrungList1.setSelectedIndex(0);
    WaehrungList1.addActionListener(this);
    WaehrungList2.setSelectedIndex(0);
    WaehrungList2.addActionListener(this);

    this.setContentPane(p1);
    p1.setVisible(true);
    p1.setLayout(null);

    p1.add(TextEingabe);
    p1.add(lblZeichen);
    p1.add(lblAusgabe);
    p1.add(WaehrungList1);
    p1.add(WaehrungList2);

    TextEingabe.setBounds(50,100,100,20);
    lblZeichen.setBounds(190,100,20,20);
    lblAusgabe.setBounds(240,100,100,20);
    WaehrungList1.setBounds(50,150,100,20);
    WaehrungList2.setBounds(240,150,100,20);
    }
    public void actionPerformed(ActionEvent e)
    {
    if(e.getSource()==WaehrungList1.getSelectedIndex() && e.getSource()==WaehrungList2.getSelectedIndex())
    {
    // float zahle = 32;
    // float zahl1;
    // float zahlw;
    // lblAusgabe.setText(""+zahle);
    }
    }
    public static void main(String[] args)
    {
    JFrame fenster = new Waehrungsrechner(); // Das Objekt Fenster erstellen.
    fenster.setBounds (200,200,400,300); // Position und Größe des Fensters bestimmen.
    fenster.setVisible(true); // Fenster sichtbar machen.
    fenster.setTitle("Währungsrechner"); // Titel bestimmen.
    fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Schließen des Programmes durch den "X" Button.
    }
    }

    Soll ein Währungsumrechner werden.
    Die Wechselkurse sollen aus einer .TXT ausgelesen werden. Hab es so gedacht, dass der richtige Wechselkurs aus der passenden Kombination aus den beiden Index Werten gewählt wird. Dafür muss ich erst mal die Index Werte auslesen, was nicht so klappen will.

    Hab schon irgendwelche Möglichkeiten probiert, aber es will nicht funktionieren.
    Hab was von toString gelesen, da bei getSelectedIndex ein Objekt herauskommt statt einem String, aber keine Ahnung wie man das dort verwendet.
    Kann jemand helfen?
    Dieses setText... hab ich erst mal nur so reingeschrieben, um erst mal zu testen, was er da ausliest (und ob er überhaupt was ausliest).
     
  2. 11. September 2012
    Zuletzt bearbeitet: 11. September 2012
    AW: ComboBox String Index auslesen

    Die ganze Sache schreit ziemlich nach einem vernünftigem Design. [G]MVC[/G] würde sich hier anbieten, wenn du ein wenig Zeit hast. Der Code wie er jetzt ist, ist ziemlich schlecht wart- bzw. lesbar. Wobei MVC hier wahrscheinlich etwas zu groß angelegt wäre. Du sollst aber zumindest versuchen irgendwie die Logik von der GUI zu trennen.

    Ansonsten schaue ich mal eben nach deinem Problem. Edit incoming...

    //

    Du willst wahrscheinlich so was machen:

    Code:
     
    public void actionPerformed(ActionEvent e) {
     if (e.getSource() == WaehrungList1 || e.getSource() == WaehrungList2) {
     System.out.println("WaehrungList1 selection: " + WaehrungList1.getSelectedItem() + "("+ WaehrungList1.getSelectedIndex() + ")");
     System.out.println("WaehrungList2 selection: " + WaehrungList2.getSelectedItem() + "("+ WaehrungList2.getSelectedIndex() + ")");
     }
     }
    
    Sobald sich nun die Selection einer der beiden JComboBoxen verändert werden beide Indexe und die entsprechenden Items ausgeben. Wie du das nun weiterverarbeitest ist ja egal.

    //
    Code:
     
     public void actionPerformed(ActionEvent e) {
     if (e.getSource() == WaehrungList1 || e.getSource() == WaehrungList2) {
     System.out.println(getWechselskurs(WaehrungList1.getSelectedIndex(), WaehrungList2.getSelectedIndex()));
     }
     }
     
     private double getWechselskurs(int indexA,int indexB) {
     Map<String,Double> indexZuWechselkurs = loadKursList();
     
     return indexZuWechselkurs.get(indexA+"+"+indexB);
     }
     
     private Map<String,Double> loadKursList() {
     Map<String,Double> indexZuWechselkurs = new HashMap<String,Double>();
     for (int i = 0; i < Waehrungen.length; i++) {
     for (int j = 0; j < Waehrungen.length; j++) {
     indexZuWechselkurs.put(i+"+"+j, new Random().nextDouble());
     }
     }
     return indexZuWechselkurs;
     }
    
    So könnte man das z.B. deinem Ansatz nach lösen. Wobei du natürlich die loadKursList-Funktion anpassen musst. Momentan generiert diese nur Zufallskurse.

    Aber wie gesagt: Das ganze sollte an sich noch mal überdacht werden...
     
    1 Person gefällt das.
  3. 11. September 2012
    Zuletzt bearbeitet: 11. September 2012
    AW: ComboBox String Index auslesen

    bei

    if(e.getSource()==WaehrungList1.getSelectedIndex()

    musst du equals(eineComboBox) benutzen, weil du komplexe Datentypen vergleichst.

    Also z.B.

    Code:
    public void actionPerformed(ActionEvent e){
    ComboBox box = (ComboBox) e.getSource();
    
    if(box.equals(Währungslist1)){
    String string = (String)währungslist1.getSelected();
    }
    ...
    
    Beachte: wenn du die Datentypen so castest, wie ich es im Beispiel mache, dann darf der Listener nur von Comboboxen benutzt werden.

    Benutzt du Eclipse, oder schreibst du den ganzen Code mit einem handelsüblichen Textedtor(Notepad, Windows Text-Editor, etc...)?
     
    1 Person gefällt das.
  4. 11. September 2012
    Zuletzt bearbeitet: 11. September 2012
    AW: ComboBox String Index auslesen

    Nö.

    Das mag zwar oft Stimmen ist hier aber unangebracht. Es geht ja hier darum festzustellen welche Combobox das Event ausgelöst hat und da muss man per "==" die Referenz vergleichen. Zumindest nehme ich an, dass das die Intention war (alles andere macht auch wenig Sinn).

    Das würdest du auch relativ schnell feststellen, wenn du dir die normale Object Implementierung von equals() (wie du sie hier verwendest) anschaust. Die macht nichts anderes als == auf den Parameter anzuwenden. Deswegen funktioniert dein Code zwar, aber vom Verständnis her liegst du daneben.

    Code:
     public boolean equals(Object obj) {
     return (this == obj);
     }
    
    Abgesehen davon, dass ich sowieso davon abrate den selben Listener für verschiedene Typen von Objekten zu nutzen kann man auch dieser Problematik vorbeugen:

    Code:
     
    if (e.getSource() instanceof ComboBox) {
     ComboBox box = (ComboBox) e.getSource();
    }
    
    Sollte man auch immer machen. Ansonsten ist der Cast unsicher!

    Und hierzu:

    Code:
     
    String string = (String)währungslist1.getSelected();
    
    Auf String zu casten ist auch nicht sinnvoll! Object schreibt nicht umsonst eine toString() Methode für jedes Objekt vor.
     
  5. 11. September 2012
    Zuletzt bearbeitet: 11. September 2012
    AW: ComboBox String Index auslesen

    Prinzipiell hast du in vielen Punkten Recht. Wie immer führen viele Wege zum Ziel und ein paar Details habe ich bewusst so geschrieben, damit das Resultat offensichtlicher wird. Jedoch noch kleine Anmerkungen zu deinem Post:

    Ich benutze equals, weil sich bei meiner üblichen Praxis die Komponenten verändern können. Da reicht dann meines Wissens nach == nicht mehr aus. Auf dieses Beispiel bezogen zwar kein Muss, aber auf keinen Fall falsch.

    Und dass man je Komponententyp einen seperaten Listener definieren sollte, halte ich nicht für verallgemeinbar. Schaut man sich bspw. Android-Programmierung an; dort können dutzende verschiedene Komponenten einen OnClicklistener implementieren(Button, ImageButton, ImageView, ListView, GridView,...); nur logisch, dass man dann mehrere unter einen Hut bringt, um Codezeilen zu sparen.
     
  6. 11. September 2012
    Zuletzt bearbeitet: 11. September 2012
    AW: ComboBox String Index auslesen

    Welchen Teil genau. Für mich sah das mehr nach dem Gegenteil aus ?(
    Er muss irgendwann sowieso den Unterschied zwischen equals() und dem "=="-Operator lernen. Das ist essentiell.

    So lange der Code läuft ist nichts falsch. Du hast hier nur die falsche Begründung geliefert. Wenn man eine Referenz vergleichen will macht es einfach wenig Sinn equals() zu nutzen obgleich Java dich da wieder auffängt.

    Aber du kannst das Verhalten von equals() nicht immer voraussagen, da es überschrieben werden kann. Der "=="-Operator hingegen ist statisch und kann sein Verhalten nicht ändern. Warum sollte man sich also auf mögliche Nebenläufigkeiten einlassen, wenn man genau weiß, dass an dieser Stelle eine Referenz und kein Inhalt verglichen werden soll?

    Nur weil es möglich ist, macht es das nicht zu gutem Stil. Was ich meinte ist, dass man die Listener nach Logik gliedern sollte anstatt alles in einen zu packen.

    Es geht nicht immer darum so wenig wie möglich Code zu schreiben sondern viel mehr darum gut wartbaren Code zu schreiben. Es sollte natürlich immer vermieden werden Code zu wiederholen.

    Man kann teilweise ganze Algorithmen in eine Zeile packen - das macht aber aufgrund der Wartbarkeit keinen Sinn und was die Geschwindigkeit angeht wird der Bytecode sowieso noch hart auto-optimiert.
     
  7. 11. September 2012
    Zuletzt bearbeitet: 11. September 2012
    AW: ComboBox String Index auslesen

    Du drehst mir die Worte im Mund herum :lol: . Natürlich sollte ein
    Und genau auf das wollte ich auch hinaus, wenn ein Listener mehrere Typen bedient:
    Dass der Code trotz Codeeinsparung wartbar bleiben muss, steht außer Frage. Kein Zweifel!

    Diesem Satz kann man wohl Allgemeingültigkeit auf fast sämtliche Programmiersprachen einräumen:
    Ich hoffe alle Klarheiten sind beseitigt, die Frage des Threaderstellers sollte "ausreichend beantwortet" sein.
     
  8. 12. September 2012
    AW: ComboBox String Index auslesen

    Ok, danke schön an euch. Habt mir sehr weiter geholfen
    BWs sind raus.

    Ich benutze übrigens den JCreator 4.00.028
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.