Javafx选择多行

Javafx选择多行,java,javafx,tableview,Java,Javafx,Tableview,我试图在JavaFX中选择多行,但我不想使用键盘(即SHIFT键)来实现这一点。它应该在我点击它之后被选中,当我点击另一列时,它也应该被选中 我在这里查了一些其他的答案,但我找不到简短而方便的答案。有没有较短的方法 @FXML private static Logger logger = Logger.getLogger(MainFrameControl.class); public TableView<Box> boxTable; protected final Observa

我试图在JavaFX中选择多行,但我不想使用键盘(即SHIFT键)来实现这一点。它应该在我点击它之后被选中,当我点击另一列时,它也应该被选中

我在这里查了一些其他的答案,但我找不到简短而方便的答案。有没有较短的方法

@FXML 
private static Logger logger = Logger.getLogger(MainFrameControl.class);

public TableView<Box> boxTable;
protected final ObservableList<Box> boxData = FXCollections.observableArrayList();

Service service = new ServiceImpl();
private Stage mainStage;

public MainFrameControl(Stage mainStage) {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MainFrame.fxml"));
    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);
    this.mainStage = mainStage;

    Stage stage = new Stage();
    try {
        fxmlLoader.load();  
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
    ArrayList<Box> list = service.findAllBoxen();

    TableColumn<Box, String> boxnameColumn = (TableColumn<Box, String>) boxTable.getColumns().get(0);
    boxnameColumn.setCellValueFactory(new PropertyValueFactory<Box, String>("boxName"));

    TableColumn<Box, String> sizeColumn = (TableColumn<Box, String>) boxTable.getColumns().get(1);
    sizeColumn.setCellValueFactory(new PropertyValueFactory<Box, String>("size"));
    
    TableColumn<Box, String> windowColumn = (TableColumn<Box, String>) boxTable.getColumns().get(2);
    windowColumn.setCellValueFactory(new PropertyValueFactory<Box, String>("window"));
    
    TableColumn<Box, String> costColumn = (TableColumn<Box, String>) boxTable.getColumns().get(3);
    costColumn.setCellValueFactory(new PropertyValueFactory<Box, String>("cost"));

    TableColumn<Box, String> locationColumn = (TableColumn<Box, String>) boxTable.getColumns().get(4);
    locationColumn.setCellValueFactory(new PropertyValueFactory<Box, String>("location"));

    TableColumn<Box, Boolean> beddingColumn = (TableColumn<Box, Boolean>) boxTable.getColumns().get(5);
    beddingColumn.setCellValueFactory(new PropertyValueFactory<Box, Boolean>("bedding"));
    
    boxTable.setItems(boxData);
@FXML
专用静态记录器=Logger.getLogger(MainFrameControl.class);
公共表查看boxTable;
受保护的最终ObservableList boxData=FXCollections.observableArrayList();
服务=新的ServiceImpl();
私人舞台主体;
公共主框架控制(阶段主体){
FXMLLoader FXMLLoader=新的FXMLLoader(getClass().getResource(“MainFrame.fxml”);
fxmlLoader.setRoot(此);
fxmlLoader.setController(此);
this.mainStage=mainStage;
阶段=新阶段();
试一试{
fxmloader.load();
}捕获(IOException异常){
抛出新的RuntimeException(异常);
}
ArrayList list=service.findallbox();
TableColumn boxnameColumn=(TableColumn)boxTable.getColumns().get(0);
setCellValueFactory(新属性ValueFactory(“boxName”);
TableColumn sizeColumn=(TableColumn)boxTable.getColumns().get(1);
sizeColumn.setCellValueFactory(新属性ValueFactory(“大小”);
TableColumn windowColumn=(TableColumn)boxTable.getColumns().get(2);
setCellValueFactory(新属性ValueFactory(“窗口”);
TableColumn costColumn=(TableColumn)boxTable.getColumns().get(3);
costColumn.setCellValueFactory(新属性ValueFactory(“成本”));
TableColumn locationColumn=(TableColumn)boxTable.getColumns().get(4);
locationColumn.setCellValueFactory(新属性ValueFactory(“位置”);
TableColumn beddingColumn=(TableColumn)boxTable.getColumns().get(5);
beddingColumn.setCellValueFactory(新属性ValueFactory(“bedding”));
设置项(boxData);

这只是您可能要寻找的基本概念。可能需要一些改进,但我不清楚其预期用途

import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TableTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        ObservableList<LineItem> items = FXCollections.observableArrayList();
        items.addAll(new LineItem("hello",123.45),
                     new LineItem("paid in full",0.01),
                     new LineItem("paid",0.01),
                     new LineItem("due",0.01),
                     new LineItem("paid",0.01));

        ObservableList<LineItem> filteredItems = FXCollections.observableArrayList(items);
        TableView<LineItem> tableView = new TableView<>(filteredItems);
        ObservableList<TablePosition> selectedCells = FXCollections.observableArrayList();

        Button multi = new Button("Multi-select");
        multi.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                multi.setText((multi.getText().equals("Multi-select"))?"Single-select":"Multi-select");
                selectedCells.clear();
            }
        });

        TableColumn<LineItem,String> descCol = new TableColumn<>("desc");
        descCol.setCellValueFactory(new PropertyValueFactory<>("desc"));

        TableColumn<LineItem, Double> amountCol = new TableColumn<>("amount");
        amountCol.setCellValueFactory(new PropertyValueFactory<>("amount"));

        tableView.getColumns().addAll(descCol,amountCol);
        tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        tableView.getSelectionModel().setCellSelectionEnabled(true);

        //maybe you want onTouchPressed here for tablet
        tableView.setOnMousePressed(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                if (multi.getText().equals("Single-select")) return;
                selectedCells.add(
                    tableView.getSelectionModel().getSelectedCells().get(
                        tableView.getSelectionModel().getSelectedCells().size()-1
                    )
                );
                for (TablePosition tp : selectedCells){
                    tableView.getSelectionModel().select(tp.getRow(), tp.getTableColumn());
                }
            }
        });

        VBox root = new VBox();
        root.getChildren().addAll(tableView, multi);
        Scene scene = new Scene(root, 300, 300);

        primaryStage.setTitle("multi select table test");
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public class LineItem {

        private final StringProperty desc = new SimpleStringProperty();
        private final DoubleProperty amount = new SimpleDoubleProperty();

        public StringProperty descProperty() {return desc;}
        public DoubleProperty amountProperty() {return amount;}

        public LineItem(String dsc, double amt) {
            desc.set(dsc); amount.set(amt);
        }
    }

}
导入javafx.application.application;
导入javafx.beans.property.DoubleProperty;
导入javafx.beans.property.SimpleDoubleProperty;
导入javafx.beans.property.SimpleStringProperty;
导入javafx.beans.property.StringProperty;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.SelectionMode;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TablePosition;
导入javafx.scene.control.TableView;
导入javafx.scene.control.cell.PropertyValueFactory;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类TableTest扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
ObservableList items=FXCollections.observableArrayList();
items.addAll(新的行项目(“hello”,123.45),
新的行项目(“全额支付”,0.01),
新的行项目(“已付”,0.01),
新的行项目(“到期日”,0.01),
新的行项目(“已支付”,0.01);
ObservableList filteredItems=FXCollections.observableArrayList(项目);
TableView TableView=新的TableView(filteredItems);
ObservableList selectedCells=FXCollections.observableArrayList();
按钮多=新按钮(“多选择”);
multi.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
multi.setText((multi.getText().equals(“多选择”)?“单选择”:“多选择”);
selectedCells.clear();
}
});
TableColumn descCol=新的TableColumn(“desc”);
描述setCellValueFactory(新属性值工厂(“描述”);
TableColumn amountCol=新的TableColumn(“金额”);
金额setCellValueFactory(新属性ValueFactory(“金额”);
tableView.getColumns().addAll(descCol,amountCol);
tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
tableView.getSelectionModel().setCellSelectionEnabled(true);
//也许你想在这里买平板电脑
setOnMousePressed(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
if(multi.getText().equals(“Single select”))返回;
selectedCells.add(
tableView.getSelectionModel().getSelectedCells().get(
tableView.getSelectionModel().getSelectedCells().size()-1
)
);
用于(表格位置tp:selectedCells){
tableView.getSelectionModel().select(tp.getRow(),tp.getTableColumn());
}
}
});
VBox root=新的VBox();
root.getChildren().addAll(tableView,多视图);
场景=新场景(根,300,300);
setTitle(“多选表测试”);
初级阶段。场景(场景);
primaryStage.show();
}
公共类行项目{
私有最终StringProperty desc=新SimpleStringProperty();
私有最终DoubleProperty金额=新SimpleDoubleProperty();
public StringProperty descProperty(){return desc;}
public DoubleProperty amountProperty(){return amount;}
公共行项目(字符串dsc,双倍金额){
描述集(dsc);金额集(amt);
}
}
}
定制是解决此问题的好方法:

boxTable.setRowFactory(new Callback<TableView<Box>, TableRow<Box>>() {
    @Override
    public TableRow<Box> call(TableView<Box> tableView2)
    {
        final TableRow<Box> row = new TableRow<>();

        row.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event)
            {
                final int index = row.getIndex();

                if (index >= 0 && index < boxTable.getItems().size())
                {
                    if(boxTable.getSelectionModel().isSelected(index))
                        boxTable.getSelectionModel().clearSelection(index);
                    else
                        boxTable.getSelectionModel().select(index);

                    event.consume();
                }
            }
        });
        return row;
    }
});
boxTable.setRowFactory(新回调(){
@凌驾
公共TableRow调用(TableView tableView2)
{
最终TableRow行=新TableRow();
row.addEventFilter(MouseEvent.MOUSE_按下,新事件处理程序(
boxTable.setRowFactory(new Callback<TableView<Box>, TableRow<Box>>() {
    @Override
    public TableRow<Box> call(TableView<Box> tableView2)
    {
        final TableRow<Box> row = new TableRow<>();

        row.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event)
            {
                final int index = row.getIndex();

                if (index >= 0 && index < boxTable.getItems().size())
                {
                    if(boxTable.getSelectionModel().isSelected(index))
                        boxTable.getSelectionModel().clearSelection(index);
                    else
                        boxTable.getSelectionModel().select(index);

                    event.consume();
                }
            }
        });
        return row;
    }
});