Universal-Umrechner

Wolverine1

Mitglied
Hallo Leute, ich bin ein ziemlicher Java Noob und möchte einen Umrechner in Netbeans mit Swing basteln. Hab das GUI schon zum großen Teil mit Swing fertiggestellt, aber bei der eigentlichen Funktion hackts jetzt.

Erstmal wies funktionieren soll:
Zunächst einmal wählt man in einer Combobox aus was man umrechnen will. (Temperatur, Länge, Gewicht ect.)
Dann gibt es 2 weitere Comboboxen "Von was" "zu was" (z.B. Fahrenheit zu Celsius)

In einer Textbox kann man den gewünschten Wert eingeben der umgewandelt werden soll. Nach klicken eines Buttons wird gerrechnet!


Zunächst wird überprüft ob die Eingabe nur aus Zahlen besteht ansonsten Fehlermeldung, gut hab ich.

Aber jetzt soll die eigentliche Rechnung kommen Also den Eingabewert mit der jeweiligen Formel berechnen, also in Abhängigkeit von "Von was" und "Zu was". Ich denke das ist durch case oder if leicht zu realisieren.

Aber wie kann ich die Werte von den den Auswahlboxen nehmen? Also das ausgewählte von "Von was" und "Zu was"???


Ich hoffe das ganze war jetzt einigermaßen verständlich wenn nicht kann ichs ja evtl noch genauer erklären. Für eure Hilfe schon mal vielen Danke!



Java:
package universalrechner;

/**
 *
 * @author Hermann Fleischmann
 */
import javax.swing.JOptionPane;
public class Wandler extends javax.swing.JFrame {

    /** Creates new form Wandler */
    public Wandler() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        Eingabemenge = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        rein = new javax.swing.JComboBox();
        raus = new javax.swing.JComboBox();
        jButton1 = new javax.swing.JButton();
        Ausgabefeld = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("Menge eingben");

        Eingabemenge.setText("1");

        jLabel2.setText("Von");

        jLabel3.setText("Zu");

        rein.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Celsius (°C)", "Fahrenheit (°F)", "Kelvin (K)" }));

        raus.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Celsius (°C)", "Fahrenheit (°F)", "Kelvin (K)" }));

        jButton1.setText("Berrechnen");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        Ausgabefeld.setHorizontalAlignment(javax.swing.JTextField.CENTER);
        Ausgabefeld.setText("Ausgabe");
        Ausgabefeld.setEnabled(false);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(33, 33, 33)
                .addComponent(Ausgabefeld, javax.swing.GroupLayout.PREFERRED_SIZE, 351, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(56, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addGap(79, 79, 79)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(12, 12, 12)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 106, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel2)))
                    .addComponent(rein, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 43, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(raus, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel3)
                            .addComponent(Eingabemenge, javax.swing.GroupLayout.PREFERRED_SIZE, 62, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(37, 37, 37)))
                .addGap(101, 101, 101))
            .addGroup(layout.createSequentialGroup()
                .addGap(168, 168, 168)
                .addComponent(jButton1)
                .addContainerGap(185, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(71, 71, 71)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(Eingabemenge, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addGap(37, 37, 37)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jLabel3))
                .addGap(35, 35, 35)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(rein, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(raus, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(13, 13, 13)
                .addComponent(jButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(Ausgabefeld, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(24, 24, 24))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
// Nach drücken des Buttons beginnt die Umrechnung

       String EingabemengeText = Eingabemenge.getText();
       // Check for numbers only
       for(int i=0;i < EingabemengeText.length();i++)
       {
           if(!Character.isDigit(EingabemengeText.charAt(i)))//Überprüfung der Eingabe auf Richtigkeit
           {
               JOptionPane.showMessageDialog(this, "Bitte geben Sie eine Zahl ein!");//Ansonsten erscheint eine Meldung
             Eingabemenge.requestFocus();
               return;
           }
       }

              Ausgabefeld.setText("");
  // Get curreny from and to

    }                                        

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Wandler().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JTextField Ausgabefeld;
    private javax.swing.JTextField Eingabemenge;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JComboBox raus;
    private javax.swing.JComboBox rein;
    // End of variables declaration                   

}
 
Zuletzt bearbeitet von einem Moderator:

turtle

Top Contributor
Da Du Strings in Deinem Model gespeichert hast
Java:
rein.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Celsius (°C)", "Fahrenheit (°F)", "Kelvin (K)" }));
, kriegst Du auch Strings zurück:

Java:
String selectedItem = (String) rein.getSelectedItem();
oder, wenn Du genau weisst, wie die Liste aussieht:
Java:
int index = raus.getSelectedIndex();
Da musst Du dann prüfen, über Index oder String und auswählen, welche Konvertierung gemacht werden soll.
 

Fu3L

Top Contributor
Da ich in letzter Zeit großen Gefallen an Enums gefunden habe, möchte ich mal eine Möglichkeit präsentieren, die ohne lästige Abfragen auskommt. Es unterscheidet sich allerdings in sofern von der Originalidee, dass es nur mit einer Combobox zur Auswahl der Umrechnung möglich ist. Also keine getrennten Boxen für von und zu:

Java:
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Calculator {
	
	JFrame f;
	JComboBox length;
	JTextField txt;
	JLabel result;
	JButton start;
	
	public enum Length {
		cm_to_inch { double calc(double x) { return x / INCH; } },
		inch_to_cm { double calc(double x) { return x * INCH; } };
		
		private static double INCH = 2.54;
		abstract double calc(double x);
	} //End Enum
	
	public Calculator() {
		f = new JFrame();
		f.setSize(300, 300);
		f.setLayout(new FlowLayout());
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			length = new JComboBox(Length.values());
		f.add(length);
			txt = new JTextField();
			txt.setPreferredSize(new Dimension(100, 20));
		f.add(txt);
			result = new JLabel("0");
		f.add(result);
			start = new JButton("Do");
			start.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
					Calculator.this.calculate();					
				}
			});
		f.add(start);
		f.setVisible(true);
	} //End Constructor
	
	public void calculate() {
		Length l = (Length) length.getSelectedItem();
		double res = l.calc(Double.parseDouble(txt.getText()));
		result.setText(String.valueOf(res));
	}
	
	public static void main(String[] args) {
		new Calculator();
	}
} //End Calculator

Um eine weitere Umrechnung hinzuzufügen, muss man lediglich ein weiteres Element zum Enum hinzufügen und schon funktioniert der Rest von alleine^^

Das gleiche könnte man auch bei der ersten CheckBox machen, die zur Auswahl der Umrechnungsart dient, dass man in dieser eben als Felder der Enums verschiedene Umrechnungsenums wie Length speichert und diese dann einfach in die ComboBox einfüllt.

Edit: Die Namen der Enumkonstanten sollte man normal natürlich groß schreiben, aber das sieht in der Auswahlbox dann so unangenehm aus, finde ich^^
 
Zuletzt bearbeitet:

Ariol

Top Contributor
.... Die Namen der Enumkonstanten sollte man normal natürlich groß schreiben, aber das sieht in der Auswahlbox dann so unangenehm aus, finde ich^^

Java:
public enum Length {
        CM_TO_INCH("von cm nach Zoll") { double calc(double x) { return x / INCH; } },
        INCH_TO_CM("von Zoll nach cm") { double calc(double x) { return x * INCH; } };
        
        private static double INCH = 2.54;
        
        private String name;
        abstract double calc(double x);        
        private Length(String name){this.name=name;}
        public String toString(){return this.name;}
    } //End Enuml

Tu's doch so.
 

Fu3L

Top Contributor
Hatte ich auch dran gedacht (bzw. sowas ähnliches sieht man hier auch in Herrn Blochs super-Buch^^ :D). War aber 1) faul und 2) nicht sicher, obs dann zu viel auf einmal wird^^ Aber wie immer bei Enums ist es doch kein großer Aufwand^^ :)
 

Swoop

Gesperrter Benutzer
ist enums nicht etwas hoch gegriffen für jemand der noch nicht weis wie er aus dieser Liste/Combo denn ein Text wieder heraus bekommt und diesen dann vergleicht ??

ich denke du solltest dir erstmal den text von der ComboBox mit "getText" o.ä. geben lassen und dann mit equals vergleichen. Enums solltest du dir erst später anschauen!
 

Fu3L

Top Contributor
ist enums nicht etwas hoch gegriffen für jemand der noch nicht weis wie er aus dieser Liste/Combo denn ein Text wieder heraus bekommt und diesen dann vergleicht ??

Ja, schon. Aber wenn er dann mehr und mehr Erfahrung sammelt, wird er sich bei solchen if else Zeug irgendwann erinnern: Aha, da war doch was! Und dann diesen wunderschönen Weg entdecken und verstehen^^ ;)
Außerdem kommen Enums in den meisten Anfängerbüchern viel zu kurz, wenn man bedenkt, was für tolle Sachen man damit machen kann...
 
Zuletzt bearbeitet:

Wolverine1

Mitglied
Danke für eure schnelle Hilfe Leute bin jetzt weitergekommen!
Leider hackts schon wieder etwas. Über eine Combobox soll gewählt werden wie gerechnet werden soll. Für den Anfang Arbeite ich nur mir Celcius nach Fahrenheit und Fahrenheit nach Celsius.
Durch einen Eventlistener und darauffolgende Switch-Methode soll die Rechenart gewählt werden.
Tja und das bekomm ich nicht ganz hin.
Wenn ich den Button-Event in Switch 1 oder 2 kopiere kommen nur Fehler.
Ich muss vermutlich einen Befehl in den Switches auslösen der sich über den Buttonbefehl überträgt... aber welchen?

Schon mal nochmals herzlichen Dank für eure Hilfe, bin mir ziemlich sicher wenn das geschafft ist komm ich ohne Schwierigkeiten weiter!




Java:
public class Rechner extends javax.swing.JFrame {

    /** Creates new form Rechner */
    public Rechner() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        tempEingabe = new javax.swing.JTextField();
        tempButton = new javax.swing.JButton();
        tempAusgabe = new javax.swing.JTextField();
        tempWahl = new javax.swing.JComboBox();
        ausgabe = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        tempButton.setText("Umrechnen");
        tempButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tempButtonActionPerformed(evt);
            }
        });

        tempWahl.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Celsius-Fahrenheit", "Fahrenheit-Celsius" }));
        tempWahl.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                tempWahlItemStateChanged(evt);
            }
        });

        ausgabe.setText("jLabel1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(144, 144, 144)
                        .addComponent(tempButton)
                        .addGap(27, 27, 27)
                        .addComponent(tempAusgabe, javax.swing.GroupLayout.PREFERRED_SIZE, 88, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(153, 153, 153)
                        .addComponent(tempWahl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(39, 39, 39)
                        .addComponent(tempEingabe, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(54, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(234, Short.MAX_VALUE)
                .addComponent(ausgabe)
                .addGap(132, 132, 132))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(38, 38, 38)
                .addComponent(tempWahl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(26, 26, 26)
                .addComponent(tempEingabe, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(32, 32, 32)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(tempButton)
                    .addComponent(tempAusgabe, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(35, 35, 35)
                .addComponent(ausgabe)
                .addContainerGap(92, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void tempWahlItemStateChanged(java.awt.event.ItemEvent evt) {
int i= tempWahl.getSelectedIndex(); //Wahl welche Temperaturen umgerechnet werden sollen

switch (i)
{case 1:
   
     
     
     break;
 case 2:
     break;
    }
    }
    private void tempButtonActionPerformed(java.awt.event.ActionEvent evt) {
        String curAmountText = tempEingabe.getText();
       // Check for numbers only
       for(int i=0;i < curAmountText.length();i++)
       {
           if(!Character.isDigit(curAmountText.charAt(i)))
           {
               JOptionPane.showMessageDialog(this, "Please enter a valid amount!");
               tempEingabe.requestFocus();
               return;




    }
     else{  int tempFahr = (int)((Double.parseDouble(tempEingabe.getText()))
            * 1.8 + 32);
    ausgabe.setText(tempFahr + " Fahrenheit");

         
         
       }}}
    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Rechner().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JLabel ausgabe;
    private javax.swing.JTextField tempAusgabe;
    private javax.swing.JButton tempButton;
    private javax.swing.JTextField tempEingabe;
    private javax.swing.JComboBox tempWahl;
    // End of variables declaration

}
 

Wolverine1

Mitglied
ch habe den Button Action Event korrigiert und die If-Anweisung gelöscht.


Also nochmals zum eigentlichen Problem. Ich habe eine Combox mit 2 Werten. (Celsius-Fahrenheit; Fahrenheit zu Celsius)

Je nachdem welcher Wert in der Combobox angewählt wird ändert sich die RechenFormel, welche wiederum durch den Button ausgelöst werden soll:

Java:
    private void tempWahlItemStateChanged(java.awt.event.ItemEvent evt) {
  

    
    }

    private void tempButtonActionPerformed(java.awt.event.ActionEvent evt) {
      String curAmountText = tempEingabe.getText();
    Double eingabeWert;
    try
    {
      // Check for numbers only
      eingabeWert = Double.parseDouble(curAmountText);
    }
    catch(NumberFormatException e)
    {
      JOptionPane.showMessageDialog(this, "Bitte Zahl eingeben");
      tempEingabe.requestFocus();
      return;
    }

{        
    double tempFahr = eingabeWert.doubleValue() * 1.8 + 32;
    tempAusgabe.setText((int)tempFahr + " Fahrenheit");}
        
        
    }

Ich dachte daran das irgendwie mit ner Swich zu machen aber wie genau weiß ich nicht.
 

Fu3L

Top Contributor
Machs lieber so (schnell hier im Forumfenster hingeschmiert):

Java:
String cmd = (String) checkbox.getSlectedItem();
double result = 0;
if("Celsius".equals(cmd)) {
  //Rechne mit Celsius
} else if(....) {
  //Rechne mit ...
}
ausgabefeld.setText(String.valueOf(result));

Switch funktioniert erst ab Java 7 mit Strings und du hast eben Strings in der Box.
 

Ähnliche Java Themen


Oben