Javafx选择多行
我试图在JavaFX中选择多行,但我不想使用键盘(即SHIFT键)来实现这一点。它应该在我点击它之后被选中,当我点击另一列时,它也应该被选中 我在这里查了一些其他的答案,但我找不到简短而方便的答案。有没有较短的方法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
@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;
}
});