【问题标题】:class hierarchy methods when invoking from other classes从其他类调用时的类层次结构方法
【发布时间】:2017-01-14 01:28:03
【问题描述】:

首先这是一个非常基本的问题,但我似乎无法理解, 好的,这是我的程序的一般概述

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

这是我的程序层次结构,我想从 D 类调用非静态方法 E,而不创建 C 类的新实例,有没有办法做到这一点,或者我是否必须重组我的类层次结构。

**编辑:**这是显示我的问题的真实代码(虽然没有 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 方法

【问题讨论】:

  • 你的ascii图不清楚。您可以发布实际代码吗?
  • 您可以将C 类的实例从A 传递给B 类。然后,将此实例传递给D 类并在D 类中调用method E,而无需在D 类中创建实例。

标签: java object hierarchy


【解决方案1】:

您不能在没有实例的情况下调用非静态方法。那是“没有商量余地”。

你必须重新设计你的班级结构。

【讨论】:

    【解决方案2】:

    您可以使用构造函数或设置器将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,而无需在D 中创建C 的对象。

    您可以修改您的 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)));
    ...
    

    【讨论】:

    • 是的,这是我可以做到的一种方法,但我正在寻找一种更简单的方法,而不是制作一长串的参考文献
    • 关于这一行add(new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new TextLabel(), new ChangeButton()));。我认为您需要以某种方式将 new TextLabel() 对象传递给 new ChangeButton() 对象。为什么不在ChangeButton构造函数中传递呢?
    猜你喜欢
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多