如何使ListView可选择但不可编辑

时间:2017-03-24 00:42:39

标签: java javafx

所以我正在编写一个javafx应用程序,我需要能够从列表视图中选择单元格(用于复制粘贴目的),但我不想让它可编辑,我的意思是,除非我愿意(例如,允许通过按钮),否则无法更改内容。

所以我有以下代码:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.cell.TextFieldListCell;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        List<String> contacts = new ArrayList<>(Arrays.asList("968787522","3424234234","2343234324"));
        ListView<String> contactsList = new ListView();
        contactsList.setItems(FXCollections.observableArrayList(contacts));
        //this gives me the ability to edit the row as text field but I want this text field to not be editable
        contactsList.setCellFactory(TextFieldListCell.forListView());
        StackPane pane = new StackPane();
        pane.getChildren().add(contactsList);
        primaryStage.setScene(new Scene(pane, 300, 275));
        primaryStage.show();    }


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

如果我设置&#39; contactsList &#39;因为不可编辑,我无法编辑,也没有选择。

正如您所看到的(图像下方),我正在编辑单元格,但我希望能够选择文本(而不是项目),但我不想删除字符(文本可选但不可编辑)。 enter image description here

3 个答案:

答案 0 :(得分:1)

所以在打破了我的脑袋后,进行了大量的研究和API阅读,我想出了一个解决方案。这完全是我想要做的。如果有人需要,这是演示;) 所以我们的想法是,每当我们想要选择行的内容时,我们需要选择行,获取textField并将编辑设置为true或false(每次)。 因此,在我制作的演示中,我放置了一个按钮,以便您可以将编辑切换为true或false,以确保它正在工作,以及如何工作。

干杯。

我评论了一些代码以便更好地理解,如果您对此有任何疑问,请告诉我。

var app = angular.module('someApp', []);

app.controller('mainCtrl', function($scope, $timeout) {
  $timeout(function() {
    $scope.myObject = {
      type: 'blaat'
    }
  }, 5000);
});

app.controller('createController', function($scope) {
  var vm = this;

  vm.newObject = {
    type: vm.type  
  }; 

  this.$onInit = function () {
    console.log('creating create controller', vm.type);
  };
});

app.component('createSome', {
  templateUrl: 'create.html',
  controller: 'createController as create',
  bindings: {
      type: '='
  }
})

答案 1 :(得分:0)

如果我理解正确,则无需将列表视图设置为“不可编辑”,因为默认行为应足以满足您的需要。看看这段代码,例如:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class NewFXMain extends Application {

    @Override
    public void start(Stage primaryStage) {
        ListView listView = new ListView();
        listView.getItems().addAll("one","two","three","four");

        listView.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                System.out.println(listView.getSelectionModel().getSelectedItem());
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(listView);
        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("ListView Example");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

}

我对ListView的editable-property没有任何改变,但是我可以选择每个项目,而无法编辑它(从更改其值的意义上说)。您可以轻松地将EventHandler添加到ListView以执行您要执行的任何操作。您还可以通过操作CellFactory将ListHandler添加到ListView的每个单元格,如以下答案所示:How to handle ListView item clicked action?

答案 2 :(得分:0)

这对我有用:

    TableView<DataBean> table = new TableView<>();
    table.setItems(...); // list of some DataBean objects with dataBeanField proprty
    table.setEditable(true);

    TableColumn<DataBean, String> column = new TableColumn<>("SomeData");
    column.setCellValueFactory(new PropertyValueFactory<DataBean, String>("dataBeanField"));
    column.setCellFactory(new Callback<TableColumn<DataBean, String>, TableCell<DataBean, String>>() {
        @Override
        public TableCell<DataBean, String> call(TableColumn<DataBean, String> param) {
            return new TextFieldTableCell<>(new DefaultStringConverter() {
                private String defaultValue = "";

                @Override
                public String fromString(String newValue) {
                    return super.fromString(defaultValue);
                }

                @Override
                public String toString(String value) {
                    return defaultValue = super.toString(value);
                }
            });
        }
    });