Java 访问我自己的EventListener方法

Java 访问我自己的EventListener方法,java,events,overriding,listener,Java,Events,Overriding,Listener,我在我的CaretListener中创建了一个方法mames“si()”作为“但是我不能调用它,错误是“找不到符号”。有人可以告诉我为什么找不到这个方法 public class FoxTable { private boolean TECLADO=false; public FoxTable(){ Accion(); } private void Accion() { CaretListener

我在我的
CaretListener
中创建了一个方法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;
                    }                
                }
            };
     }
}

谢谢你的回答和建议

因为匿名KeyAdapter内部类的作用域中没有“as”实例

您可以考虑将AAS实例作为属性或匿名密钥适配器内部类传递。

编辑

因此,我将“as”实例变量传递给匿名内部类的想法是行不通的,请看一下下面的堆栈溢出问题:

因此,我建议将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;
            }
        }
    };
}
编辑x2

因此,如果必须在内部类中使用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内部类的作用域中没有“as”实例

您可以考虑将AAS实例作为属性或匿名密钥适配器内部类传递。

编辑

因此,我将“as”实例变量传递给匿名内部类的想法是行不通的,请看一下下面的堆栈溢出问题:

因此,我建议将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;
            }
        }
    };
}
编辑x2

因此,如果必须在内部类中使用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内部类的作用域中没有“as”实例

您可以考虑将AAS实例作为属性或匿名密钥适配器内部类传递。

编辑

因此,我将“as”实例变量传递给匿名内部类的想法是行不通的,请看一下下面的堆栈溢出问题:

因此,我建议将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;
            }
        }
    };
}
编辑x2

因此,如果必须在内部类中使用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内部类的作用域中没有“as”实例

您可以考虑将AAS实例作为属性或匿名密钥适配器内部类传递。

编辑

因此,我将“as”实例变量传递给匿名内部类的想法是行不通的,请看一下下面的堆栈溢出问题:

因此,我建议将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;
            }
        }
    };
}
编辑x2

因此,如果必须在内部类中使用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的parents属性的匿名内部类。你能告诉我们TECLADO是如何在父类中使用的吗?我们不需要整个类,但是多编译一些代码会很有帮助。如果你有时间,你能更新上面问题中的代码吗?我不认为注释部分很好地接受代码片段。是的,它是这样工作的,但我想要的是在内部类中使用方法,谢谢你的回答。我不认为你将能够做你试图做的匿名内部类。匿名内部类无法添加到其公共接口。这意味着,如果您查看CaretListener接口,这些是匿名CaretListener之外的类可以调用的唯一方法。匿名KeyAdapter将无法看到该si()方法。实际上,您必须创建一个扩展CaretListener的声明类间类,以便添加si()方法。如果将它放入我的KeyAdapter内部类中,则不起作用,但问题是相同的。因此,我们可能需要查看更多的代码。您只显示了两个试图访问名为TECLADO的parents属性的匿名内部类。你能告诉我们TECLADO是如何在父类中使用的吗?我们不需要整个类,但是多编译一些代码会很有帮助。如果你有时间,你能更新上面问题中的代码吗?我不认为评论部分是正确的