Von einem JinternalFrame auf ein anderes zugreifen!

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

Guest

Gast
Hallo Zusammen,
ich hab ein dickes Problem!
Ich habe eine Klasse die von JFrame erbt und somit dass Fenster bereitstellt, diese Klasse instanziert 2 andere Klassen die jeweils ein JinternalFrame erzeugen. Jetzt hab ich in dem einen JInternalFrame einen Button, der einen Text in dem anderen JInternalFrame ändern soll! Wie kann ich jetzt von dem einen instanzierten JInternalFrame auf das zugreifen? Ich hab das versucht mittels: JFramename.JInternalFramename.JLabelname.setText("Text") aber das funktioniert nicht!
Gruß Michi
 
Der eine JInternalFrame braucht in irgendeiner Weise eine Referenz auf den anderen.
Dazu kannst du bspw. eine Referenz in einem eigenen Konstruktor übergeben, oder in einer anderen Klasse einen getter bereitstellen.
 
Hi Wildcard,
danke für die schnelle Antwort!
Wie meinst du das mit Referenz? Kannst du bitte ein Beispiel (muss ja nicht lang sein!) posten? Wäre echt nett!
Gruß Michi
 
Code:
class Klasse1
{
    ...
    JInternalFrame frame1 = new JInternalFrame();
    JInternalFrame frame2 = new MyJInternalFrame(frame1);
}

class MyJInternalFrame extends JInternalFrame
{
 
    private JInternalFrame anotherFrame;
    
    public MyJInternalFrame(JInternalFrame anotherFrame)
    {
         this.anotherFrame=anotherFrame;
    }

    ....
        anotherFrame.doSomething();
}
 
Na du musst doch irgendwie auf das Objekt zugreifen können.
Dafür brauchst du eine Referenz auf dieses Objekt.
Wie du diese erhälst ist dabei nebensächlich.
Das ist nur eine Möglichkeit.
 
So kann man das 'theoretisch' zwar auch machen, aber als generellen Hinweis für zukünftiges Klassendesign:
Alle Variablen private machen.
Wann das nicht sinnvoll ist wirst du später selbst lernen 🙂
 
Hi,
ich will aber auf ein Label zugreifen und nicht auf eine Variable! Ich hab das Label aber nicht als public deklariert! Vielleicht war das der Fehler! Aber deine Lösung find ich besser, da muss man nicht die ganze Adresse zusammenbasteln sondern übergibt sie praktisch gleich mit!
Wegen des Klassendesign, ja ich denk auch dass es oft besser ist zu kapseln!
Gruß Michi
 
Auch die Referenz auf ein Label wird in einer Variablen gespeichert.
Wie gesagt: bis man weiß was man tut am besten mal alles private machen sonst gewöhnt man sich einig üble Dinge an :wink:
 
Hi,
was ich mich auch frag ist:
Ich hab eine Klasse die Variablen enthält. Diese Klasse instanziert ein JInternalFrame. Wie kann ich jetzt aus dem instanzierten JInternalFrame auf die Variablen der Klasse zugreifen?
Danke für die Antworten!
Gruß Michi
 
Z.B. indem du JInternalFrame erweiterst und die darin vorsiehst, dass die entsprechenden Daten übergeben oder gesetzt werden können. Auch solltest du dir mal MVC anschauen und über ein eigenes Daten-Modell nachdenken. Des weiteren lies nochmal nach, was es mit Variabeln und Klassen und so in Java auf sich hat.

Es ist immer etwas kompliziert, wenn man Fachbegriffe nicht korrekt benutzt. Das führt zu Verwirrung. Sind halt so die Einstiegshürden...
 
Was ist an "Datenmodell" unverständlich? Fällt in diesem Fall (Zugriff auf ein inezlenes Label) wohl flach, aber wir können ja schwer ahnen, was du da noch so treibst 😉

Wenn du schreibst "Hi, ich will aber auf ein Label zugreifen und nicht auf eine Variable!", dann ist klar, dass bei dir einige Begriffe noch nicht ganz sitzen. Mach dir nichts draus, am Anfang ist alles einfach nur ein riesiges undurchdringliches Chaos. Wenn man das mal durchdrungen hat, gilt das vor allem für zuvor geschriebenen Code.

Wenn ich Zeilen sehe, wo jemand mit zig Punkten auf eine Instanz zugreift, rollen sich schon die Fußnägel hoch. Aber da mussten wir mehr oder weniger alle mal durch.
 
Hi,
ich hab mir da jetzt was zusammengebaut:
ich hab drei Dateien:
RobotControl.java:
Code:
import javax.swing.*;
import java.awt.*;

public class RobotControl extends JFrame {
	private JDesktopPane desk;
	RobotControl() {
		this.desk = new JDesktopPane();
		setContentPane(desk);
		setTitle("Roboter Steuersoftware");
		setSize(800,600);
		
		Console console = new Console();
		console.setVisible(true);
		desk.add(console);
		Steuerung steuer = new Steuerung(console);
		steuer.setVisible(true);
		desk.add(steuer);
	}
	
	public static void main(String[] args) {
		JFrame.setDefaultLookAndFeelDecorated(true);
		RobotControl RC = new RobotControl();
		RC.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		RC.setVisible(true);
	}

}
dann Console.java:
Code:
import javax.swing.*;


public class Console extends JInternalFrame {
	private JLabel console;
	public Console() {
		super();
		setSize(200,200);
		setLocation(250,0);
		console = new JLabel("Befehle");
		this.getContentPane().add(console);
	}
	
	public void setJLabel(String str) {
		console.setText(str);
	}
}
dann Steuerung.java:
Code:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Steuerung extends JInternalFrame implements ActionListener {
	private JInternalFrame zugriff;
	private JButton vor;
	public Steuerung(JInternalFrame übergabe) {
		super();
		setSize(200,200);
		setLocation(0,0);
		this.zugriff = übergabe;
		vor = new JButton("Vor");
		vor.addActionListener(this);
		this.getContentPane().add(vor);
	}
	
	public void actionPerformed(ActionEvent ae) {
		Object source = ae.getSource();
		
		if(source == vor) {
		this.zugriff.setJLabel("vor");
		} 
	}
}

wenn ich das Compilieren will kommt bei:
Code:
this.zugriff.setJLabel("vor");

"the method setJLabel(string) is undefined for the type JInternalFrame"

Was ist das falsch daran, was muss verändern und korrigieren?
Gruß michi
 
Ein JInternalFrame hat (im Gegensatz zu deiner Console-Klasse) keine setLabel Methode.
Du übergibst der 'Steuerung' zwar eingentlich eine 'Console', deklarierst sie jedoch als JInternalFrame.

Code:
public class Steuerung extends JInternalFrame implements ActionListener {
   private Console zugriff;
   private JButton vor;
   public Steuerung(Console übergabe) {
      super();
      setSize(200,200);
      setLocation(0,0);
      this.zugriff = übergabe;
      vor = new JButton("Vor");
      vor.addActionListener(this);
      this.getContentPane().add(vor);
   }
   
   public void actionPerformed(ActionEvent ae) {
      Object source = ae.getSource();
      
      if(source == vor) {
      this.zugriff.setJLabel("vor");
      }
   }
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben