Kommunikation zwischen 2 Klassen

Carcharoth

Bekanntes Mitglied
Guten Abend

Ich habe eine kleine GUI programmiert die einen JTree beinhaltet (in Form einer Klasse TreePanel) und ein JTextField.
Bei Anklicken eines Elementes im Tree soll der JTextField mit dem Namen des angeklickten Elementes angepasst werden.

Um das JTextField aus der Klasse TreePanel heraus updaten zu können, habe ich in der Klasse UF eine public static Methode gemacht.
Ist das der korrekte Weg oder wie mache ich das besser ?

Danke und Gruss


Java:
public class UF extends JFrame {
    private Container contentPane;
    public static JTextField textFieldHersteller = new JTextField();
    
    public UF() {
        setSize(800, 600);
        setLocationRelativeTo(null);
        contentPane = getContentPane();
        contentPane.setLayout(null);
        contentPane.add(new TreePanel(50,50,300,400));
        textFieldHersteller.setBounds(500, 80,200,30);
        contentPane.add(textFieldHersteller);
    }

    public static void updateTextField(String hersteller) {
        textFieldHersteller.setText(hersteller);
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UF frame = new UF();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}


Java:
public class TreePanel extends JPanel implements TreeSelectionListener {
    public JTree tree;

    public TreePanel(int x, int y, int width, int height) {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        root.add(new DefaultMutableTreeNode("Child 1"));
        root.add(new DefaultMutableTreeNode("Child 2"));
        
        tree = new JTree(root);
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        tree.addTreeSelectionListener(this);

        this.setBounds(x,y,width, height);
        this.setLayout(null);
        JScrollPane scrollPane = new JScrollPane(tree);
        scrollPane.setSize(new Dimension(width, height));
        add(scrollPane);
    }

    public void valueChanged(TreeSelectionEvent e) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();

        if (node != null) {
            Object nodeInfo = node.getUserObject();
            if (node.isLeaf()) {
                UF.updateTextField(nodeInfo.toString());
            }
        }
    }
}
 
Beste Antwort
Ist das der korrekte Weg
Für den Anfang merkst Du Dir am besten, dass static nur für Konstanten und main verwendet wird. Das ist natürlich sehr verkürzt, aber gerade am Anfang solltest Du Dich mit dem Gedanken anfreunden. Mit static deklarierst Du Klassenvariablen und -methoden, also Variablen und Methoden, die im Kontext der Klasse existieren und somit ohne Objekt auskommen. Das ist nun gerade nicht objekt-orientiert.

In Deinem Code existiert textFieldHersteller also im Kontext der Klasse. Für den Zugriff auf das Feld benötigst Du kein Objekt, d. h. im Umkehrschluss, dass sich alle Instanzen von UF dieses Feld teilen -> nix gut.

Wie funktioniert es dann? In der Objektorientierung willst Du mit Objekten arbeiten, daher ist die...

mihe7

Top Contributor
Ist das der korrekte Weg
Für den Anfang merkst Du Dir am besten, dass static nur für Konstanten und main verwendet wird. Das ist natürlich sehr verkürzt, aber gerade am Anfang solltest Du Dich mit dem Gedanken anfreunden. Mit static deklarierst Du Klassenvariablen und -methoden, also Variablen und Methoden, die im Kontext der Klasse existieren und somit ohne Objekt auskommen. Das ist nun gerade nicht objekt-orientiert.

In Deinem Code existiert textFieldHersteller also im Kontext der Klasse. Für den Zugriff auf das Feld benötigst Du kein Objekt, d. h. im Umkehrschluss, dass sich alle Instanzen von UF dieses Feld teilen -> nix gut.

Wie funktioniert es dann? In der Objektorientierung willst Du mit Objekten arbeiten, daher ist die Antwort recht einfach: Du brauchst ein Objekt (genauer: eine Referenz auf ein Objekt).

Im einfachsten Fall übergibst Du also z. B. Deinem TreePanel im Konstruktor noch ein UF-Objekt, dann kannst Du die Methode updateTextField (die natürlich nicht mehr static ist) über dieses Objekt aufrufen.
 
Beste Antwort

Carcharoth

Bekanntes Mitglied
Danke für die sehr klare Erläuterung.
Ich habe es nun umgesetzt (funktioniert auch). Ist aber das UF-Objekt korrekt dem Konstruktor von TreePanel übergeben? Ich frage deshalb, weil in anderen Sprachen die ich kenne ein Parameter einer Methode byRef oder byVal übergeben werden kann (also entweder gleich das Objekt oder eine Referenz darauf).

Java:
public class UF extends JFrame {
    private Container contentPane;
    public static JTextField textFieldHersteller = new JTextField();
    
    public UF() {
        setSize(800, 600);
        setLocationRelativeTo(null);
        contentPane = getContentPane();
        contentPane.setLayout(null);
        contentPane.add(new TreePanel(50,50,300,400, this));
        textFieldHersteller.setBounds(500, 80,200,30);
        contentPane.add(textFieldHersteller);
    }

    public void updateTextField(String hersteller) {
        textFieldHersteller.setText(hersteller);
    }
    
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UF frame = new UF();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

Java:
public class TreePanel extends JPanel implements TreeSelectionListener {
    public JTree tree;
    private UF uf;

    public TreePanel(int x, int y, int width, int height, UF uf) {
        this.uf = uf;
        
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
        root.add(new DefaultMutableTreeNode("Child 1"));
        root.add(new DefaultMutableTreeNode("Child 2"));
        
        tree = new JTree(root);
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        tree.addTreeSelectionListener(this);

        this.setBounds(x,y,width, height);
        this.setLayout(null);
        JScrollPane scrollPane = new JScrollPane(tree);
        scrollPane.setSize(new Dimension(width, height));
        add(scrollPane);
    }

    public void valueChanged(TreeSelectionEvent e) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();

        if (node != null) {
            Object nodeInfo = node.getUserObject();
            if (node.isLeaf()) {
                uf.updateTextField(nodeInfo.toString());
            }
        }
    }
}
 

KonradN

Super-Moderator
Mitarbeiter
Java kennt nur call by Value. Aber bei Instanzen hat man immer eine Referenz und die wird hier korrekt übergeben.
Eine Referenz ist in etwa vergleichbar mit einem Pointer in C oder C++. Das, worauf verwiesen wird, kannst du ändern.
 

Carcharoth

Bekanntes Mitglied
OK, Danke.

By the way. Ich bin mir nicht sicher, ob ich hier korrekt mit dem Threading in Bezug auf Swing umgehe. Ich denke zwar schon, weil alles rund um die GUI via Main dem Aufruf in der Main Methode innerhalb des EDT stattfindet.

Was wäre wenn ich im Konstruktor UF noch eine aufwändige Arbeit (z.B. ein Datenbank Query) hätte ? wie könnte ich den ausserhalb des EDT ausführen ?

Java:
public class UF extends JFrame {
    private Container contentPane;

    public UF() {
        query(); //aufwändige Aufgabe die ausserhalb des EDT stattfinden sollte
        
        setLocationRelativeTo(null);
        contentPane = getContentPane();
        contentPane.setLayout(null);
        contentPane.add(new TreePanel(50,50,300,400, this));
        textFieldHersteller.setBounds(500, 80,200,30);
        contentPane.add(textFieldHersteller);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UF frame = new UF();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
 

KonradN

Super-Moderator
Mitarbeiter
Was wäre wenn ich im Konstruktor UF noch eine aufwändige Arbeit (z.B. ein Datenbank Query) hätte ? wie könnte ich den ausserhalb des EDT ausführen ?
Das könnte man einfach über einen Thread machen. (Klasse Thread)

Wichtig ist dabei, dass Änderungen an der UI immer im EDT stattfinden müssen. Das geht z.B. über SwingUtilities invokeLater oder invokeAndWait.

Es gibt aber auch in Swing spezielle Klassen, die einem das abnehmen. SwingWorker z.B. - das bietet dann eben diese Aktualisierungen direkt im EDT zu machen.
 

KonradN

Super-Moderator
Mitarbeiter
Und da der Hinweis auf Lambda Expressions und Methodenreferenzen. Seid Java 8 schreibt man das halt nicht mehr so.

new Thread( () -> query() ).start();
new Thread(this::query).start();

Das ist doch deutlich kürzer und lesbarer, oder?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
F Klassen Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 4
G Kommunikation zwischen zwei Klassen Java Basics - Anfänger-Themen 5
M Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 3
V Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 2
L Kommunikation zwischen mehreren Klassen Java Basics - Anfänger-Themen 2
G Nochmal Problem mit Kommunikation zwischen Klassen Java Basics - Anfänger-Themen 3
G Kommunikation zwischen Klassen, aber bitte MVC Java Basics - Anfänger-Themen 12
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
P Kommunikation zwischen zwei *.class Java Basics - Anfänger-Themen 3
T Kommunikation zwischen Controller und GUI Java Basics - Anfänger-Themen 2
S Frage zur Kommunikation zwischen Objekten Java Basics - Anfänger-Themen 5
J Kommunikation zwischen zwei JAVA-Dateien Java Basics - Anfänger-Themen 8
S Kommunikation zwischen Komponenten in einem JFrame Java Basics - Anfänger-Themen 10
B Kommunikation zwischen Klasse und Listener Java Basics - Anfänger-Themen 2
D Kommunikation zwischen zwei Java Anwendungen möglich? Java Basics - Anfänger-Themen 6
G Kommunikation zwischen Applet und Java-Anwendung über TCP/IP Java Basics - Anfänger-Themen 3
M Kommunikation zwischen GUI und Event -Klasse Java Basics - Anfänger-Themen 3
Q Kommunikation zwischen Frames Java Basics - Anfänger-Themen 3
B Kommunikation mit Seriellen Schnittstellen + Integration einer lib Java Basics - Anfänger-Themen 1
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
I Kommunikation "normaler PC" mit lokaler Software an "Cloud Service" und umgekehrt Java Basics - Anfänger-Themen 15
izoards Socket Kommunikation Java Basics - Anfänger-Themen 16
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
A Client-Server Kommunikation Java Basics - Anfänger-Themen 3
S JavaFX-Arduino Kommunikation mit LCD-Anzeige Java Basics - Anfänger-Themen 0
M Input/Output Kommunikation mit externen Geräten Java Basics - Anfänger-Themen 0
M OOP Kommunikation MVC und DTO Java Basics - Anfänger-Themen 13
K Kommunikation von Java RMI und Webservices Java Basics - Anfänger-Themen 9
H Einfache Client/Server-Kommunikation Java Basics - Anfänger-Themen 16
E MVC: Kommunikation der Modellteile Java Basics - Anfänger-Themen 12
G Klassen Kommunikation zw. Klassen Java Basics - Anfänger-Themen 28
B Socket Kommunikation in beide Richtungen Java Basics - Anfänger-Themen 12
F Socket Kommunikation Java Basics - Anfänger-Themen 4
G Server-Client Kommunikation Java Basics - Anfänger-Themen 3
J Panel-übergreifende Kommunikation Java Basics - Anfänger-Themen 3
J RxTx/RS232 Kommunikation (TwoWay) Java Basics - Anfänger-Themen 10
Z Tomcat Server Kommunikation zu Client Applet Java Basics - Anfänger-Themen 5
G Datenstruktur und die Kommunikation mit der GUI Java Basics - Anfänger-Themen 10
W Inter-Thread-Kommunikation Java Basics - Anfänger-Themen 3
T Kommunikation zw. 2 Javaprogrammen Aufr --> Verab. -> Java Basics - Anfänger-Themen 6
P Kommunikation mit Prozess Java Basics - Anfänger-Themen 3
H Kommunikation C++ <> Java Java Basics - Anfänger-Themen 4
A Kommunikation Java-Anwendung <-> Java-Applet Java Basics - Anfänger-Themen 24
D Thread und Process Kommunikation bei eigener Console Java Basics - Anfänger-Themen 2
P asynchrone Kommunikation Applet Servlet mit RMI möglich Java Basics - Anfänger-Themen 4
F Kommunikation von 2 Klasse Java Basics - Anfänger-Themen 5
B jtapi <-> tapi Kommunikation Java Basics - Anfänger-Themen 2
S Kommunikation zwsichen Klassen. Java Basics - Anfänger-Themen 9
D J/Direct oder JNI? .bzw. Kommunikation mit Windows-API. Java Basics - Anfänger-Themen 2
M probleme in der kommunikation von klassen Java Basics - Anfänger-Themen 5
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
S Unterschied zwischen Denkweisen Java Basics - Anfänger-Themen 13
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
Ras Unterschied zwischen parser xml and api xml Java Basics - Anfänger-Themen 7
X Was ist der Unterschied zwischen materialisierten und nichtmaterialisierten Attributen einer Klasse? Java Basics - Anfänger-Themen 1
F Abstand zwischen zwei Objekten berechnen wie? Java Basics - Anfänger-Themen 1
S Längster Pfad zwischen zwei Vertices in einem Graph Java Basics - Anfänger-Themen 3
U Erste Schritte nextGaussian zwischen zwei Werten Java Basics - Anfänger-Themen 19
jhCDtGVjcZGcfzug Was ist der Unterschied zwischen diesen Quellcodes? Java Basics - Anfänger-Themen 3
rafi072001 Assoziation zwischen Musiker und Label Java Basics - Anfänger-Themen 1
I Best Practice Saubere Verbindung zwischen API und Business Layer mit DTO's Java Basics - Anfänger-Themen 2
A Parametar übergabe zwischen Methoden Java Basics - Anfänger-Themen 26
W User zwischen Optionen wählen lassen Java Basics - Anfänger-Themen 1
I Differenz zwischen LocalDateTime Java Basics - Anfänger-Themen 4
Leo_1789 Differenz ausrechnen zwischen denn idealgewicht und denn echten Gewicht Java Basics - Anfänger-Themen 7
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
P Methode die ausgibt wie viele Primzahlen es zwischen 2 und n gibt Java Basics - Anfänger-Themen 10
marcooooo Separator zwischen allen Zeichen eines Strings einfügen Java Basics - Anfänger-Themen 29
NeoLexx Zuweisungskompatibilität zwischen Vererbungsbeziehungen (Polymorphie) Java Basics - Anfänger-Themen 18
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
N Berührung zwischen Rechtecken Java Basics - Anfänger-Themen 5
Y Unterschied zwischen WindowBuilder und herkömmlichen erstellen des GUI´s? Java Basics - Anfänger-Themen 9
J Wert zwischen JFrames übergeben Java Basics - Anfänger-Themen 2
U Worin besteht der Unterschied zwischen call by reference und call by value? Java Basics - Anfänger-Themen 14
E Unterschied zwischen new und import Java Basics - Anfänger-Themen 5
J Punkt auf,über,unter oder zwischen 2 Geraden Java Basics - Anfänger-Themen 14
B Unterschied zwischen (List<T> a) und (T[] a) Java Basics - Anfänger-Themen 7
Dilara_K Abstand zwischen den Doppelwerten in einem Array herausfinden Java Basics - Anfänger-Themen 20
S Nach dem Herüberschieben eines Arrays zwischen 2 Frames öffnet sich das Frame nicht mehr Java Basics - Anfänger-Themen 12
D Zufallszahl zwischen 10 und 99? Java Basics - Anfänger-Themen 5
J Objektzugriff zwischen disjunkten Klassen Java Basics - Anfänger-Themen 1
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
A Methoden Unterscheid zwischen public und ohne Java Basics - Anfänger-Themen 9
X Input/Output Höchste Temperaturschwankung zwischen 2 Tagen Java Basics - Anfänger-Themen 2
Bluedaishi der Monat zwischen zwei Datumsangaben Java Basics - Anfänger-Themen 15
R Threads Pause zwischen zwei Schleifen Java Basics - Anfänger-Themen 1
Aprendiendo Unterschied zwischen Referenzvariable und Instanzvariable. Java Basics - Anfänger-Themen 2
N Unterschied zwischen Checked und Unchecked Exceptions Java Basics - Anfänger-Themen 12
S Parameterübergabe zwischen zwei Programme Java Basics - Anfänger-Themen 4
S Erste Schritte Zwischen zwei Punkten ein Minimumpkt./Maxima finden Java Basics - Anfänger-Themen 1
K Klassen Array zwischen Klassen übergeben Java Basics - Anfänger-Themen 2
Arif OOP Die Bindung zwischen einem äußeren und einem inneren Objekt Java Basics - Anfänger-Themen 2
schoenosrockos Unterschied zwischen Objekten und vererbungen Java Basics - Anfänger-Themen 1
S OOP Variablen zwischen mehreren Klassen Java Basics - Anfänger-Themen 11
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
J Variablen Unterschied zwischen lokalen-, Instanz-, Klassenvariablen Java Basics - Anfänger-Themen 6
N Dauer zwischen zwei LocalDateTime Objekten berechnen? Java Basics - Anfänger-Themen 4
P Ungerade Zahlen ausgeben lassen zwischen Spannweite zweier eingegeben zahlen Java Basics - Anfänger-Themen 6
V Zufallswert zwischen zwei Zahlen a und b Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben