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.
non-static Methode ausführen in statischen Kontext
ich hab mal wieder ein (wahrscheinlich sehr kleines ) Problem:
Mein Code sieht gekürzt so aus:
Java:
public static void Action() {
...
invalidate();
...
}
Das Problem liegt darin, dass die Methode invalidate(); nicht-statisch ist, Action() aber schon. Ich kann Action() nicht einfach nicht-ststisch machen(public void Action(){}), weil andere Methoden darin statisch sein müssen!
Wenn du invalidate() aufrufen willst, dann kannst du sie auch einfach statisch machen. Das muss dann funktionieren oder du hast einen Logikfehler drinnen. Methoden sind übrigens immer klein.
Macht doch nix! Du kannst in nicht-statischen Methoden statische Methoden jederzeit aufrufen. Genau das heisst ja statisch: Du brauchst keinen Kontext (Objekt), du kannst sie überall per KlassenName.methode() aufrufen. (Sofern sie sichtbar sind, siehe public, private usw).
Nur andersrum funktioniert es nicht, falls du kein Objekt hast, weil nicht-statisch eben heisst es hängt ab von einem Objekt.
Wenn invalidate() nicht-statisch sein muss weil es sich auf Objekte bezieht, dann übergib der Methode doch das Objekt sofern du es an der Stelle des Aufrufes hast:
Java:
public static void action(YourObject o) {
...
o.invalidate();
...
}
Wenn das auch nicht klappt hat mein Vorredner wohl recht mit der Annahme, dass du dich da einfach in nen Design-Schlamassel reingecodet hast Dann musst du das ganze nochmal überdenken und überlegen was statisch sein muss, was nicht, und wie du Objekte an eine Stelle bekommst wo du sie brauchst.
public class Stuff {
public static void main(String[] args) {
Stuff s = new Stuff();
s.yay();
}
public void yay() {
System.out.println("yay!");
}
public static void something() {
yay(); //Problem! Wessen yay() soll das sein? yay() muss ja von einem Objekt aufgerufen werden!
}
}
Es ist allerdings kein Problem, wenn du eine nicht-statische Methode machst und darin andere statische Methoden (wie z.B. Math.round()) benutzt:
Java:
public void something() {
double d = 3.22;
int x = (int)(Math.round(d));
}
public static void main(String[] args) {
s.something();
}
Hast du dein [c]Action[/c] btw. tatsächlich so genannt? Methodennamen schreibt man immer klein, Klassennamen immer groß.
in deinem vorherigen Code hast du "invalidate()" einfach so aufgerufen, von daher geh ich mal davon
aus das die Methode in derselben Klasse ist wie "action()". Das bedeutet, das du in deinem letzten
Code-Beispiel eben die Klasse nehmen kannst/musst anstatt "Object".
Java:
public static void action(<KlasseInDerDieMethodenStehen> o){
...
o.invalidate();
...
}
Das setzt natürlich voraus, das du ein Objekt von der Klasse hast wenn du "action()" aufrufst.
Du solltest vielleicht mal mehr Code zeigen, es ist ziemlich schwierig nachzuvollziehen, worauf sich deine Fehlermeldungen genau beziehen. Poste wohl am besten mal die ganze Klasse, damit man sich einen Überblick verschaffen kann.
Du solltest dir vielleicht erst einmal die Grundlagen aneignen, ehe du mit GUI-Programmierung, Multithreading und dem ganzen Kram herumwerkelst…
Schnapp dir ein gutes Tutorial, mit dem du schrittweise Java lernen kannst, und lerne die Dinge aufeinander aufbauend. Es bringt nichts, wenn du das fünfte Stockwerk bauen willst, ehe das Fundament steht
das ist mir schon klar, und ich weiß dass ich mich noch einarbeiten muss, die Sache ist nur die, dass ich dieses Programm bis in 4 Wochen komplett fertig haben muss...
Also wäre es schn, wenn ihr mir dort helfen könntet und ich mich dann nochmal um die Grundlagen (Tutorials) kümmere.
Klick mal den Link in meiner Signatur.
Damit solltest du die wichtigsten Dinge relativ schnell drin haben.
Nochmal zum static/non-static:
Wenn etwas nicht statisch ist (egal ob Methode oder Variable) heisst es, dass es sich auf ein Objekt bezieht. Weisst du was ein Objekt ist? Als Objekt bezeichnet man Daten von einem komplexen Datentyp, salopp ausgedrückt alles was ein Konstrukor zurückliefert:
Java:
MyClass object1 = new MyClass();
MyClass object2 = new MyClass();
Wenn eine Variable nicht-statisch in der Klasse definiert ist bedeutet das, das jedes einzelne Objekt einen eigenen Wert dafür hat. Sagen wir "MyClass" hat eine Variable:
Java:
class MyClass{
int var; // nicht-statisch
}
die ist nicht-statisch, das heisst der Wert var von object1 könnte 19 sein, der von object2 vllt 54.
Deshalb kannst du ohne ein konkretes Objekt - d.h. im statischen Kontext - nicht wissen was der Wert ist:
Java:
System.out.println( MyClass.var ); // <- ist das nun 19 oder 54? Das weiss man nicht daher geht das nicht
Du musst also ein Objekt haben:
Java:
System.out.println( object1.var ); // ok, Wert ist 19
So, und jetzt musst du dir nur eine Frage stellen:
Was auch immer deine invalidate() Methode macht: Ist sie irgendwie abhänig vom Objekt? Verändert oder benutzt sie irgendetwas, das sich bei verschiedenen Instanzen (=Objekten) der Klasse unterscheiden kann? Wenn das nicht der Fall ist und sie tut eh immer nur das selbe, unabhängig von einem bestimmten Objekt, kannst du sie static machen, und damit sind deine Problem gelöst.
Brauchst du aber Infos von einem bestimmten Objekt, muss sie nicht-statisch sein.
In dem Fall musst du ein Objekt haben bevor du sie aufrufen kannst.
Und ja, das musst du natürlich vorher erstellen wenn du es zB in die action() Methode reinreichen willst.
Ob du jetzt solche Instanzen deiner Klasse brauchst oder nicht lässt sich nicht sagen solange man nicht versteht was du da eigentlich programmieren willst.
okay, der sinn des ganzen war, ein vorhandenes JFrame zu aktualisieren, weil zum Beispiel bestimmte Texte in Textfelder nicht mehr eingefügt wurden...
Um das Fenster zu aktualisieren, habe ich gegoogelt und gefunden, dass es eigentlich mit invalidate(); gehen müsste, das Fenster zu aktualisieren. Doch als ich das einfügte, kam eben der non-static/static Fehler. Und dafür wollte ich nun eine Lösung/Erklärung haben.
Ich weiß nicht ob es hilft, aber vielleicht gibt es ja auch eine andre Möglichkeit, das Fenster zu aktualisieren...
Wenn ich Code posten soll, dann mach ich das morgen. (hab jetzt keine zeit mehr). Das Programm geht einfach bis Zeile XY und in Zeile XY+1 steht dann etwas wie textPane3.setText("texttest"); , aber dieser Text erscheind nicht mehr!!!
Wie gesagt, morgen werde ich Code posten, aber wenn schon jemand helfen kann, dann gerne
Ja ok, invalidate() von JFrame ist eine nicht-statische Methode. Du kannst das auch nicht ändern, weil du die Methode ja nicht selber geschrieben hast sondern nur aus der Bibltiothek verwendest.
Also musst du sie halt auf deinem JFrame aufrufen:
Java:
myFrame.invalidate();
Hast du dir das Frame überhaupt in eine Variable abgespeichert?
Java:
JFrame myFrame = new JFrame();
Jetzt musst du den Methoden-Aufruf halt an eine Stelle packen, wo du Zugriff auf die Variable "myFrame" hast. Da gibt's mehrere Möglichkeiten.
1) Du deklarierst die Variable "global", d.h. zB als Klassenvariable
Java:
class MyProgram{
JFrame myFrame;
public static void main(String[] args){
myFrame = new JFrame();
//...
}
// ...
public void action(){
myFrame.invalidate();
}
}
2) wenn jetzt deine action-Methode keinen direkten Zugriff drauf hat, zB weil sie in ner ganz anderen Klasse liegt, musst du ihr das Fenster halt als Parameter übergeben, so wie ich es ein paar Posts vorher gezeigt hatte.
Dann musst du natürlich nach wie vor die action() Methode von einem Ort aufrufen, wo du Zugriff auf das Frame hast. ISt also eig. der gleiche Fall wie 1) nur halt über einen Umweg.
So, abgesehen davon:
- Wenn man es richtig macht aktualisiert sich die GUI immer automatisch, aber das ist jetzt n ganz anderes Thema das ich nich anschneiden möchte (Falls du googlen willst: Stichwort "EDT")
- invalidate() ist auch nicht wirklich die richtige Methode für dein Vorhaben. Statt invalidate auf dem frame solltest du erstmal ein repaint() auf dem textfeld versuchen