2015-02-24 64 views
2

使用JavaFX ListView時,如果您右鍵點擊項目,則選擇該項目。僅通過左鍵單擊選擇ListView項目

是否可能只有選擇一個項目如果你左鍵點擊它?

+1

我想你可以停止右點擊[設置事件fil ter](http://docs.oracle.com/javase/8/javafx/events-tutorial/filters.htm#BCFDCCEJ),它消耗了鼠標右鍵事件。但是,無選擇是由[ContextMenuEvent.CONTEXT_MENU_REQUESTED](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/input/ContextMenuEvent.html#CONTEXT_MENU_REQUESTED)事件獨立觸發的,您可以過濾器,但該事件只有'event.isKeyboardTrigger()',所以不能過濾用於啓動事件的鼠標按鈕。 – jewelsea 2015-02-24 22:06:51

+1

我不知道如何解決這個問題 - 也許是一個新的自定義ListView皮膚或行爲的實現。 – jewelsea 2015-02-24 22:09:42

+0

我在發佈代碼後剛剛閱讀了您的評論。爲什麼它不工作,我。即我沒有看到什麼? – Roland 2015-02-28 06:06:16

回答

2

只需過濾MOUSE_PRESSED事件,檢查輔助按鈕是否關閉,使用它並在需要時添加自定義處理代碼。

右鍵單擊也可以觸發OS X觸摸板上的一個ContextMenuEvent.CONTEXT_MENU_REQUESTED事件(並且此類事件會有點奇怪地觸發選擇),因此也會篩選並使用這些事件。

這個工作對我來說:

public class ListViewSample extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     primaryStage.setTitle("List View Sample");   

     ListView<String> list = new ListView<String>(); 
     ObservableList<String> items =FXCollections.observableArrayList ("Single", "Double", "Suite", "Family App"); 
     list.setItems(items);  

     // filter right mouse button 
     list.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> 
     { 
      if(e.isSecondaryButtonDown()) { 
       e.consume(); 
      } 

     }); 

     list.addEventFilter(ContextMenuEvent.CONTEXT_MENU_REQUESTED, Event::consume); 

     // verify selection via logging 
     list.getSelectionModel().selectedItemProperty().addListener(
       (ChangeListener<String>) (observable, oldValue, newValue) -> System.out.println("Item selected: " + observable + ", " + oldValue + ", " + newValue) 
       ); 

     StackPane root = new StackPane(); 
     root.getChildren().add(list); 
     primaryStage.setScene(new Scene(root, 200, 250)); 
     primaryStage.show(); 
    } 
} 
1

可能是這可以幫助

-Controller

@FXML 
ListView<String> listT=new ListView<String>(); 
@FXML 
Label lbl=new Label(); 

public void initialize(URL location, ResourceBundle resources) { 
    listT=new Listv(listT); 

} 

類擴展列表視圖

public class Listv extends ListView<String>{ 
ListView<String> llist=new ListView<String>(); 
int PrevIndex=0; 

public Listv(ListView<String> l) { 
    this.llist=l; 
    llist.getItems().add("A"); 
    llist.getItems().add("A"); 
    llist.getItems().add("A"); 
    llist.getItems().add("A"); 
    this.llist.setOnMouseClicked(listclicked); 
    this.llist.getSelectionModel().selectedIndexProperty().addListener(indexChanged); 
} 

EventHandler<MouseEvent> listclicked=new EventHandler<MouseEvent>() {  
    @Override 
    public void handle(MouseEvent event) { 
     if(event.getButton() == MouseButton.SECONDARY) 
     {    
      Platform.runLater(()->{ 
       llist.getSelectionModel().select(PrevIndex); 
      });   
     } 
    } 
}; 

ChangeListener<Object> indexChanged=new ChangeListener<Object>() { 

    @Override 
    public void changed(ObservableValue<? extends Object> observable,Object oldValue, Object newValue) { 
     PrevIndex=Integer.parseInt(oldValue.toString()); 
    } 
}; 
} 
+0

與此問題是它首先選擇新的比前一個 – vinay 2015-02-28 06:21:59

相關問題