Müssen globale Funktionen immer "static" sein?

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo!
Ich brauche in einer Klasse den erzeugten Frame von einer anderen Klasse. Also habe ich in meiner Frame-Klasse folgenden Code:
Code:
public JFrame getFrame() {
    return this;
}

In der Klasse, in der ich den Frame haben möchte, rufe ich die Funktion getFrame() auf und will den return-Wert in einer Variablen abspeichern:
Code:
private JFrame frame = blub.getFrame();
Und jetzt die Fehler-Meldung:
blub.java:9:30: non-static method getFrame() cannot be referenced from a static context
Ich habe zwar nirgendwo einen "static context" aber was solls. Zumindest weiß ich jetzt nicht, wie ich den Frame in die andere Klasse bekommen kann. Wenn ich die Methode getFrame() statisch mache, dann kommt die Fehlermeldung, dass "this" nicht statisch ist, und wenn ich die Variable "frame" statisch mache, kommt die gleiche Fehlermeldung wie oben. Was kann ich tun?
 
> Was kann ich tun?
mehr Code posten und/ oder genauer den Fehler erkären,
ich kann mir tatsächlich gar nicht vorstellen, wie die diesen Fehler bekommst,

denn
> private JFrame frame = blub.getFrame();
klinkt ja wirklich nicht nach static 😉

was ist eigentlich das ominöse blub?

---------

bei mir gibts jedenfalls keine Fehler

Code:
public class TestGUI
    extends JFrame
{
    public TestGUI()
        throws Exception
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 400);
        setVisible(true);
    }

    public JFrame getFrame()
    {
        return this;
    }

    public static void main(String[] args)
        throws Exception
    {
        TestGUI blub = new TestGUI();
        JFrame frame = blub.getFrame(); // klappt
    }
}


class A
{
    private TestGUI blub = null;
    private JFrame frame = blub.getFrame(); // klappt (aber besser nicht laufen lassen ;) )

}
 
Hier mal mehr Code:

Code:
public class blub {
  private int ID;
  private static Button ersterButton;
  private static Button zweiterButton;
  private static int anzahlUmgedreht;
  private JFrame frame = TestGUI.getFrame()
}
Code:
public class TestGUI extends JFrame {
  // Anfang Variablen

  // Ende Variablen

  public TestGUI(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 600;
    int frameHeight = 610;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2 ;
    setLocation(x, y);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten   
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Ereignisprozeduren
  public Memory getFrame() {          //Hier ist die Methode getFrame(). Der restliche Teil ist eine Vorlage.
    return this;
  }


  // Ende Ereignisprozeduren

  public static void main(String[] args) {
    new TestGUI("TestGUI");
  }
}
 
so machst schon mehr Sinn, da hatte ich die Fehlermeldung falsch verstanden,
sie besagt, dass du eine nichtstatische Operation nicht direkt an der Klasse aufrufen kannst,
sondern nur an Objekten (siebe mein Testprogramm mit den Objekten blub)

ist doch klar, was soll als this zurückgegeben werden wenn du das an einer Klasse aufrufst?
du sagst es ja selber..
 
Aber ich kann doch in der Klasse "blub" nicht folgenden Code ausführen lassen:
Code:
TestGUI testgui = new TestGUI("TestGUI");
private TestGUI frame = testgui.getFrame();
Ich brauche den Frame nämlich in einem Button, um den Hintergrund zu ändern. Und dann hätte jeder Button sein eigenes JFrame.
 
ich erklärte dir nur die Fehlermeldung,
was dein Programm so machen sollte weiß ich spontan nicht..

da musst du schon weiter ausholen
 
Dann hier mal die komplette Klasse:
Code:
public class Karte extends JToggleButton {
  private int ID;
  private static Karte ersteKarte;
  private static Karte zweiteKarte;
  private static int anzahlUmgedreht;
  TestGUI testgui = new TestGUI("TestGUI");                      //wäre unsinnig
  private TestGUI frame = testgui.getFrame();

  public Karte(int ID, int xcor, int ycor, int breite, int hoehe) {
    setBounds(xcor, ycor, breite, hoehe);
    this.ID = ID;
    addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        aufdecken();
      }
    });    
  }

  public void aufdecken() {
    Icon icon = new ImageIcon(getClass().getResource("img/1.jpg"));
    if(anzahlUmgedreht == 0) {
      ersteKarte = this;
      setIcon(icon);
      anzahlUmgedreht++;
    } else {
      setIcon(icon);
      frame.update(frame.getGraphics());                        //hier wird der Frame benutzt
      zweiteKarte = this;
      if(ersteKarte.getID() == zweiteKarte.getID()) {
        deaktivieren();
      } else {
        zudecken();
      }
    }
  }
 
frame.update(frame.getGraphics());
ist ja ein grausiger Befehl, reicht nicht
frame.repaint()?

auf jeden Fall muss das ja eine bestimmte einzelne GUI sein,
die irgendwo im Programm schon existiert,
diese muss dem neuen Button als Parameter über geben werden

z.B.
Code:
private JFrame frame;

public Karte(JFrame frame, int ID, ...) {
  this.frame = frame;
}
also: nicht durch irgendwelche obskuren Operationen eigenständig das JFrame holen (woher auch?)
sondern schlicht als Parameter übergeben,

dann hat natürlich der Aufrufer das Problem, aber der ist hoffentlich das JFrame oder kennt zumindest das JFrame?
denn irgendwie muss ja der fertige Button auch in das JFrame eingefügt werden..
 
Wenn Du eine Referenz auf Deinen JFrame haben willst mache es doch so:

Definiere in Deiner Klasse TestGUI ein Feld:

Code:
private static TestGUI testGUI;

im Konstruktor von TestGUI:

Code:
testGUI = this;

und dann:

Code:
public static TestGUI getFrame() {         
    return testGUI; 
  }


Dann brauchst Du nur noch:

Code:
TestGUI.getFrame();

und Du hast eine Referenz auf Deinen JFrame
 
wobei mir das ganze nicht nach dem klassischen schema eines singletons aussieht...

was passiert, wenn der Konstruktor noch nie aufgerufen wurde, und aber doch die getFrame()-methode ?!?
 
Meiner Meinung nach ist deine ganze Logik falsch. Warum hast du in der Klasse Karte bei Variablen für Karte?

Ich würde mal schätzen, wenn ich mir deine Klasse so ansehen, dass du ne Art Memory-Spiel willst. Dazu wäre es sinnvoll einen Frame anzulegen und auf diesem die Objekte zu plazieren und nicht die Elemente irgendwie untereinandern zu verknüpfen, sondern das ganze von einer Hauptklasse steuern zu lassen.
 
static ist eine Eigenschaft einer Variablen oder einer Operation,
sie sind dann einer Klasse und keinem Objekt dieser Klasse zugeordnet,

siehe Lehrbuch
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben