2017-01-14 14 views
1

まず第一に、これはかなり基本的な問題であるから呼び出すことが、私はちょうどカントはそれを得るように見えるとき、ので、ここでOK は、これは私ですクラス階層の方法の他のクラス

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

私のプログラムの一般的な概要ですクラスCの新しいインスタンスを作成せずにクラスDから非静的メソッドEを呼び出す場合、これを行う方法があるか、クラス階層を再構成する必要がありますか?

** EDIT:**ここで(ただし、クラスBなし)私の問題を表示するための実際のコードは次のとおりです。

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 
     } 
    }); 
} 
} 

私はボタンを

+0

あなたのASCII図は不明です。代わりに実際のコードを投稿できますか? – Bohemian

+0

'C'クラスのインスタンスを' A'クラスから 'B'クラスに渡すことができます。次に、このインスタンスを 'D'クラスに渡し、' D'クラスでインスタンスを作成せずに 'D'クラスの' method E'を呼び出します。 – alayor

答えて

1

をクリックすることであなたをchangeTextメソッドを呼び出すしたいと思いますインスタンスなしで非静的メソッドを呼び出すことはできません。それは「譲渡不可」です。

あなたのクラス構造を再加工する必要があります。

1

Dにコンストラクタまたはセッタを使用してCクラスを注入できます。 これはコンストラクタインジェクションの例です。あなたはDCのオブジェクトを作成しなくても、メソッドを呼び出すことができますE

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(); 
} 
} 

この方法です。

JLabelオブジェクトを受け取るようにChangeButtonクラスを変更することができます。

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"); 
       } 
      }); 
     } 
    } 

そして、TheFrameクラスは次のようになります。

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

はい、これは私ができる方法ですが、参照の長いチェーンを作るよりも簡単な方法を探していました – Joking313

+0

この行について 'add(new JSplitPane(JSplitPane.HORIZONTAL_SPLIT、 new TextLabel()、new ChangeButton )); '。私はあなたが 'new TextLabel()'オブジェクトをどうにかして 'new ChangeButton()'オブジェクトに渡す必要があると思います。なぜあなたは 'ChangeButton'コンストラクタに渡しませんか? – alayor

関連する問題