访问我自己的EventListener方法

时间:2014-10-01 21:45:35

标签: java events override listener

我做了一个方法mames" si()"在我的CaretListener" as"但我不能称之为,错误说"找不到符号"有人可以告诉我为什么我找不到这个方法

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

感谢您的回答和建议!

1 个答案:

答案 0 :(得分:3)

因为您的匿名KeyAdapter内部类没有' as'范围内的实例。

你可以考虑将你的'作为' instance作为属性或您的匿名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;
            }
        }
    }
}

也许其他人可以通过不同的方式来实现这一目标。