2012-01-25 2 views
2

테이블의 바로 가기에 몇 가지 문제가 있습니다. 일부 키를 사용자 정의해야합니다. 삭제 - 행을 제거하고 표를 편집 가능/편집 불가능으로 만들기 위해 위/아래 화살표를 사용하여 표의 모드를 편집 가능에서 편집 불가능으로 전환합니다. 내 테이블을 투명한 Panel 안에 넣고 Action.Handler를 사용하여 키보드 이벤트를 잡습니다. 그러나 TextField, TextArea, Combobox 내부에이 컴포넌트에 이벤트를 전달하려고 할 때 DeleteFile 키를 사용하여 TextField의 텍스트를 삭제하고 up/down 키를 사용하면 키보드로 열린 ComboBox를 열 수 없습니다. handleAction() 메서드에서 target 매개 변수를 보았지만 지금은 사용 방법이 없습니다. 바꾸기 대신 바로 가기를 추가하는 방법을 알고 흥미 롭습니다.Vaadin에서 바로 가기 사용시 문제

// adding table inside Panel 
    tablePanel = new Panel(); 
    tablePanel.setStyleName(Panel.STYLE_LIGHT); 

    VerticalLayout tableElementsLayout = new VerticalLayout(); 
    tablePanel.setContent(tableElementsLayout); 

    tablePanel.setSizeFull(); 
    tableElementsLayout.setSizeFull(); 
    vl.addComponent(tablePanel); 
    vl.setExpandRatio(tablePanel, 1.0f); 

    tableElementsLayout.add(table); 

    // --- adding keyboard handler 
    final Action actionDel = new ShortcutAction("Delete", 
      ShortcutAction.KeyCode.DELETE, null); 

    deleteHandler = new Action.Handler() { 

     @Override 
     public void handleAction(Action action, Object sender, Object target) { 
      // I want handle events here when I'm not inside TextField 
     } 

     @Override 
     public Action[] getActions(Object target, Object sender) { 
      return new Action[] { actionDel }; 
     } 
    }; 

    tablePanel.addActionHandler(deleteHandler);   

아이디어가 있습니까? 나는 이것이 최고의 또는이를 달성 할 수있는 가장 아름다운 방법입니다 있는지 확실하지 않습니다,하지만 적어도 작동

+0

도움을 드리고 싶지만 문제를 완전히 이해하지 못했습니다. Book of Vaadin : https://vaadin.com/book/-page/advanced.shortcuts.html을 읽으셨습니까? Vaadin 개발을위한 훌륭한 안내서입니다. – miq

+0

빠른 답장을 보내 주셔서 감사합니다. 나는이 책의 일부를 완전히 읽고 그것에 따라 제 코드를 만들었습니다. 나는 일반적으로 문제를 설명하려고 노력할 것이다. 안에 Panel과 TextField가 있다고 상상해보십시오. Action.Handler를 사용하여 Panel에서 DELETE 키를 처리합니다. TextField로 기호를받는이 블록 (키보드로 기호를 삭제할 수 없습니다). 내가 액션을 이해하는 한. 핸들러는 키 조작을 완전히 대체한다. 하지만 TextField와 Action.Handler가 모두 키 누르기를받을 수 있도록 바꾸지 않는 바로 가기를 추가하고 싶습니다. –

답변

2

:

textField.addListener(new BlurListener() { 
    @Override 
    public void blur(BlurEvent event) { 
     tablePanel.addActionHandler(deleteHandler); 
    } 
}); 

textField.addListener(new FocusListener() { 
    @Override 
    public void focus(FocusEvent event) { 
     tablePanel.removeActionHandler(deleteHandler); 
    } 
}); 

이 리스너는 비활성화하여 deleteHandler의 처리됩니다 그 때마다 사용자는 필드를 입력하고 사용자가 필드를 떠날 때마다 필드를 활성화합니다.

+0

문제가 해결되었습니다. 감사합니다. 이 접근 방식을 조금 수정했는데 테이블이 편집 가능한 모드에 있으면 리스너를 제거합니다. –