使用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
我想使用sayCTRL+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 -> {...});