non-static Methode ausführen in statischen Kontext

ankmanu

Bekanntes Mitglied
Hi @ all,

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!

Wie kann ich also trotzdem invalidate ausführen??

Viele Grüße und danke schonmal für eure Antworten

manu
 
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.
 
Ich kann Action() nicht einfach nicht-ststisch machen(public void Action(){}), weil andere Methoden darin statisch sein müssen!

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.

P.S.:
Methoden sind übrigens immer klein.
Da hat er völlig recht! Damit meint er die Namen. Nicht "Action" sondern "action" bitte, das ist eine Konvention.
 
Zuletzt bearbeitet:
Sowas hier wird nicht klappen:
Java:
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ß.

EDIT: Zu langsam xD
 
Zuletzt bearbeitet:
okay, jetzt hab ich mal folgendes gemacht:
Java:
public static void action() {      
...
invalidate();
...
}
Problem: bei invalidate(): non-static method invalidate can not be referenced from static context.

Muss ich dann erst ein Objekt erzeugen oder wie geht das?

Viele Grüße
manu
 
Zuletzt bearbeitet:
Hi nochmal,

wenn ich folgendes schreib:
Java:
public static void action(Object o) {      
...
o.invalidate();
...
}
dann klappt das erstmal! Aber wie muss ich dann Action aufrufen??

mit action(o) geht das ja nicht... Ich muss das Object doch irgendwie definieren?

Viele Grüße
manu
 
Hi,

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.
 
Hi,

sorry, aber ich kriegs einfahc nicht hin:

der Klassenname ist name
der name der methode ist action

es geht weder mit
Java:
name.invalidate();
--> Fehler: non-static variable ... couldnt be referenced...
noch mit
Java:
action.invalidate();
--> Fehler: cannnot find symbol

Wie kann ich das Problem denn lösen?

Viele Grüße
manu

EDIT: wenn ich es so schreibe:
Java:
public static void action(name o){
...
o.invalidate();
...
}
dann geht es auch nicht!

Wie muss ich denn dann action(???) aufrufen?

Grüße
manu
 
Zuletzt bearbeitet:
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.
 
Dachte du wolltest Action() aufrufen. Naja wenn das in der Klasse drinnen ist, dann solltest du nichts dazu schreiben:

Java:
public static void action(Object o){
    //...
    invalidate();
    //...
}

Aber du brauchst invalidate() static machen ... z.B.:

Java:
public static void invalidate() {

}
 
Tut mir Leid , die ganze Klasse ist zu lang...

aber stark gekürzt:

Java:
public class RobProgMAIN extends JFrame implements ActionListener 

{
...
public static void main(String[] argv)                                          /**MAIN*/
{
final RobProgMAIN mainApp;
mainApp = new RobProgMAIN();
}
public RobProgMAIN()
{
...
}
public static void testa(){
...
try {
System.out.println("DFish : started");
SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        
       action();
      }
});


// System.out.println("okok");
}
catch(FishFaceException eft) {
fehlerl.setText(fehlerl.getText()+ eft);
fehler.setVisible(true);  
}
}
public static void action(){
...
invalidate();
...
}
}

Viele Grüße
manu
 
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.

Viele Grüße
manu
 
So sehr viel mehr kann man aus dem letzten Code auch nicht erkennen. Es ist vielleicht wirklich am
einfachsten wenn du "invalidate()" static machst.
 
@ankmanu

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 🙂

Viele Grüße
manu
 
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
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben