2015-02-08 140 views
1

我有一个主窗口,用户可以通过单击ListView项目来选择程序功能。然而,即使他完全在物品外点击(白色箭头),程序仍会启动“数字生成器”功能。我不喜欢那样。ListView,通过双击选择项目

enter image description here

public class MainRootController2 extends Controller implements Initializable { 

    @FXML 
    StackPane stackPane; 
    @FXML 
    ListView<String> listView; 
    private ObservableList<String> list; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     //making a list and setting a background 
     list = FXCollections.observableArrayList("Number Generator", "Cards"); 
     listView.setBackground(new Background(new BackgroundImage(new Image("MainRootBackground.jpg"), 
       BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, 
       BackgroundPosition.CENTER, BackgroundSize.DEFAULT))); 
     listView.setItems(list); 
     listView.getSelectionModel().clearSelection(); 
    } 

    @Override 
    public Pane getMainPane() { 
     return stackPane; 
    } 

    /************************ EVENTS *************************/ 
    @FXML 
    private void listViewMouseDoubleClicked(MouseEvent e){ 
     if(e.getClickCount() > 1){ 
      String s = listView.getSelectionModel().getSelectedItem(); 

      switch(s){ 
       case "Number Generator": 
        ChangeTheRoot change = new ChangeTheRoot(); 
        if(change.initialize(Main.primaryStage, true, Main.NUMBER_GENERATOR_ROOT, "Number Generator", true, new NumberGeneratorController()) == false) 
         Dialogs.create().title("Error").masthead(null).message("Couldn't load the components!").showInformation(); 

        change.doFadingTransition(stackPane, Main.fadeOutMillis, Main.fadeInMillis, true); 
        break; 

       default: 
        break; 
      } 
     } 
    } 

} 

编辑....固定的版本:

public class MainRootController2 extends Controller implements Initializable { 

    @FXML 
    StackPane stackPane; 
    @FXML 
    ListView<String> listView; 
    private ObservableList<String> list; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     //making a list and setting a background 
     list = FXCollections.observableArrayList("Number Generator", "Cards"); 

     listView.setBackground(new Background(new BackgroundImage(new Image("MainRootBackground.jpg"), 
       BackgroundRepeat.NO_REPEAT, BackgroundRepeat.NO_REPEAT, 
       BackgroundPosition.CENTER, BackgroundSize.DEFAULT))); 
     listView.setItems(list); 
     listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() { 
            @Override 
            public ListCell<String> call(ListView<String> list) { 
             return new MouseClickListCell(); 
            } 

     }); 
     listView.getSelectionModel().clearSelection(); 
    } 

    @Override 
    public Pane getMainPane() { 
     return stackPane; 
    } 

    /************************ EVENTS *************************/ 
    private void fireUpTheFeature(String name){ 
     String s = listView.getSelectionModel().getSelectedItem(); 

     switch(s){ 
      case "Number Generator": 
       ChangeTheRoot change = new ChangeTheRoot(); 
       if(change.initialize(Main.primaryStage, true, Main.NUMBER_GENERATOR_ROOT, "Number Generator", true, new NumberGeneratorController()) == false) 
        Dialogs.create().title("Error").masthead(null).message("Couldn't load the components!").showInformation(); 

       change.doFadingTransition(stackPane, Main.fadeOutMillis, Main.fadeInMillis, true); 
       break; 
      case "Cards": 
       break; 
      default: 
       break; 
     } 

    } 

    public class MouseClickListCell extends ListCell<String> 
    { 
     @Override 
     protected void updateItem(String item, boolean empty) { 
      super.updateItem(item, empty); 

      if(empty) { 
       setText(null); 
       setOnMouseClicked(null); 
      } 
      else { 
       setText(item.toString()); 
       setOnMouseClicked(new EventHandler<MouseEvent>() { 

        @Override 
        public void handle(MouseEvent event) { 
         if(event.getClickCount() > 1){ 
          fireUpTheFeature(getItem()); 
         } 
        } 
       }); 
      } 
     } 
    } 
} 

回答

4

我没有看到你的FXML文件,但是从你的命名我能猜到你的控制器方法private void listViewMouseDoubleClicked(MouseEvent e)被触发时您的ListView被点击。

只要用户点击ListView区域中的任何地方,就会触发此事件。你想要的是删除onMouseClicked处理程序并将该代码移动到您的ListCell渲染器中。

如果您只将鼠标侦听器附加到非空单元格,只有在单击了ListCell时才会触发代码。

例如:

public static class MouseClickListCell<T> extends ListCell<T> 
{ 
    @Override 
    protected void updateItem(T item, boolean empty) { 
     super.updateItem(item, empty); 

     if(empty) { 
      setText(null); 
      setOnMouseClicked(null); 
     } 
     else { 
      setText(item.toString()); 
      setOnMouseClicked(ev -> doMagic()); 
     } 
    } 
} 
+0

'setOnMouseClicked(EV - > doMagic());'不过为什么我结识点击了哪个小区??? – Tomasz 2015-02-08 11:22:25

+0

您是否阅读过JavaDocs?在你的'ListCell'中,你可以通过'getItem()'来获取单元格的当前项目... – eckig 2015-02-08 11:22:59

+0

这种小功能的很多变化。我做了一些改变,它的工作原理!谢谢! (我也把整个固定代码) – Tomasz 2015-02-08 11:38:37