0

のテーブルがありますtable.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);。の最後/最初の行を実装する必要がありTableViewます。使用しtable.scrollTo(ind); table.getSelectionModel().clearAndSelect(ind)ました。これにより、最初の行までスクロールして選択されます。しかし、多数の行を選択しようとすると (マウスの右ボタン + SHIFT を使用)、最初の行と押された行の間の行の範囲は選択されず、選択した行にアンカーが設定されます。

これまでに観察したこと:

  1. 疑似クラス css 情報から。最初の行が選択され、フォーカスされています - これは期待されています。
  2. table.getSelectionModel().selectedIndexProperty() table.getSelectionModel().getSelectedIndices()それぞれ 0 と [0] を示します - これは予想されることです
  3. 行が実際には選択されていません - テーブルがフォーカスされなくなったため、行が青ではなく灰色になりました。でもtable.requestFocus()、いつ電話して使っPlatformUtil.runLater()ても 何も変わりません。したがって、これはテーブルフォーカスとは何の関係もないと思います。

(コードから)最初の行を選択し、SHIFTを使用して他の行でマウスボタンを押した後に複数選択できるようにする方法についてのアイデアはありますか?

サンプル アプリケーション。参照createSelectionControl()->Button("|<")

import javafx.application.Application;
import javafx.beans.binding.StringBinding;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

/**
 * table with standard cell editor
 */
public class SelectionTableApp extends Application {
    private static String ID_DESC_LABEL = "descLabel";
    private TableView<Person> table;
    private static final Person PERSON_STASZEK = new Person("Stanislaw",
            "Czerkawski", "s.czerkawski@wp.pl");
    private final ObservableList<Person> data = FXCollections
            .observableArrayList(
                    new Person("Jacob", "Smith", "jacob.smith@example.com"),
                    new Person("Isabella", "Johnson",
                            "isabella.johnson@example.com"),
                    new Person("Ethan", "Williams",
                            "ethan.williams@example.com"),
                    new Person("Emma", "Jones", "emma.jones@example.com"),
                    new Person("Michael", "Brown", "michael.brown@example.com"),
                    PERSON_STASZEK);
    private TableColumn firstNameCol;
    private TableColumn lastNameCol;
    private TableColumn emailCol;

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

    @Override
    public void start(Stage stage) {
        addData();
        BorderPane root = new BorderPane();
        Scene scene = new Scene(root);
        scene.getStylesheets().add("ks/javafx/table/def/1.css");
        stage.setTitle("Table View Sample");
        stage.setWidth(450);
        stage.setHeight(550);

        final Label label = new Label("Address Book");
        label.setFont(new Font("Arial", 20));
        createTable();
        configureTable(table);

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(createAddPersonControl(),
                createInfoControl(), createSelectionControl());

        root.setTop(label);
        root.setCenter(table);
        root.setBottom(vbox);

        stage.setScene(scene);
        stage.show();

        scene.focusOwnerProperty().addListener((obs, o, n) -> {
            System.out.println("SelectionTableApp.start()=" + n);
        });
    }

    private void addData() {
        for (int i = 0; i < 100; i++) {
            data.add(new Person("first-" + i, "name-" + i, "mail-" + i));
        }
    }

    private void configureTable(TableView<Person> table) {
        table.setEditable(false);
        table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
    }

    private void createTable() {
        table = new TableView<Person>();

        firstNameCol = new TableColumn("First Name");
        firstNameCol.setMinWidth(100);
        firstNameCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>(
                        "firstName"));
        firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        firstNameCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        System.out.println("onEditCommit");
                        t.getTableView().getItems()
                                .get(t.getTablePosition().getRow())
                                .setFirstName(t.getNewValue());
                    }
                });

        lastNameCol = new TableColumn("Last Name");
        lastNameCol.setMinWidth(100);
        lastNameCol
                .setCellValueFactory(new PropertyValueFactory<Person, String>(
                        "lastName"));
        lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        lastNameCol
                .setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
                    @Override
                    public void handle(CellEditEvent<Person, String> t) {
                        System.out.println("onEditCommit");
                        t.getTableView().getItems()
                                .get(t.getTablePosition().getRow())
                                .setLastName(t.getNewValue());
                    }
                });

        emailCol = new TableColumn("Email");
        emailCol.setMinWidth(200);
        emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>(
                "email"));
        emailCol.setCellFactory(TextFieldTableCell.forTableColumn());
        emailCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
            @Override
            public void handle(CellEditEvent<Person, String> t) {
                System.out.println("onEditCommit");
                t.getTableView().getItems().get(t.getTablePosition().getRow())
                        .setEmail(t.getNewValue());
            }
        });

        table.setItems(data);
        table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
    }

    private Node createAddPersonControl() {
        final TextField addFirstName = new TextField();
        addFirstName.setPromptText("First Name");
        addFirstName.setMaxWidth(firstNameCol.getPrefWidth());
        final TextField addLastName = new TextField();
        addLastName.setMaxWidth(lastNameCol.getPrefWidth());
        addLastName.setPromptText("Last Name");
        final TextField addEmail = new TextField();
        addEmail.setMaxWidth(emailCol.getPrefWidth());
        addEmail.setPromptText("Email");

        final Button addButton = new Button("Add");
        addButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {
                data.add(new Person(addFirstName.getText(), addLastName
                        .getText(), addEmail.getText()));
                addFirstName.clear();
                addLastName.clear();
                addEmail.clear();
            }
        });
        final HBox hb = new HBox();
        hb.getChildren().addAll(addFirstName, addLastName, addEmail, addButton);
        hb.setSpacing(3);
        return hb;
    }

    private Node createSelectionControl() {
        Button goFist = new Button("|<");
        goFist.setOnAction(e -> {
            int ind = 0;
            table.scrollTo(ind);
            table.getSelectionModel().clearAndSelect(ind);

            // Bounds local = table.getBoundsInLocal();
            // Bounds sceneBounds = table.localToScene(local);
            // Bounds screenBounds = table.localToScreen(local);
            // System.out.println("SelectionTableApp.createSelectionControl()="
            // +
            // local);
            // System.out.println("SelectionTableApp.createSelectionControl()="
            // +
            // sceneBounds);
            // System.out.println("SelectionTableApp.createSelectionControl()="
            // +
            // screenBounds);
            //
            // double sceneX = sceneBounds.getMinX() + 10;
            // double sceneY = sceneBounds.getMinY() + 10;
            // double screenX = screenBounds.getMinX() + 10;
            // double screenY = screenBounds.getMinX() + 10;
            //
            // sceneX = 21;
            // sceneY = 59;
            // screenX = 760;
            // screenY = 287;
            //
            // MouseEvent me = new MouseEvent(MouseEvent.MOUSE_PRESSED, sceneX,
            // sceneY, screenX, screenY,
            // MouseButton.PRIMARY, 1, false, false, false, false, true, false,
            // false, true, false, false,
            // null);
            // MouseEvent.fireEvent(table, me);
            // me = new MouseEvent(MouseEvent.MOUSE_RELEASED, sceneX, sceneY,
            // screenX, screenY,
            // MouseButton.PRIMARY, 1, false, false, false, false, true, false,
            // false, true, false, false,
            // null);
            // MouseEvent.fireEvent(table, me);
            // me = new MouseEvent(MouseEvent.MOUSE_CLICKED, sceneX, sceneY,
            // screenX, screenY, MouseButton.PRIMARY,
            // 1, false, false, false, false, true, false, false, true, false,
            // false, null);
            // MouseEvent.fireEvent(table, me);
            // Event.fireEvent(YOUR NODE, new
            // MouseEvent(MouseEvent.MOUSE_CLICKED,
            // 0, 0, 0, 0, MouseButton.PRIMARY, 1, true, true, true, true, true,
            // true, true, true, true, true, null));
            // table.fireEvent(event);
        });
        Button goLast = new Button(">|");
        goLast.setOnAction(e -> {
            int ind = table.getItems().size() - 1;
            table.getSelectionModel().clearAndSelect(ind);
            table.scrollTo(ind);
        });
        HBox hbox = new HBox(goFist, goLast);
        return hbox;
    }

    private Node createInfoControl() {
        GridPane grid = new GridPane();
        grid.setHgap(10);
        grid.setVgap(5);

        StringBinding binding = new StringBinding() {
            {
                bind(table.editingCellProperty());
            }

            @Override
            protected String computeValue() {
                TablePosition<Person, ?> pos = table.getEditingCell();
                String ret = (pos != null) ? (pos.getRow() + "." + pos
                        .getColumn()) : "";
                return ret;
            }
        };
        addLabelAndVal("editingCell:", binding, grid, 0, 0);

        addLabelAndVal("table.focused:", table.focusedProperty().asString(),
                grid, 0, 2);
        addLabelAndVal("selM.selected:", table.getSelectionModel()
                .selectedIndexProperty().asString(), grid, 1, 0);
        addLabelAndVal("needsLayout:", table.needsLayoutProperty().asString(),
                grid, 1, 2);

        addLabelAndVal("selected", table.getSelectionModel()
                .getSelectedIndices(), grid, 2, 0);
        return grid;
    }

    private void addLabelAndVal(String labelTxt, ObservableValue<String> val,
            GridPane grid, int rowInd, int colInd) {
        Label lab = new Label(labelTxt);
        lab.setId(ID_DESC_LABEL);
        Label valLab = new Label();
        valLab.textProperty().bind(val);
        grid.add(lab, colInd, rowInd);
        grid.add(valLab, colInd + 1, rowInd);
    }

    private void addLabelAndVal(String labelTxt,
            final ObservableList<Integer> val, GridPane grid, int rowInd,
            int colInd) {
        Label lab = new Label(labelTxt);
        lab.setId(ID_DESC_LABEL);
        Label valLab = new Label();

        val.addListener(new ListChangeListener<Integer>() {
            @Override
            public void onChanged(
                    javafx.collections.ListChangeListener.Change<? extends Integer> c) {
                valLab.setText(val.toString());
            }
        });

        valLab.setText(val.toString());
        grid.add(lab, colInd, rowInd);
        grid.add(valLab, colInd + 1, rowInd);
    }

}

と私のモデル:

import javafx.beans.property.SimpleStringProperty;

public class Person {

    private final SimpleStringProperty firstName;
    private final SimpleStringProperty lastName;
    private final SimpleStringProperty email;

    public Person(String fName, String lName, String email) {
        this.firstName = new SimpleStringProperty(fName);
        this.lastName = new SimpleStringProperty(lName);
        this.email = new SimpleStringProperty(email);
    }

    public String getFirstName() {
        return firstName.get();
    }

    public void setFirstName(String fName) {
        firstName.set(fName);
    }

    public String getLastName() {
        return lastName.get();
    }

    public void setLastName(String fName) {
        lastName.set(fName);
    }

    public String getEmail() {
        return email.get();
    }

    public void setEmail(String fName) {
        email.set(fName);
    }
}
4

0 に答える 0