2017-01-14 3 views
1

First off Aufruf dies ist ein recht einfaches Problem, aber ich kann nicht scheinen, nur um es zu bekommen, ok so ist hier eine allgemeine Übersicht über mein ProgrammKlassenhierarchie Methoden, wenn sie von anderen Klassen

 |class A | 
     |new B();| 
     |new C();| 
    /  \ 
    /   \ 
|Class B |  |Class C  | 
|new D();|  |method E(){}| 
    | 
|Class D   | 
|Invokes method E| 

Dies ist meine Programmhierarchie und ich möchte die nicht statische Methode E aus der Klasse D aufrufen, ohne eine neue Instanz der Klasse C zu erstellen, gibt es eine Möglichkeit dies zu tun oder muss ich meine Klassenhierarchie neu strukturieren.

** EDIT: ** Hier ist wirklich Code mein Problem angezeigt werden (ohne Klasse B obwohl):

import javax.swing.JFrame; 
import javax.swing.JSplitPane; 

public class TheFrame extends JFrame{ 
public TheFrame(){ 
    setTitle("Suduku Solver"); 
    add(new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
      new TextLabel(), new ChangeButton())); 
    setVisible(true); 
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    setSize(300,300); 
    setLocationRelativeTo(null); 
} 
public static void main(String[] args) { 
    new TheFrame(); 
} 
} 


import javax.swing.JLabel; 
public class TextLabel extends JLabel{ 
public TextLabel(){ 
    setText("This is the Label"); 
} 
public void ChangeLabel(){ 
    setText("Changed Label"); 
} 
} 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
public class ChangeButton extends JButton { 
public ChangeButton(){ 
    setText("Click to change Label"); 
    addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      //Invoke TextLabel changeText method here 
     } 
    }); 
} 
} 

ich möchte die changeText Methode aufzurufen, indem Sie die Taste

+0

Ihr Ascii-Diagramm ist unklar. Könnten Sie stattdessen tatsächlichen Code posten? – Bohemian

+0

Sie könnten die Instanz der 'C' Klasse von' A' nach 'B' Klasse übergeben. Übergeben Sie dann diese Instanz an die Klasse "D" und rufen Sie die "Methode E" in der Klasse "D" auf, ohne die Instanz in der Klasse "D" erstellen zu müssen. – alayor

Antwort

1

Sie klicken kann eine nicht statische Methode ohne eine Instanz nicht aufrufen. Das ist "nicht verhandelbar".

Sie müssen Ihre Klassenstruktur überarbeiten.

1

Sie könnten C Klasse D mit Konstruktor oder Setter injizieren. Dies ist ein Beispiel mit Konstruktorinjektion.

class A { 
A() { 
    C c = new C(); 
    B b = new B(c); 
} 
} 

class B { 
B(C c) { 
    D d = new D(C c); 
} 
} 

class D { 
private C c; 

D(C c) { 
    this.c = c; 
} 

public void methodThatCallsE() { 
    c.E(); 
} 
} 

Auf diese Weise können Verfahren E ohne aufrufen kann ein Objekt von C in D zu erstellen.

Sie könnten Ihre ChangeButton Klasse ändern, um ein JLabel Objekt zu erhalten.

public class ChangeButton extends JButton { 
     private JLabel jlabel; 
     public ChangeButton(JLabel jlabel){ 
      this.jlabel = jlabel; 
      setText("Click to change Label"); 
      addActionListener(new ActionListener(){ 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        jlabel.setText("new Text"); 
       } 
      }); 
     } 
    } 

Und dann würde TheFrame Klasse so aussehen.

public class TheFrame extends JFrame{ 
public TheFrame(){ 
    setTitle("Suduku Solver"); 
    JLabel jlabel = new TextLabel(); 
    add(new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
      jlabel, new ChangeButton(jlabel))); 
... 
+0

ja dies ist eine Möglichkeit, ich könnte es tun, aber ich suchte nach einem einfacheren Weg als eine lange Kette von Referenzen – Joking313

+0

Über diese Zeile 'add (neue JSplitPane (JSplitPane.HORIZONTAL_SPLIT, neue TextLabel(), neue ChangeButton())); '. Ich denke, dass Sie irgendwie das 'neue TextLabel()' Objekt an das 'neue ChangeButton()' Objekt übergeben müssen. Warum übergeben Sie es nicht in 'ChangeButton' Konstruktor? – alayor

Verwandte Themen