JOptionPane hilfe!!! :((((

senol

Mitglied
Hi Leute, ich bin neu in Java und wollte mit ein Tilgungsrechner erstellen als "Übung" (was mich zum Ausrasten bringt: D).

Mein Frage, ich habe ein Oberfläche erstell, wo man 3 Daten eingibt und die mit getter, Setter etc ich übertrage in meine Rechnung soweit alles gut, es wird auch über sysout in der Konsole alles korrekt angezeigt! Nun will ich aber das die Rechnung, was in einer Weile schleife stattfindet mir alle Daten ausgibt, hab es erst versucht, irgendwie in einem TxtArea auszugeben (ging nicht idk why) jetzt versuche ich es in JOption wenn ich es in der Schleife anzeige plobt nach jedem schleifen Durchgang ein neues fenster auf, was ich mit ok wegklicke. Ist meine JOption außerhalb von While gibt er mir nur das end Ergebnis aus und irgendwie bekomme ich es nicht gebacken, das in Arrays oder sonst was auszugeben, brauche dringend hilfe.... 🙁(((


public void setRestschuld(double restschuld) {
this.restschuld = restschuld;
}

double[] daten1 = new double[Jahr];
double[] daten2 = new double[Jahr];
double[] daten3 = new double[Jahr];
public void RechnerJahr(double Darlehensbetrag, double Zinssatz, double Tilgungssatz) {

Gui_Tilgungsrechner gt = new Gui_Tilgungsrechner();
jahresrate = Darlehensbetrag * (Zinssatz + Tilgungssatz) / 100 ;
restschuld = Darlehensbetrag;



while(restschuld > 0.0) {
jahreszinsen = Zinssatz / 100 * restschuld;
jahrestilgung = jahresrate - jahreszinsen;
if(jahrestilgung >= restschuld) {
jahrestilgung = restschuld;
}
restschuld = restschuld - jahrestilgung;
Jahr++;
System.out.println("\nJahr: " + Jahr);
System.out.println(" Jahreszinsen:" + f.format(jahreszinsen));
System.out.println(" Jahrestilgung:" + f.format(jahrestilgung));
System.out.println(" Restschuld: " + f.format(restschuld));
// daten1 [Jahr] = jahreszinsen;
// daten2 [Jahr] = jahrestilgung;
// daten3 [Jahr] = restschuld;
// JOptionPane.showMessageDialog(gt,"\nJahr"+ Jahr + "\n Jahreszinsen: " + f.format(jahreszinsen) + "\nJahrestilgung :" + f.format(jahrestilgung) +" \nRestschuld: " + f.format(restschuld) , "Berechnet", JOptionPane.INFORMATION_MESSAGE);
// JOptionPane.showMessageDialog(gt,daten[Jahr] , "Berechnet", JOptionPane.INFORMATION_MESSAGE);
// JOptionPane.showMessageDialog(gt, daten1[Jahr], "Berechnet", JOptionPane.INFORMATION_MESSAGE);
}
JOptionPane.showMessageDialog(gt, daten1[Jahr], "Berechnet", JOptionPane.INFORMATION_MESSAGE);
}
 
Es gibt hier im Forum auch Code-Tags (Symbol: </>).
Du befüllst dein Array aktuell nicht, sollte das nicht in der Schleife passieren?
Außerdem erstellst du Arrays mit der Größe von "Jahr" und erhöhst Jahr im Anschluss, bevor du es verwendest, um (zum Glück auskommentiert) wieder auf die Arrays zuzugreifen.
Das kann nur daneben gehen. (Bsp: new double[1997], dann folgt ein Zugriff auf den Index 1998, was nie klappen kann, der maximal gültige Index ist 1996)

Beschreibe mal mit Worten, was dein Programm überhaupt machen soll (den kompletten Ablauf).
Was kommt als erstes, was kommt danach, welche Zwischenergebnisse willst du notieren? Was soll wann ausgegeben werden? Was während der Schleife, was nach der Schleife?

Falls das keine Schulaufgabe ist, solltest du dir eine Klasse definieren, in der alle Informationen über ein Jahr gespeichert werden (Restschuld, was auch immer).
Dann kannst du eine LinkedHashMap (Integer, Datenklasse) verwenden, um die Daten pro Jahr zu speichern und später abzurufen. (map.get(1997).getRestSchuld())
Auf diese Weise musst du dich nicht mit Arrays und Indizes rumschlagen.
 
wow das ging flot mit antworten. Also ich habe eine oberfläche erstellt wo man Darlehensbetrag, Zinssatz und Tilgugssatz eingibt, über ein Button entscheidet man dann ob Jährlich oder Monatlich. In der Funktion wird durch die While schleife eifnach nur errechnet was man jährlich zahlt und das bis man auf 0 restschuld ist. Ich möchte das es mir in einer Anzeige komplet von Jahr 1 bis Jahr xy angezeigt wird.

[CODE lang="java" title="Nochmal der code mit der Schleife" highlight="22"]public void RechnerJahr(double Darlehensbetrag, double Zinssatz, double Tilgungssatz) {

Gui_Tilgungsrechner gt = new Gui_Tilgungsrechner();
jahresrate = Darlehensbetrag * (Zinssatz + Tilgungssatz) / 100 ;
restschuld = Darlehensbetrag;



while(restschuld > 0.0) {
jahreszinsen = Zinssatz / 100 * restschuld;
jahrestilgung = jahresrate - jahreszinsen;
if(jahrestilgung >= restschuld) {
jahrestilgung = restschuld;
}
restschuld = restschuld - jahrestilgung;
Jahr++;
System.out.println("\nJahr: " + Jahr);
System.out.println(" Jahreszinsen:" + f.format(jahreszinsen));
System.out.println(" Jahrestilgung:" + f.format(jahrestilgung));
System.out.println(" Restschuld: " + f.format(restschuld));
//Hier dan der stelle muss ich jedes mal auf ok klicken das die Schleife weiter läuft.
JOptionPane.showMessageDialog(gt,"\nJahr"+ Jahr + "\n Jahreszinsen: " + f.format(jahreszinsen) + "\nJahrestilgung :" + f.format(jahrestilgung) +" \nRestschuld: " + f.format(restschuld) , "Berechnet", JOptionPane.INFORMATION_MESSAGE);

}

}[/CODE]

Danke für den Tipp mit dem zwischen speichern in der Klasse ich schau mal wie ich das machen kann 🙂.
 
Du willst doch seine Ergebnisse auf der GUI ausgeben dazu solltest du dir mal JList anschauen.
Du willst doch nicht auf der Konsole ausgeben hast du jedenfalls am Anfang gesagt.
 
was mich zum Ausrasten bringt: D
Woran erkennt man den Arbeitsplatz eines Entwicklers?
An den Bissspuren in der Tischplatte.

Es gibt ja verschiedene Mögilchkeiten, aber eine Liste ist schon mal gut. Was auch nicht schlecht wäre, wäre ein Objekt, das Dir eine "Zeile" in Deiner Tabelle darstellt. Wenn das zu hoch ist, dann nimmst Du halt einfach ein Array und steckst das in die Liste. Das Interface List hat eine add-Methode und als Implementierung kannst Du z. B. ArrayList verwenden.
 
Beispielsweise so:
Java:
List<String[]> zeilen = new ArrayList<>();
while ( ... ) {
    String[] zeile = new String[]{
        Integer.toString(jahr),
        f.format(jahreszinsen),
        f.format(jahrestilgung),
        f.format(restschuld)
    };
    zeilen.add(zeile);
}
Wie oben schon geschrieben: schöner wäre es, wenn Du für die Zeile kein Array sondern eine eigene Klasse verwenden würdest.
 
Jo, ich danke dir. Ja ich mach das erst mal so dann schaue ich mir mal morgen an wie ich das in eine klasse packe und von da alle daten in die liste packen kann, hatte ja oben den tipp mit LinkedHashmap 🙂
 
[CODE lang="java" title="Funktioniert leider nicht" highlight="1"]List<String[]> zeilen = new ArrayList<>();
while ( ... ) {
String[] zeile = new String[]{
Integer.toString(jahr),
f.format(jahreszinsen),
f.format(jahrestilgung),
f.format(restschuld)
};
zeilen.add(zeile);
}
[/CODE]

Zeile eins wird wird mir als fehler angezeigt 🙁
 
Du musst die Klassen schon importieren:
Java:
import java.util.ArrayList;
import java.util.List;
über der Klasse einfügen.
 
jo bei mir wurde eine andere List importiert 🙂.... aber jetzt kommt der fehler: The method toString(double) in the type Double is not applicable for the arguments (String, String, String)


[CODE lang="java" highlight="21"] List<String[]> zeilen = new ArrayList<>();
// Gui_Tilgungsrechner gt = new Gui_Tilgungsrechner();
jahresrate = Darlehensbetrag * (Zinssatz + Tilgungssatz) / 100 ;
restschuld = Darlehensbetrag;



while(restschuld > 0.0) {
jahreszinsen = Zinssatz / 100 * restschuld;
jahrestilgung = jahresrate - jahreszinsen;
if(jahrestilgung >= restschuld) {
jahrestilgung = restschuld;
}
restschuld = restschuld - jahrestilgung;
Jahr++;
System.out.println("\nJahr: " + Jahr);
System.out.println(" Jahreszinsen:" + f.format(jahreszinsen));
System.out.println(" Jahrestilgung:" + f.format(jahrestilgung));
System.out.println(" Restschuld: " + f.format(restschuld));
String[] zeile = new String [] {
Double.toString(f.format(jahreszinsen), f.format(jahrestilgung), f.format(restschuld))
};
zeilen.add(zeile);
// JOptionPane.showMessageDialog(gt,"\nJahr"+ Jahr + "\n Jahreszinsen: " + f.format(jahreszinsen) + "\nJahrestilgung :" + f.format(jahrestilgung) +" \nRestschuld: " + f.format(restschuld) , "Berechnet", JOptionPane.INFORMATION_MESSAGE);

}

}[/CODE]
Ich bin leicht überfordert 😀
 
omg isso 😀 ich hab es falsch gelesen.... Ich danke dir :*....
jetzt kann ich doch alles ganz einfach in eine Txt-Area einfügen für die oberfläche oder
 
omg isso 😀 ich hab es falsch gelesen.... Ich danke dir :*....
jetzt kann ich doch alles ganz einfach in eine Txt-Area einfügen für die oberfläche oder
Jetzt hast Du erstmal eine Liste mit den "Zeilen".

Die kannst Du jetzt nehmen, um z. B. die Zeilen zu einem String zu formatieren und diesen in eine JTextArea einzufügen oder als HTML in ein JLabel oder um daraus ein TableModel für eine JTable zu erzeugen bzw. in das DefaultTableModel einzufügen usw.
 
Noch ein Beispiel für die Ausgabe als Tabelle in einer JOptionPane:
Java:
void zeigeErgebnisse(List<String> zeilen) {
    String[] spalten = {"Jahr", "Jahreszinsen", "Jahrestilgung", "Restschuld"};
    String[][] daten = zeilen.toArray(new String[0][]);
    JTable tabelle = new JTable(daten, spalten);
    JOptionPane.showMessageDialog(null, new JScrollPane(tabelle));
}
 
bei der Zeile 3 mit
String[][] daten = zeilen.toString(new String[0][]);

kommt wieder die meldung: The method toString() in the type Object is not applicable for the arguments (String[][])
 
Sorry, das war ein Vertipper, den ich sofort korrigiert hatte. Da warst Du schneller als ich 🙂 Das musste natürlich toArray und nicht toString heißen 🙂
 
Nichts zu entschuldigen, ich hab sogar toArray gemacht und dachte mir neen mach lieber zurück mihe hat das bestimmt richtig. 😀...Habe mehr vertraun in dich als in Eclipse
 
Mihe sry das ich dich so sehr nerve aber es funktioniert einfach nicht 🙁 .
[CODE lang="java" title="guck ich hab das so gemacht"] public void zeigeErgebnisse(List<String> zeilen) {


String[] spalten = {"Jahr", "Jahreszinsen", "Jahrestilgung", "Restschuld"};
String[][] daten = zeilen.toArray(new String[0][]);

System.out.println(spalten);
System.out.println(daten);
}
[/CODE]

und dann in einer anderen klasse wo meine oberfläche ist, versuche ich es so

Java:
        Jahresrechner jr = new Jahresrechner();

        tabelle = new JTable(jr.zeigeErgebnisse(date), jr.zeigeErgebnisse(spalten);
        tabelle.setBounds(268, 182, 123, 68);
        JOptionPane.showMessageDialog(null, new JScrollPane(tabelle));
        contentPanel.add(tabelle);
 
und dann in einer anderen klasse wo meine oberfläche ist, versuche ich es so
Genau deswegen haben wir eine List, damit wir Berechnung und Ausgabe schön voneinander getrennt haben. Dein UI holt sich also die Zeilen und kümmert sich dann um die Ausgabe. Die Methode zeigeErgebnisse war nur ein Beispiel, kannst Du aber testweise in Deinem UI genauso verwenden.
 
Die oben erwähnte Linkedhashmap dient nur dazu, dass du zu jedem Jahr direkt einen passenden Eitnrag (oder auch nicht, sofern nicht vorhanden) findest. Du kannst natürlich auch mit einer Liste arbeiten und das Jahr in die Datenklasse schreiben.
Was du wirklich NICHT zun solltest, ist Arrays zu verwenden, in denen die einzelnen Einträge gespeichert werden.
Da kriegst du alle möglichen Schwierigkeiten mit Indizes. Wenn du z.B. das Jahr als Index verwendest, haben alle Felder vor dem Startjahr keine Daten (und es gibt kein Jahr 0).
Außerdem müsstest du schon vorher abschätzen, wie hoch der höchste benötigte Index sein wird.
Arbeitest du mit Listen oder Maps, stellen sich diese Fragen nicht. Schlimmstenfalls musst du halt mal die Liste anhand des Jahres sortieren.
 
Warum ist das nur so kompliziert 😀. Ich wollte eifach nur das in einem Fenster alles angezeigt wird was ich in einer anderen Klasse in einer While schleife ausrechen.
 
Die Anzeige ist der einfache Teil. Ob nun Panel oder Kommandozeile ist kein großer Unterschied.
Dein Problem ist nur, dass die Anzeige nicht während der Berechnung stattfinden soll, sondern später.
Das heißt, du musst erst mal alle deine anzuzeigenden Daten in einer passenden Struktur sammeln.

Es gäbe noch die eine oder andere Hack-Methode, um direkt den Text zu generieren, aber das hätte keinen erzieherischen Wert 😀, außerdem wären die Daten nicht weiterverwendbar. Lieber gleich UI von Logik trennen.
 
Ihr sagt das alles einfach. Ich erstelle ja meine Liste in der Schleife aber wenn ich dann auf die Klasse mit der Oberfläche gehe mit eine JTable erstell kann ich einfach nicht drauf zugreifen auf die Liste in der anderen Klasse. Ich hab irgendein hänger im kopf das ich es nicht schaffe.....
 
Du musst deine Daten natürlich an die Anzeigeklasse weiterleiten.
Hier etwas Code, der dir eine Idee davon vermitteln soltle, wie man es machen kann.
edit: und sorry, normalerweise programmiere ich mit englischen Ausdrücken, die verwendete Sprache mag also immer wieder wechseln.

Java:
class MainClass {
    public static void main(String ...) {
        //TODO: Eingaben sammeln
        List<JahresDaten> list = new ArrayList<>();
        while (...) {
            //TODO: Berechnung durchführen
            JahresDaten entry = new JahresDaten();
            entry.setRestSchuld(...);
            //TODO: Die in diesem Beispiel noch nicht definierten Felder (die du also noch hinzufügst) ebenfalls befüllen.
            list.add(entry);
        }
        datenAnzeigen(list);
    }
 
    private static void datenAnzeigen(List<JahresDaten> list) {
        //Diese beiden braucht's nur, falls man mit Arrays arbeitet, hier verwende ich aber Vector.
        //int nRows = list.size();
        //int nColumns = ...;
     
        //Vector ist veraltet, ich hab mir hierfür mal ein Tablemodel geschrieben, das mit ArrayList arbeitet.
        //Funktioniert aber so weit und ist angenehmer zu handhaben als ein Array.
        Vector<Vector> data = new Vector<>();
        for (JahresDaten entry : list) {
            Vector row = new Vector();
            row.add(entry.getRestSchuld());
            row.add(...);
            //TODO: Alle anzuzeigenden Daten der Zeile hinzufügen
            data.add(row);
        }
        JTable table = ...;
        Vector<String> columnNames = ...;
        table.setModel(new DefaultTableModel(data, columnNames));
        JOptionpane pane = .....;
        //Table dem jOptionPane zuweisen;
        //pane anzeigen
    }
}
class JahresDaten {
    public double getRestSchuld() {
        return restSchuldthis.;
    }
    public void setRestSchuld(double value) {
        this.restSchuld = value;
    }
    //und was auch immer du sonst noch pro Jahr speichern willst.
    private double restSchuld;
}
 
Zuletzt bearbeitet:

Zurück
Oben