【问题标题】:access to my own method of a EventListener访问我自己的 EventListener 方法
【发布时间】:2014-11-26 21:00:20
【问题描述】:

我在 CaretListener "as" 中创建了一个方法 mames "si()" 但我不能调用它,错误说 "找不到符号" 有人可以告诉我为什么我找不到这个方法

public class FoxTable {


      private boolean TECLADO=false;

      public FoxTable(){
        Accion();
      }


      private void Accion() {
            CaretListener as=new CaretListener() {


                @Override public void caretUpdate(CaretEvent e) {
                    TECLADO=true;
                    System.out.println(e.getDot()+" Dot");
                    System.out.println(e.getMark()+" Mark");
                }

                public boolean si(){
                    if(TECLADO){TECLADO=false;return true;}
                    return true;
                }
            };

            KeyAdapter focus=new KeyAdapter() {

                @Override public void keyPressed(KeyEvent e) {

                    switch(e.getKeyCode()){        

                        case 10:
                          e.getComponent().transferFocus();
                          as.si();
                          break;
                    }                
                }
            };
     }
}

感谢您的回答和建议!

【问题讨论】:

    标签: java events overriding listener


    【解决方案1】:

    因为您的匿名 KeyAdapter 内部类在其范围内没有“as”实例。

    您可以考虑将“as”实例作为属性或匿名 KeyAdapter 内部类传递。

    编辑

    所以,我将“as”实例变量传递给匿名内部类的想法是行不通的,请看下面的堆栈溢出问题: Accessing constructor of an anonymous class

    因此,我建议将 si() 方法从 CaretListener 匿名内部类内部移动到 FoxTable 类。然后两个匿名内部类都可以根据需要调用该方法。

    public class FoxTable {
    
    private boolean teclado = false;
    
    public FoxTable (){
        Accion();
    }
    
    public boolean si(){
        if (teclado) {
            teclado = false;
            return true;
        }
        return true;
    }
    
    private void Accion() {
    
        CaretListener as = new CaretListener() {
            public void caretUpdate(CaretEvent e) {
                teclado = true;
                System.out.println(e.getDot()+" Dot");
                System.out.println(e.getMark()+" Mark");
            }
        };
    
        KeyAdapter focus = new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                switch(e.getKeyCode()){
                    case 10:
                        e.getComponent().transferFocus();
                        si();
                        break;
                }
            }
        };
    }
    

    编辑 X 2

    所以,如果你必须在你的内部类中使用 si() 方法,这是我知道的唯一方法。您将无法使用匿名内部类,您将需要使用已声明的内部类,然后扩展您正在使用的两个不同侦听器的接口。

    public class FoxTable {
    
        private boolean TECLADO=false;
    
        public FoxTable(){
            Accion();
        }
    
        private void Accion() {
            ExtendedCaretListener as = new ExtendedCaretListener();
            KeyAdapter focus = new ExtendedKeyAdapter(as);
        }
    
        public class ExtendedCaretListener implements CaretListener {
            public void caretUpdate(CaretEvent e) {
                TECLADO=true;
                System.out.println(e.getDot()+" Dot");
                System.out.println(e.getMark()+" Mark");
            }
    
            public boolean si(){
                if(TECLADO){
                    TECLADO=false;
                    return true;
                }
                return true;
            }
        }
    
        public class ExtendedKeyAdapter implements KeyAdapter {
    
            ExtendedCaretListener as = null;
    
            public ExtendedKeyAdapter(ExtendedCaretListener as) {
                this.as = as;
            }
    
            public void keyPressed(KeyEvent e) {
                switch(e.getKeyCode()){
                    case 10:
                        e.getComponent().transferFocus();
                        as.si();
                        break;
                }
            }
        }
    }
    

    也许其他人能够以不同的方式参与进来。

    【讨论】:

    • 把它放在我的 KeyAdapter 内部类中是行不通的,但它是同样的问题
    • 因此,我们可能需要查看更多代码。您只显示了两个试图访问称为 TECLADO 的父属性的匿名内部类。你能告诉我们TECLADO是如何在父类中使用的吗?我们不需要整个类,但多一点仍然可以编译的代码会有所帮助。
    • 如果你有时间,你能更新上面问题中的代码吗?我不认为评论部分能很好地接受代码片段。
    • 是的,它的工作原理就是这样,但我想要的是使用内部类中的方法,谢谢你的回答
    • 我不认为你能用匿名内部类做你想做的事情。匿名内部类不能添加到其公共接口。这意味着,如果您查看 CaretListener 接口,这些是该匿名 CaretListener 之外的类可以调用的唯一方法。匿名 KeyAdapter 将无法看到该 si() 方法。您必须实际创建一个扩展 CaretListener 的声明的内部类,以便您可以添加 si() 方法。
    猜你喜欢
    • 2020-11-09
    • 2019-11-01
    • 2018-11-23
    • 2011-07-07
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    相关资源
    最近更新 更多