在Java中调用"父"组件的方法

Mel*_*Mel 4 java methods class

我认为最好在示例程序代码中显示以下情况.我有一个扩展的Java类JPanel.在这个类中有两个对象,还有两个JPanels.其中一个JPanel对象是一个JTable对象.我添加了一个侦听器来JTable检测双击.当它检测到双击时,我想在顶级类中触发一个方法.如何在Java中引用此方法?

public class TopPanel extends JPanel {

  JPanel OnePanel;
  JPanel TwoPanel;

  public void MethodToFire;

}

public class OnePanel extends JPanel {

  JTable TheTable;

}

public class TheTable extends JTable {

  public TheTable {
    this.addMouseListener(new MouseAdapter(){
      public void mouseClicked(MouseEvent e){
          if (e.getClickCount() == 2){ SYNTAX CALLING THE METHOD IN TopPanel  }
      }
    } );
  }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*lle 7

解决此问题的一种方法是使用组合而不是继承.您可以将JPanel传递给JTable的子类.


public class TopPanel extends JPanel 
{
  private TheTable table;

  public TopPanel()
  {
    table = new TheTable(this);
  }

  public void methodToFire() { }
}

public class TheTable extends JTable 
{
  private TopPanel panel;

  public TheTable(TopPanel panel)
  {
    this.panel = panel;

    this.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        doThing();
      }
    } );
  }

  private void doThing()
  {
    this.panel.methodToFire(); 
  }
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*hek 5

要访问 Outer 类上的方法,您需要使用 Outer.this.method() 的语法。

因此,在这种情况下,要从侦听器访问“TheTable”类上的方法,您应该使用TheTable.this.callMethod().

我认为TopPanel已将TheTable. 在这种情况下,您可以执行以下操作:

mouseClicked(...) {
   TopTable t = (TopTable)TheTable.this.getParent();
   t.MethodToFire();
}
Run Code Online (Sandbox Code Playgroud)

这是对问题的直接回答,不一定是“最佳”方法。类型安全的组合方法将是更好的长期解决方案。