2017-01-14 4 views
1

Во-первых, это довольно основная проблема, но я просто не могу показаться, чтобы получить его, нормально, так вот общий обзор моей программыметоды иерархии классов при вызове из других классов

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

Это мой иерархии программ, и я хочу вызывать нестационарный метод E из класса D, не создавая новый экземпляр класса C, есть ли способ сделать это или мне нужно перестроить иерархию классов.

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

я хотел бы вызвать метод changeText, нажав на кнопку

+0

Ваша диаграмма ascii неясна. Не могли бы вы разместить фактический код? – Bohemian

+0

Вы можете передать экземпляр класса 'C' из класса' A' в 'B'. Затем передайте этот экземпляр классу 'D' и вызовите' метод E' в классе 'D', не создавая экземпляр в классе' D'. – alayor

ответ

1

вы не может вызывать нестатический метод без экземпляра. Это «не подлежит обсуждению».

Вам придется переделать свою классную структуру.

1

Вы можете ввести класс C в D с использованием конструктора или сеттеров. Это пример с инжектором конструктора.

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

Таким образом, вы можете вызвать метод E без необходимости создания объекта C в D.

Вы можете изменить свой класс ChangeButton для получения любого объекта JLabel.

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, ) новый TextLabel(), новый ChangeButton())); '. Я думаю, что вам нужно каким-то образом передать объект 'new TextLabel()' в новый объект ChangeButton(). Почему бы вам не передать его в конструкторе 'ChangeButton'? – alayor

Смежные вопросы