使用JAVAFX在TableView中粘贴文本数据

使用JAVAFX在TableView中粘贴文本数据,javafx,tableview,Javafx,Tableview,我有一个TableView,它通过单个单元格编辑接受数据。现在我还想通过粘贴文件来输入数据,如下所示 11.12 23.32 15.43 22.23 24.45 26.65 我想使用sayCTRL+V粘贴数据。我已经看到过类似或的帖子。我无法粘贴多行的数据 这里我给出了主要代码 package testmatrix; import javafx.application.Application; import javafx.collections.*; import jav

我有一个
TableView
,它通过单个单元格编辑接受数据。现在我还想通过粘贴文件来输入数据,如下所示

11.12    23.32   15.43
22.23    24.45   26.65
我想使用say
CTRL+V
粘贴数据。我已经看到过类似或的帖子。我无法粘贴多行的数据

这里我给出了主要代码

package testmatrix;

import javafx.application.Application;
import javafx.collections.*;
import javafx.event.*;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.*;
import javafx.scene.control.cell.*;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class TestMATRIX extends Application {
TableView<CommonDataClass> matrixData = new TableView<CommonDataClass>();
final ObservableList<CommonDataClass> matData = FXCollections.
        observableArrayList();
TableColumn[] matrixDataColumns = new TableColumn[6];
int numColVal = 0;
int theNDX = 0;
int maxRowNum = 0;
TextField TC1 = new TextField();
TextField TC2 = new TextField();
TextField TC3 = new TextField();
TextField TC4 = new TextField();
TextField TC5 = new TextField();
TextField TC6 = new TextField();
boolean numColStatus = false;
int oldRowVal = 0;
int oldColVal = 0;
boolean newRow = false;
boolean newCol = false;

@Override
public void start(Stage primaryStage) {
    final BorderPane root = new BorderPane();

    TextField myTextField = new TextField();
    Label colL = new Label("Column Number->");
    TextField colNumT = new TextField();
    Button getNum = new Button("SET");
    colNumT.setMaxWidth(40);
    TableUtils.doCopyPasteHandler (matrixData, matData);
    matrixData.setVisible(true);
    matrixData.setEditable(true);
    matrixData.getSelectionModel().setCellSelectionEnabled(true);
    matrixData.getSelectionModel ().setSelectionMode (SelectionMode.MULTIPLE);

    HBox hb1 = new HBox();
    HBox hb2 = new HBox();
    hb1.getChildren().add(matrixData);
    hb2.getChildren().addAll(colL, colNumT, getNum);

    root.setCenter(hb1);
    root.setRight(hb2);
    getNum.addEventHandler(ActionEvent.ACTION, e -> {
        numColStatus = (colNumT.getText().isEmpty()) ? false : true;
        numColVal = (numColStatus) ? Integer.parseInt(colNumT.getText()): 0;

        if (numColStatus) {
            addRowBelow();
            matrixData.getColumns ().clear ();
            for (int ii = 0; ii < numColVal; ii++) {
                matrixDataColumns[ii] = createCol(ii);
                editCommit(ii);
            }
            matrixData.setItems(matData);
            if (numColStatus) {
                for (int ii = 0; ii < numColVal; ii++) {
                    matrixData.getColumns().add(matrixDataColumns[ii]);
                }
            }
            matrixData.refresh();
        }
    });
    Scene scene = new Scene(root, 1200, 400);
    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}

TableColumn<CommonDataClass, String> createCol(int icol) {
    TableColumn<CommonDataClass, String> column = new TableColumn<>();
    column.setMinWidth(30);
    column.setStyle(
            "-fx-alignment: CENTER-RIGHT;-fx-font-family: monospace; -fx-font-size: 10px; ");
    String nameC = "myD" + (icol + 1);
    System.out.println("colName->" + nameC);
    column.setCellValueFactory(
            new PropertyValueFactory<CommonDataClass, String>(nameC));

    column.setCellFactory(
            new DragSelectionCellFactory<CommonDataClass, String>(TextFieldTableCell.forTableColumn()
            )
    );
    column.setMinWidth(120);
    return column;
}

private void editCommit(int ii) {
    System.out.println("Command came here");
    matrixDataColumns[ii].setOnEditCommit(
            new EventHandler<CellEditEvent<CommonDataClass, String>>() {
        @Override
        public void handle(CellEditEvent<CommonDataClass, String> event) {
            int colNum = event.getTablePosition().getColumn();
            switch (colNum) {
                case 0:
                    event.getTableView().getItems().get(event.getTablePosition().getRow()).setMyD1(event.getNewValue());
                    break;
                case 1:
                    event.getTableView().getItems().get(event.getTablePosition().getRow()).setMyD2(event.getNewValue());
                    break;
                case 2:
                    event.getTableView().getItems().get(event.getTablePosition().getRow()).setMyD3(event.getNewValue());
                    break;
                case 3:
                    event.getTableView().getItems().get(event.getTablePosition().getRow()).setMyD4(event.getNewValue());
                    break;
                case 4:
                    event.getTableView().getItems().get(event.getTablePosition().getRow()).setMyD5(event.getNewValue());
                    break;
                case 5:
                    event.getTableView().getItems().get(event.getTablePosition().getRow()).setMyD6(event.getNewValue());
                    break;
            }
            matrixData.setItems(matData);
            matrixData.refresh();               
            if (!event.getNewValue().isEmpty()) {
                addRowBelow();
            }
        }
    });
}

void addRowBelow() {
    matData.add(new CommonDataClass(
            TC1.getText(), TC2.getText(), TC3.getText(),
            TC4.getText(), TC5.getText(), TC6.getText()
    ));
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}
这里我给出了单元格的
DrageSelection
代码

package testmatrix;
import javafx.scene.control.TableCell;
import javafx.scene.input.*;

public class DragSelectionCell extends TableCell<CommonDataClass, String> {

public DragSelectionCell() {
    setOnDragDetected ((MouseEvent event) -> {
        startFullDrag ();
        getTableColumn ().getTableView ().getSelectionModel ().select (
                getIndex (), getTableColumn ());
    });
    setOnMouseDragEntered ((MouseDragEvent event) -> {
        getTableColumn ().getTableView ().getSelectionModel ().select (
                getIndex (), getTableColumn ());
    });
}

@Override
public void updateItem(String item, boolean empty) {
    super.updateItem (item, empty);
    if ( empty ) {
        setText (null);
    } else {
        setText (item);
    }
}
}
下面的代码块描述了类似于前面提到的复制/粘贴例程的表实用程序。然而,粘贴部分不起作用,所以我试图修改。现在我完全糊涂了。复制部分正在复制,而按照上面参考中显示的代码粘贴部分无法粘贴所有行和列

package testmatrix;
import java.util.StringTokenizer;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.*;
import javafx.event.EventHandler;
import javafx.scene.control.*;
import javafx.scene.input.*;

public class TableUtils extends TableCell<CommonDataClass, String> {
ObservableList<CommonDataClass> datTab = FXCollections.
        observableArrayList ();

public static void doCopyPasteHandler(TableView<?> table,
        ObservableList<CommonDataClass> myData) {

    table.setOnKeyPressed (new TableKeyEventHandler ());
}

public static class TableKeyEventHandler implements EventHandler<KeyEvent> {
    KeyCodeCombination copyCode = new KeyCodeCombination (KeyCode.C,
            KeyCodeCombination.CONTROL_ANY);
    KeyCodeCombination pasteCode = new KeyCodeCombination (KeyCode.V,
            KeyCodeCombination.CONTROL_ANY);

    //@Override
    public void handle(KeyEvent event) {
        if ( copyCode.match (event) ) {
            if ( event.getSource () instanceof TableView ) {
                copySelection2Clipboard ((TableView<?>) event.getSource ());  // this will copy to clipboard
                event.consume (); // After using event please consume
            }
        } else if ( pasteCode.match (event) ) {
            if ( event.getSource () instanceof TableView ) {
                pasteFromClipboard ((TableView<?>) event.getSource ());
                event.consume ();
            }
        }
    }
}

public static void copySelection2Clipboard(TableView<?> table) {
    StringBuilder clipboardString = new StringBuilder ();
    ObservableList<TablePosition> positionList = table.getSelectionModel ().
            getSelectedCells ();
    int prevRow = -1;
    for ( TablePosition pos : positionList ) {
        int row = pos.getRow ();
        int col = pos.getColumn ();
        if ( prevRow == row ) {    // determine whether we advance in a row or col (newline)
            clipboardString.append ('\t');
        } else if ( prevRow != -1 ) {
            clipboardString.append ('\n');
        }
        String text = "";
        Object obsValue = (Object) table.getColumns ().get (col).
                getCellObservableValue (row);
        if ( obsValue == null ) {
            text = "";
        } else if ( obsValue instanceof StringProperty ) {
            text = ((StringProperty) obsValue).get ();
        } else {
            System.out.println ("Unsupported observable value: " + obsValue);
        }
        clipboardString.append (text);
        prevRow = row;
    }
    ClipboardContent clipboardContent = new ClipboardContent ();
    clipboardContent.putString (clipboardString.toString ());
}


public static void pasteFromClipboard(TableView<?> table) {
    if ( table.getSelectionModel ().getSelectedCells ().size () == 0 ) {
        return;
    }
    TablePosition pasteCellPosition = table.getSelectionModel ().
            getSelectedCells ().get (0);     // get cell position at start
    String pasteString = Clipboard.getSystemClipboard ().getString ();
    StringTokenizer rowTokenizer = new StringTokenizer (pasteString, "\n");
    int rowNum = rowTokenizer.countTokens () + 1;
    int rowCB = -1;
    while (rowTokenizer.hasMoreTokens ()) {
        rowCB++;
        String rowString = rowTokenizer.nextToken ();
        StringTokenizer colTokenizer = new StringTokenizer (rowString, "\t");
        int colCB = -1;
        while (colTokenizer.hasMoreTokens ()) {
            colCB++;
            String clpCellCont = colTokenizer.nextToken ();
            int rowTable = pasteCellPosition.getRow () + rowCB;
            int colTable = pasteCellPosition.getColumn () + colCB;
            if ( rowTable >= table.getItems ().size () ) {
                continue;
            }
            if ( colTable >= table.getColumns ().size () ) {
                continue;
            }

            TableColumn tabCol = table.getVisibleLeafColumn (colTable);
            ObservableValue obsVal = tabCol.
                    getCellObservableValue (rowTable);               
        }

    }
}
包测试矩阵;
导入java.util.StringTokenizer;
导入javafx.beans.property.StringProperty;
导入javafx.beans.value.observeValue;
导入javafx.collections.*;
导入javafx.event.EventHandler;
导入javafx.scene.control.*;
导入javafx.scene.input.*;
公共类TableUtils扩展了TableCell{
ObservableList datTab=FXCollections。
可观察的列表();
公共静态void doCopyPasteHandler(TableView表,
可观察列表(myData){
table.setOnKeyPressed(新的TableKeyEventHandler());
}
公共静态类TableKeyEventHandler实现EventHandler{
KeyCodeCombination copyCode=新的KeyCodeCombination(KeyCode.C,
keycodecompbination.CONTROL_ANY);
KeyCodeCombination pasteCode=新的KeyCodeCombination(KeyCode.V,
keycodecompbination.CONTROL_ANY);
//@凌驾
公共无效句柄(KeyEvent事件){
if(copyCode.match(事件)){
if(event.getSource()instanceof TableView){
copySelection2Clipboard((TableView)event.getSource());//这将复制到剪贴板
event.consume();//使用event后请使用
}
}else if(pasteCode.match(事件)){
if(event.getSource()instanceof TableView){
pasteFromClipboard((TableView)event.getSource());
event.consume();
}
}
}
}
公共静态无效copySelection2Clipboard(TableView表格){
StringBuilder clipboardString=新的StringBuilder();
ObservableList positionList=table.getSelectionModel()。
getSelectedCells();
int prevRow=-1;
用于(表位置:位置列表){
int row=pos.getRow();
int col=pos.getColumn();
如果(prevRow==row){//确定是在行中前进还是在行中前进(换行)
clipboardString.append('\t');
}否则如果(上一行!=-1){
clipboardString.append('\n');
}
字符串文本=”;
对象obsValue=(对象)table.getColumns().get(col)。
getCellObservableValue(行);
if(obsValue==null){
text=“”;
}else if(obsValue instanceof StringProperty){
text=((StringProperty)obsValue.get();
}否则{
System.out.println(“不支持的可观察值:”+obsValue);
}
clipboardString.append(文本);
prevRow=行;
}
ClipboardContent ClipboardContent=新的ClipboardContent();
clipboardContent.putString(clipboardString.toString());
}
公共静态无效粘贴来自剪贴板(TableView表格){
if(table.getSelectionModel().getSelectedCells().size()=0){
回来
}
TablePosition pasteCellPosition=table.getSelectionModel()。
getSelectedCells().get(0);//获取开始时的单元格位置
String pasteString=Clipboard.getSystemClipboard().getString();
StringTokenizer rowTokenizer=新的StringTokenizer(粘贴字符串,“\n”);
int rowNum=rowTokenizer.countTokens()+1;
int rowCB=-1;
while(rowtokenezer.hasMoreTokens()){
rowCB++;
String rowString=rowtokener.nextToken();
StringTokenizer colTokenizer=新的StringTokenizer(行字符串“\t”);
int colCB=-1;
while(colTokenizer.hasMoreTokens()){
colCB++;
字符串clpCellCont=colTokenizer.nextToken();
int rowTable=pasteCellPosition.getRow()+rowCB;
int colTable=pasteCellPosition.getColumn()+colCB;
if(rowTable>=table.getItems().size()){
持续
}
if(colTable>=table.getColumns().size()){
持续
}
TableColumn tabCol=table.getVisibleLeafColumn(colTable);
observeValue obsVal=tabCol。
getCellObservableValue(行表);
}
}
}
}


如果我能得到任何帮助,那将是非常有帮助的。感谢并问候

您无法插入值,因为事件处理程序中没有分配值的代码

此外,您不使用属性,这使得事情更加复杂

如果您确实使用了属性

TableColumn<CommonDataClass, String> createCol(int icol) {
    ...
    column.setCellValueFactory(
            cd -> cd.getValue().dataNameProperty(icol));
此外,复制内容将不起作用,因为您忘记设置剪贴板内容:

ClipboardContent clipboardContent = new ClipboardContent();
clipboardContent.putString(clipboardString.toString());
Clipboard.getSystemClipboard().setContent(clipboardContent);
此外,无法保证所选单元格位于矩形区域中。按住Ctrl键可以任意选择单元格

可以(在这种情况下,IMHO应该)替换为

getNum.setOnAction(e -> {...});

首先,我非常感谢你宝贵的时间和耐心。我听了你的意见。我希望输入数据,例如
11.12 23.32 15.43\n 22.23 24.45 26.65
。现在,代码粘贴第一行
11.12 23.32 15.43
,而不插入用于粘贴其余行的新行。您能检查一下吗?@vegaonline您在表中添加了多少行?如果只单击一次按钮,则没有第二行可供插入的项目…我首先在剪贴板中复制了两行。我选择了3列
public static <T> void pasteFromClipboard(TableView<T> table) {
    if (table.getSelectionModel().getSelectedCells().isEmpty()) {
        return;
    }
    TablePosition pasteCellPosition = table.getSelectionModel().
            getSelectedCells().get(0);     // get cell position at start

    Clipboard cb = Clipboard.getSystemClipboard();

    // check, if clipboard contains a string
    if (!cb.hasString()) {
        return;
    }

    String pasteString = cb.getString();
    String[][] values = Stream.of(pasteString.split("\r?\n"))
            .map(line -> line.split("\t")).toArray(String[][]::new);

    final int offsetY = pasteCellPosition.getRow();
    final int offsetX = pasteCellPosition.getColumn();
    final int maxY = Math.min(table.getItems().size() - offsetY, values.length);
    final int colMax = table.getColumns().size() - offsetX;

    for (int y = 0; y < maxY; y++) {
        String[] r = values[y];
        final int maxX = Math.min(colMax, r.length);
        T rowObject = table.getItems().get(y+offsetY);
        for (int x = 0; x < maxX; x++) {
            Object property = table.getColumns().get(x + offsetX).getCellObservableValue(rowObject);
            if (property instanceof StringProperty) {
                // write value using the property
                ((StringProperty) property).set(r[x]);
            }
        }
    }
}
public class DragSelectionCellFactory implements
    Callback<TableColumn<CommonDataClass, String>, TableCell<CommonDataClass, String>> {
ClipboardContent clipboardContent = new ClipboardContent();
clipboardContent.putString(clipboardString.toString());
Clipboard.getSystemClipboard().setContent(clipboardContent);
getNum.addEventHandler(ActionEvent.ACTION, e -> {...});
getNum.setOnAction(e -> {...});