【问题标题】:In Java, how can I access methods in separate classes without inheritance?在 Java 中,如何在没有继承的情况下访问单独类中的方法?
【发布时间】:2014-06-29 00:51:31
【问题描述】:

例如,我有一个类 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 中的方法。

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

【问题讨论】:

标签: java swing inheritance


【解决方案1】:

如果我理解您的问题,您可以保留 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());
  }
}

【讨论】:

    【解决方案2】:

    因为您正试图将 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();
    

    【讨论】:

      【解决方案3】:

      假设您有以下类:

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

      在这种情况下,您可以通过实例化一个Bar 对象并调用其barMethod 来从Foo 访问LoremIpsumloremIpsumMethod,这反过来又实例化一个LoremIpsum 对象并调用其@987654328 @。

      【讨论】:

        【解决方案4】:

        import packagename.classname;(注意:如果它们在同一个包中,则不必将导入)放在要访问方法并创建引用的类的顶部。 例子: 方法类.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”。

        【讨论】:

          猜你喜欢
          • 2012-02-09
          • 2015-11-25
          • 1970-01-01
          • 1970-01-01
          • 2020-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多