在Java中,如何在没有继承的情况下访问单独类中的方法?

时间:2014-06-29 00:51:32

标签: java swing inheritance

例如,我有一个类ImageViewer,它在面板中显示图片。然后我有另一个类ImageChooser,它允许您从目录中选择一个图像,然后在文本字段中显示文件路径字符串。在那个类中,我有一个私有内部类,当单击一个名为displayButton的按钮时,它会调用ImageViewer中的方法来显示图像。

private class displayButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        displayImage(imageTextField.getText());
    }
}

我的问题是方法displayImage在ImageViewer类中,不能由ImageChooser类访问。

public void displayImage(String imageFile) {
    ImageIcon picture = new ImageIcon(imageFile);
    imageLabel.setIcon(picture);
}

两个类都扩展了JPanel(我有一个使用BorderLayout管理器在框架中使用每个面板的主类),因此我无法通过继承访问ImageViewer中的方法。

我知道我可以组合这两个类或使用不同的布局管理器,但我想知道他们是否是另一种方法,以防我再遇到这样的事情。

4 个答案:

答案 0 :(得分:0)

如果我理解您的问题,您可以保留ImageViewer引用,遵循Java命名约定。等等,

private class DisplayButtonListener implements ActionListener {
  public DisplayButtonListener(ImageViewer viewer) {
    this.iv = viewer;
  }
  private ImageViewer iv;
  public void actionPerformed(ActionEvent e) {
    if (iv == null) return;
    iv.displayImage(imageTextField.getText());
  }
}

答案 1 :(得分:0)

因为您正尝试将A类方法与B类一起使用。

让我们说A类有a1(),a2(),a3()等方法 B类有方法b1(),b2(),b3()

你不能在B类的一种方法中做这样的事情。 a1() - >这将引用this.a1() - > B.a1()

B类没有名为a1()的方法。

在你的情况下,我认为你应该在ImageChooser的构造函数中实例化一个ImageViewer类,然后调用它,例如:

//ctor of ImageChooser
ImageViewer a = new ImageViewer();

然后将displayImage称为

a.displayImage();

答案 2 :(得分:0)

import packagename.classname;(请注意:您不必将导入(如果他们在同一个包中)放在要访问该方法的类的顶部)并创建一个参考。 例: methodClass.java:

package net.snugglesstuff.methods;

public class methodClass() {
    public void sayHi() {
        System.out.println("Hi");
    }
}

useMethodClass.java:

package net.snugglesstuff.run;

import net.snugglesstuff.methods.methodClass;

public class useMethodClass() {
    private static methodClass mc = new methodClass();

    public static void main(String[] args) {
        mc.sayHi();
    }
}

主要班级应为net.snugglesstuff.run.useMethodClass。结果应该(更新,确实有效)" Hi"。

答案 3 :(得分:0)

假设您有以下类:

public class Foo {
//...
    public void fooMethod() {
        Bar bar = new Bar();
        bar.barMethod();
    }
//...
}

public class Bar {
//...
    private class LoremIpsum {
        public void loremIpsumMethod() {/*...*/}
    }
//...
    public void barMethod() {
        LoremIpsum loremIpsum = new LoremIpsum();
        loremIpsum.loremIpsumMethod();
    }
}

在这种情况下,您可以通过实例化LoremIpsum对象并调用其loremIpsumMethodFoo来自Bar barMethodLoremIpsum依次实例化一个loremIpsumMethod对象并调用其{{1}}。