2015-11-02 84 views
2

如果用戶點擊進入我的擴展TextField並顯示下面的代碼,則顯示一個鍵盤。當用鼠標滾動時,您不會將焦點移到TextField,但是當通過觸摸滾動時,焦點會丟失 - 當然還有鍵盤消失。有沒有辦法在touchScroll上獲得與mouseScroll相同的行爲?如果用戶正在滾動觸摸,我不希望鍵盤消失!JavaFX TextField focusProperty touch on touchScrollEvent

focusedProperty().addListener(new ChangeListener<Boolean>() { 

     @Override 
     public void changed(final ObservableValue<? extends Boolean> observable, final Boolean oldValue, 
       final Boolean newValue) { 

       KeyboardUtils.INSTANCE.setVisible(newValue); 
     } 
    }); 

回答

1

這是非常基本的先生,當你與一個Touchscroll滾動你肯定輕觸滾動Pane區域以及PanerequestFocus()通過觸摸,所以你TextField將失去它的焦點。

所以要解決它,你送焦點回到你的TextField如果您發現觸摸或者通過使用窗格或節點的滾動監聽器或去setOnTouchStationary()setOnTouchReleased(),以幫助調整鍵盤的可見性,而不是躺在重點是你的TextField

編輯

試試這個

Node lastFocusedNode =null; // lastly known node to have focus 
//now every node or child in your ScrollPane or Scrollable parent 
//that you care about will have a focusable listener-including 
// your textfield 
textField.focusedProperty().addListener(new ChangeListener<Boolean>() { 
@Override 
public void changed(
     ObservableValue<? extends Boolean> observable, 
       Boolean oldValue, Boolean newValue) { 
       if(!newValue){//if they loose focus 
        lastFocusedNode = textField; 
        //if they loose focus attach them to lastFocusedNode 
       } 
      } 
     }); 
//the above saves you iterations 

那麼當你的ScrollPane /滾動節點接收集中您將它們設置爲lastFocusedNode,因爲它只是將允許滾動。上述

sp.focusedProperty().addListener(new InvalidationListener() {    
      @Override 
      public void invalidated(Observable observable) { 
       if (lastFocusedNode != null) { 
        lastFocusedNode.requestFocus(); 
       } 
      } 
     }); 

假設你的ScrollPane將只是沒有做任何事情,從滾動消耗一邊..

,如果你的ScrollPane /滾動父母不與這樣的假設會那麼 你去使用這種方法,檢測時用戶在觸摸您的可滾動節點的內容區域後滾動 - 僅當用戶在觸摸後嘗試滾動時纔有效。

//approach loaded 
final InvalidationListener lis = new InvalidationListener() {    
@Override 
public void invalidated(Observable observable) { 
    //here it is changing 
    if(sp.isFocused()) 
     lastFocusedNode.requestFocus();//take the focus away 
    } 
}; 

使用您設置的hvalueProperty()和vvalueProperty()或您的ScrollPane上述無效聽衆 - 其滾動父您使用的?

sp.hvalueProperty().addListener(lis); 
sp.vvalueProperty().addListener(lis); 

,那麼你就完成了。上述任何解決方案都會引起沒有problemo

EDIT 2

據我所知TouchEvent是觸控功能的電腦,所以也許有MouseEvent去,你可以檢測Pane.setOnMousePressed();等ETCC

希望它幫助

+0

感謝您的答案,所以對於每個TouchEvent我需要遍歷該窗格的所有子節點以獲取被聚焦的節點? (這是可能的,因爲TouchEvent請求焦點?然後在發佈我requestFocus然後呢?但是,這不是真的不行嗎? – Tobi

+0

你會評論嗎? – Tobi

+0

讓我知道,如果它的好先生@Tobi – Elltz