Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
static String Variable wird nur beim ersten aufruf durch eine Funktion geändert.
ich bin ganz neu in Java und brauche mal dringend eure fachkundige Hilfe.
Kurz zu meinem Code:
Ich habe ein Programm geschrieben, das einen POST-Request macht und die Ausgabe in eine Datei schreibt. Diese Datei wird dann in einen String eingelesen und aus diesem String bestimmte Teile in static String variablen gespeichert. Diese werden danach auf einer GUI auf JLabeln dargestellt.
Nun zur Problemdarstellung:
Nach dem Klick auf einen JButton soll das HTML-File neu erzeugt werden, die Strings geändert und die JLabel mit den neuen Werten initialisiert werden.
Es stellt sich mir nun das Problem, das ich nach 2 Tagen rumprobieren auf das Folgende reduzieren konnte.
Nach dem Programmstart wird der static String outputstring in der Funktion
static void datareturn(String startsubstring, String endsubstring,
String datastring, int qm, int pos)
nicht neu initialisiert.
Bitte entschuldigt falls der Code schwer zu lesen ist. Wahrscheinlich ist er auch nicht besonders objektorientiert. Ich kenne mich zwar mit C einigermaßen aus aber in Java bin ich absolut neu.
Ich habe meine GUI.java einfach mal hochgeladen. Wenn ich an meinem Post hier noch etwas verbessern kann sagt es mir bitte.
Hinweis: Programmierumgebung Eclipse auf Kali-Linux
Ich hoffe ihr könnt mir helfen. Vielen Dank schonmal im Voraus.
Niemand schaut sich gerne 1k Zeilen Javacode in einer Klasse an, die nicht mal groß kommentiert sind. Und die ganzen Wiederholungen im Code sind echt brutal. Und warum benutzt du fast alles auf statischer Ebene?Ziel ist es meines erachtens so wenig statisch zu programmieren wie möglich.
Und warum hast du so extrem viele JPanels? Da steht was von Abstandshalter, aber JPanels werden eigentlich nicht als Grenzen oder ähnliches genutzt.
Also ich empfehle dir erst mal den Code weiter zu reduzieren, mehr mit Schleifen zu arbeiten um wiederholende Schritte zu ein paar Zeilen so quetschen.
Also ich kann jedenfall auf Anhieb den Fehler nicht erkennen, vielleicht sieht jemand anderes mehr.
EDIT: kleiner Hinweis: System.out.println("blabla"); macht das selbe wie System.out.print("blabla");
System.out.print("\n");
Ok. Ich bin wie gesagt Anfänger. Die Panels gebrauche ich für meine Gui um die Abstände der einzelnen Elemente zu definieren. Aber die sind vermutlich mittlerweile überflüssig. Das "blabla" war zum testen ist wohl noch übergeblieben. Zum static hat mich eclpise mehr oder weniger genötigt. Kannst du mir vielleicht anhand eines Beispiels erklären was ich anstelle des Static benutzen kann?
http://www.java-tutorial.org/swing.html
Mit der Seite habe ich mich früher in Swing eingarbeitet.
Bezüglich dem Jpanel ist unter dem Stichwort Layoutmanager einiges erklärt wie man eine Gui anordnet mit seinen Komponenten.
Weisst du denn wie man eine neue Klasse in Java erstellt? Welche IDE(Entwicklungsumgebung) benutzt du?
Eine neue Klasse erstellst du in Java ähnlich wie eine Header-Datei in C, nur ohne Include.
Das System.out.print("blabla") war zufällig gewählt. Ab Zeile 802 benutzt du permmanent zwei Zeilen für den System.out.print statt System.out.println zu nutzen, das in eine Zeile geht.
oder du benutzt System.out.print("blabla\n") oder System.out.print(1234+"\n");
Wollte dir nur bewusst machen dass man bei solchen Kleinigkeiten gegenwirken muss um den Code zu überschaubar wie möglich zu machen.
Ok danke für den Tipp. das mit dem println hatte ich gerade auch schon herausgefunden, nur noch nicht überall geändert. Primär kommt es mir aber auf die Lösung meines reinitialisierungsproblems an. Hast du da eine Idee woran das liegen könnte?
Beim Programmstart funktioniert das ja alles. Nur danach stehen im "outputstring" immer wieder die gleichen werte. als ober der nicht überschrieben werden könnte.
Ich Entwickle mit eclipse falls du das meintest. Neue Klasse anlegen hab ich vorher leider noch nicht
Damit wird die funktion aus der Funktion refreshgui heraus ja aufgerufen. Ich habe nicht speziell geprüft ob die übergabe dafür funtioniert, aber da das für den Datenstring aus dem ich meine Werte hole auch funktioniert hat gehe ich mal davon aus.
Oder unterscheiden sich die beiden mal abgesehen vom Datentyp.
Mich verwirrt halt besonders, das es beim Programmstart funktioniert. (Dabei werden die gleichen Funktionen genutzt.)
Vielleicht hilft es wenn ich den Ablauf etwas verdeutliche.
1. Programmstart --> Funktion data() aufrufen (erzeugt das html-File ausgabe.html)
2. Funktion refreshgui() aufrufen --> kopiert inhalt aus datei in einen String.
--> ruft mit diesem String und Suchparametern die Funktion datareturn() auf welche für die jeweiligen parameter den gesuchten String in outputstring schreibt.
--> Variablen mit den jeweiligen Werte von outputstring initialisieren.
3. jetzt in der main -->Label mit den Variablen initialisieren
Nun der Ablauf für mein Problem
4. die Aktion des JButton refresh ruft wieder data() auf --> funktioniert noch
5. refreshgui wird aufgerufen --> der String wird neu initialisiert.
--> datareturn wird wieder aufgerufen !selbe suchparameter nur geänderter Datenstring ! (übergabe funktioniert hab ich in der Funktion datareturn() geprüft.)
--> variablen mit outputstring reinitialisieren !!! Funktioniert nicht!!! da outputstring nicht überschrieben wird.
6. Label initialisiern (im actionlistener des Buttons) --> getestet --> funktioniert.
Kannst du mit dem Debugger umgehen ? Dann würde ich mal durch die datareturn durchdebuggen. Oder
anderenfalls einfach mal die datareturn mit print-Ausgaben pflastern um zu sehen was da drin passiert. Denn diese ist ja die einzige Stelle wo outputstring verändert wird. Also wird sie entweder gar nicht aufgerufen oder darin läuft was falsch.
Ja mit dem Debugger komm ich klar das Problem ist aus irgendeinem Grund hat das Eclipse das ich auf meinem Linux benutze keinen sonst hätte ich da auch schon geguckt. Ich dachte das Problem wäre möglicherweise trivial z.B. fallscher Datentyp (das man da kein static für nutzen darf oder sowas).
Das mit den print hatte ich ja schon probiert. so hab ich ja erst rausgefunden, dass der Datenstring aktualisiert wird, der outputstring aber nicht.
Ich habe jetzt nur einen kurzen Blick reingeworfen.
Aber in der Methode "refreshgui" hängst du an die Variable "GUI.datastring2" laufend Daten an.
Beim 2. Aufruf setzt du sie aber nicht auf "", sondern hängst die neue Datei ebenfalls wieder an.
=> Die Variable wächst und deine "datareturn" Aufrufe finden immer die gleichen Daten am Anfang des Strings.
Generell stellst sich da die Frage, warum du datastring2 static und nicht als lokale Variable in der Methode deklarierst.
Dies ist sicher eines der beliebstesten (Anfänger-)Fehler
Sowas ist immer gefährlich!
Vor allem bei auftretenden Problemen sollte man solche Annahmen stets prüfen! Entweder im Debugger oder (notfalls) mit SysOut's !
Wenn eine solche Annahme nämlich NICHT zutrifft, suchst Du Dir ggf. 'einen Wolf' (sprich: an völlig falschen Stellen) ...
Ich hätte da jetzt spontan noch eine weitere Frage. Ich habe ein Problem mit der Darstellung von Umlauten unter Linux. Leider konnte ich nach durchforsteter Literatur und nach Befragung des Orakels keine passende Lösung für mich finden.
ich habe einen String in dem ein ü vorkommt. Unter Windows fluppt die Darstellung wie Sie soll aber eben nicht unter Linux. Da steht stattdessen ein �. Meine Distribution (Kali) nutzt den UTF-8 Standard. Unter meiner IDE (Eclipse) gibt es einen Fall, in dem Die Darstellung funktioniert und zwar wenn ich in der runconfiguration unter common encoding auf ISO-8859-1 setze. Das Funktioniert dann aber, (wie zu erwarten war) nach dem export des Jarfiles nicht mehr.
Ich habe diverse Beiträge darüber gelesen, das die JavaVM UTF-16 nutzt und vermute, das da das Problem liegt. Doch wie kann ich das lösen?