Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅通过左键单击来选择ListView项目_Java_Javafx - Fatal编程技术网

Java 仅通过左键单击来选择ListView项目

Java 仅通过左键单击来选择ListView项目,java,javafx,Java,Javafx,使用JavaFX ListView时,如果在项目上单击鼠标右键,则会选中该项目 如果用鼠标左键单击某个项目,是否可以仅选择该项目?只需过滤鼠标按下的事件,检查辅助按钮是否已按下,使用它,并在需要时添加自定义处理代码 右键单击还可以触发OSX触摸板上的ContextMenuEvent.CONTEXT\u MENU\u REQUESTED事件(奇怪的是,这样的事件会触发选择),因此也会过滤和使用这些事件 这对我很有用: public class ListViewSample extends Appl

使用JavaFX ListView时,如果在项目上单击鼠标右键,则会选中该项目


如果用鼠标左键单击某个项目,是否可以仅选择该项目?

只需过滤鼠标按下的事件,检查辅助按钮是否已按下,使用它,并在需要时添加自定义处理代码

右键单击还可以触发OSX触摸板上的
ContextMenuEvent.CONTEXT\u MENU\u 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();
    }
}
公共类ListViewSample扩展应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
setTitle(“列表视图示例”);
ListView列表=新建ListView();
ObservableList items=FXCollections.observableArrayList(“单人”、“双人”、“套房”、“家庭应用”);
列表。设置项目(项目);
//过滤鼠标右键
list.addEventFilter(MouseEvent.MOUSE_按下,e->
{
如果(例如,isSecondaryButtonDown()){
e、 消费();
}
});
list.addEventFilter(ContextMenuEvent.CONTEXT_菜单_请求,事件::消费);
//通过日志记录验证选择
list.getSelectionModel().SelectEditeProperty().addListener(
(ChangeListener)(可观察、旧值、新值)->System.out.println(“所选项目:“+可观察+”、“+旧值+”、“+新值”)
);
StackPane root=新的StackPane();
root.getChildren().add(列表);
原始阶段。设置场景(新场景(根,200250));
primaryStage.show();
}
}
这可能会有所帮助

-控制器

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

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

} 
@FXML
ListView listT=新建ListView();
@FXML
标签lbl=新标签();
公共void初始化(URL位置、ResourceBundle资源){
listT=新的Listv(listT);
} 
类扩展listview

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());
    }
};
}
公共类Listv扩展ListView{
ListView llist=新建ListView();
int-PrevIndex=0;
公共列表V(列表视图l){
这个.llist=l;
list.getItems().add(“A”);
list.getItems().add(“A”);
list.getItems().add(“A”);
list.getItems().add(“A”);
this.llist.setOnMouseClicked(listclicked);
this.llist.getSelectionModel().selectedIndexProperty().addListener(indexChanged);
}
EventHandler listclicked=新建EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
if(event.getButton()==MouseButton.SECONDARY)
{               
Platform.runLater(()->{
list.getSelectionModel().select(PrevIndex);
});          
}
}
};
ChangeListener indexChanged=新的ChangeListener(){
@凌驾

public void changed(observeValueI认为您可以停止右键单击选择使用鼠标右键的事件。但是没有-选择是由事件独立触发的,您可以对其进行筛选,但该事件只有
event.isKeyboardTrigger()
,因此您无法在用于启动事件的鼠标按钮上进行筛选。我不知道如何解决此问题-可能是一个新的自定义ListView外观或行为实现。我刚刚在发布代码后阅读了您的评论。为什么不起作用,例如,我看不到什么?可能是环境特定的问题。我正在使用touchpad on运行Java 8u31的OS X 10.9 Mac。通过同时按下触摸板上的两个手指,可以在触摸板上模拟右键单击。我这样做,过滤器将在阻止它时正确检测右键单击事件。但是,也会触发上下文菜单事件和(无论出于何种原因)JavaFX系统中有特定的代码来触发选择。不过我真是个白痴,因为解决方案非常简单-还可以过滤和使用任何
ContextMenuEvent。CONTEXT_菜单_请求列表上的
事件,而不必担心是什么触发了它。我只是尝试将代码添加到Roland的解决方案中,然后就可以了很好。我已经编辑了罗兰的解决方案来包含这个。问题是它首先选择一个新的,而不是上一个