- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的程序中使用了 tableview 来显示几行,这很好。
我的程序用于会计,如您所知,其中插入了大量数据,我使用了表 View ,但遇到了很多问题:。
问题 1:当用户想要修改一个值时,他将双击以编辑单元格,我希望我的用户选择任何行并开始输入。
问题 2:在我的程序中,用户可能会为一天的工作插入 100 行我需要一种自动添加行的策略,例如,当他插入行时,它应该在当前行下添加一个空行以轻松完成他的数据输入。
请帮我解决这些问题,因为我的用户每天都会输入大量数据。
谢谢。
最佳答案
这是一个例子
import javafx.application.Application;
import javafx.scene.control.TableView;
import javafx.collections.ObservableList;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableCell;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.DoubleProperty;
import javafx.collections.FXCollections;
import javafx.scene.input.KeyEvent;
import javafx.event.EventHandler;
import javafx.scene.control.SelectionMode;
import javafx.scene.input.KeyCode;
import javafx.scene.control.TablePosition;
import javafx.scene.layout.FlowPane;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.util.StringConverter;
import javafx.scene.Scene;
import javafx.scene.control.cell.TextFieldTableCell;
public class InlineEditingWithDynamicRowAdding extends Application {
private final ObservableList<Data> data =
FXCollections.observableArrayList(
new Data(1.,5.),
new Data(2.,6.),
new Data(3.,7.),
new Data(4.,8.)
);
private TableView<Data> table;
@Override
public void start(Stage stage) {
// create edtiable table
table = new TableView<Data>();
table.setEditable(true);
// column 1 contains numbers
TableColumn<Data, Number> number1Col = new TableColumn<>("Number 1");
number1Col.setMinWidth(100);
number1Col.setCellValueFactory( cellData -> cellData.getValue().number1Property());
number1Col.setCellFactory( createNumberCellFactory());
// column 2 contains numbers
TableColumn<Data, Number> number2Col = new TableColumn<>("Number 2");
number2Col.setMinWidth(100);
number2Col.setCellValueFactory( cellData -> cellData.getValue().number2Property());
number2Col.setCellFactory( createNumberCellFactory());
// add columns & data to table
table.setItems(data);
table.getColumns().addAll( number1Col, number2Col);
// switch to edit mode on keypress
// this must be KeyEvent.KEY_PRESSED so that the key gets forwarded to the editing cell; it wouldn't be forwarded on KEY_RELEASED
table.addEventFilter(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if( event.getCode() == KeyCode.ENTER) {
// event.consume(); // don't consume the event or else the values won't be updated;
return;
}
// switch to edit mode on keypress, but only if we aren't already in edit mode
if( table.getEditingCell() == null) {
if( event.getCode().isLetterKey() || event.getCode().isDigitKey()) {
TablePosition focusedCellPosition = table.getFocusModel().getFocusedCell();
table.edit(focusedCellPosition.getRow(), focusedCellPosition.getTableColumn());
}
}
}
});
table.addEventFilter(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
if( event.getCode() == KeyCode.ENTER) {
// move focus & selection
// we need to clear the current selection first or else the selection would be added to the current selection since we are in multi selection mode
TablePosition pos = table.getFocusModel().getFocusedCell();
if (pos.getRow() == -1) {
table.getSelectionModel().select(0);
}
// add new row when we are at the last row
else if (pos.getRow() == table.getItems().size() -1) {
addRow();
}
// select next row, but same column as the current selection
else if (pos.getRow() < table.getItems().size() -1) {
table.getSelectionModel().clearAndSelect( pos.getRow() + 1, pos.getTableColumn());
}
}
}
});
// single cell selection mode
table.getSelectionModel().setCellSelectionEnabled(true);
// add row index column as 1st column
// -------------------------------------
TableColumn<Data, Data> indexCol = new TableColumn<Data, Data>("#");
indexCol.setCellFactory(new Callback<TableColumn<Data, Data>, TableCell<Data, Data>>() {
@Override public TableCell<Data, Data> call(TableColumn<Data, Data> param) {
return new TableCell<Data, Data>() {
@Override protected void updateItem(Data item, boolean empty) {
super.updateItem(item, empty);
if (this.getTableRow() != null) {
int index = this.getTableRow().getIndex();
if( index < table.getItems().size()) {
int rowNum = index + 1;
setText( String.valueOf(rowNum));
} else {
setText("");
}
} else {
setText("");
}
}
};
}
});
table.getColumns().add( 0, indexCol); // number column is at index 0
// allow multi selection
table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
// buttons
// --------------------------------------------
FlowPane buttonBar = new FlowPane();
// add new row button
Button addButton = new Button( "Add");
addButton.setOnAction(e -> {
addRow();
});
addButton.setFocusTraversable(false);// don't let it get the focus or else the table would lose it when we click the button and we's have to request the focus on the table in the event handler
// remove selected rows button
Button removeButton = new Button( "Remove");
removeButton.setOnAction(e -> {
removeSelectedRows();
});
removeButton.setFocusTraversable(false);// don't let it get the focus or else the table would lose it when we click the button and we's have to request the focus on the table in the event handler
buttonBar.getChildren().addAll( addButton, removeButton);
// add nodes to stage
BorderPane root = new BorderPane();
root.setCenter(table);
root.setBottom(buttonBar);
Scene scene = new Scene( root, 800,600);
scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
stage.setScene(scene);
stage.show();
// select first cell
// TODO: why isn't this selecting the 1st cell in the index column?
table.getSelectionModel().selectFirst();
}
/**
* Insert a new default row to the table, select a cell of it and scroll to it.
*/
public void addRow() {
// get current position
TablePosition pos = table.getFocusModel().getFocusedCell();
// clear current selection
table.getSelectionModel().clearSelection();
// create new record and add it to the model
Data data = new Data(0d,0d);
table.getItems().add( data);
// get last row
int row = table.getItems().size() - 1;
table.getSelectionModel().select( row, pos.getTableColumn());
// scroll to new row
table.scrollTo( data);
}
/**
* Remove all selected rows.
*/
public void removeSelectedRows() {
table.getItems().removeAll(table.getSelectionModel().getSelectedItems());
// table selects by index, so we have to clear the selection or else items with that index would be selected
table.getSelectionModel().clearSelection();
}
/**
* Number cell factory which converts strings to numbers and vice versa.
* @return
*/
private Callback<TableColumn<Data, Number>, TableCell<Data, Number>> createNumberCellFactory() {
Callback<TableColumn<Data, Number>, TableCell<Data, Number>> factory = TextFieldTableCell.forTableColumn( new StringConverter<Number>() {
@Override
public Number fromString(String string) {
return Double.parseDouble(string);
}
@Override
public String toString(Number object) {
return object.toString();
}
});
return factory;
}
/**
* Table data container
*/
public static class Data {
private final SimpleDoubleProperty number1;
private final SimpleDoubleProperty number2;
private Data( Double number1, Double number2) {
this.number1 = new SimpleDoubleProperty(number1);
this.number2 = new SimpleDoubleProperty(number2);
}
public final DoubleProperty number1Property() {
return this.number1;
}
public final double getNumber1() {
return this.number1Property().get();
}
public final void setNumber1(final double number1) {
this.number1Property().set(number1);
}
public final DoubleProperty number2Property() {
return this.number2;
}
public final double getNumber2() {
return this.number2Property().get();
}
public final void setNumber2(final double number2) {
this.number2Property().set(number2);
}
}
public static void main(String[] args) {
launch(args);
}
}
/* edit cell appearance */
/* If the padding is 0, then there's a grey area. If you set it to 2, then there won't be a great area.
* However if you use a border color, then the border requires its size, so the padding is set to 2 - 1 = 1.
* You have to toy around with the border. If necessary give it a width of 2 and make it the same color as the background color.
*/
.text-field-table-cell .text-field {
-fx-padding: 1;
-fx-border-color:red;
-fx-border-width:1;
-fx-background-color:yellow;
}
.table-cell:focused {
-fx-padding: 0;
}
/* right-align the cell content in view mode */
.table-cell {
-fx-alignment: CENTER-RIGHT;
}
/* right-align the cell content in edit mode */
.text-field {
-fx-alignment: CENTER-RIGHT;
}
/* colorize background only of rows which have data */
.table-row-cell:empty {
-fx-background-color: white;
}
.table-row-cell:empty .table-cell {
-fx-border-width: 0px;
}
关于JavaFX TableView 通过单击和自动插入行进行编辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29707487/
我在选项卡中有我的网络应用程序的选项。 aaa bbb ccc ddd eee 当用户单击任何选项卡(在同一窗口中)时,我会使用此代码获得淡出效果,然后自动
如何获得一个简单的调用单击来实现如下功能:http://jsfiddle.net/ftwPS/6/我显然错过了一些基本的东西,因为当您单击“CLICK”时这不起作用。 $('tr').click(fu
我有一个列表,在左侧显示一个插入符号图标,单击它时应该更改图标。每当我单击一个图标时,所有图标都会更改。 detailedInfo = []; subordinateInfo; openSu
我有一个 div,我想对其进行设置,以便当我单击其他内容时,它会隐藏该 div。 我也是这样 $('body').click(function(){ if(loginOpened) {
我有很多装有不同内容的盒子。 如果单击第一个框,您可以看到一个包含更多详细信息的弹出框。如果单击第二个、第三个等框,您必须查看这些框的详细信息。 我的问题:如果我点击框号。 2 我看到了盒子号的详细信
当我点击 .add-btn 时,我将 .add-btn 的样式更改为 background:#cccccc 并将 val() 更改为“-”。 现在当我用 tr td .list 删除添加的文本时,它是
感谢 SO 的出色贡献者!当您开始了解 jQuery 时,它会变得更酷。 :) 所以我有一个 LI,单击时会显示/隐藏子 UL。我想做的是能够单击 LI 内的链接,打开一个空白窗口,但也不会关闭子 U
我有这份文档,它使我能够获得一份带有点击进度的多项选择选择调查问卷。 如何用图像代替此处的文字? (并且仍然有这样的机制,一旦单击[图像],就会提出下一个问题) 我已经尝试使用 UL/H1 设置背景图
我想在 JQGrid 的刷新按钮单击上编写代码。有什么事件吗? 最佳答案 如果您需要在开始刷新之前执行一些操作,您应该使用 beforeRefresh打回来: $("#grid_id").jqGrid
问题是将对象或多个参数从模板传递到组件,并使用它们将数据添加到 API。 任务.service.ts addTasks(task: Task): Observable{ let headers =
我有一个像这样的primefaces选项卡 View : This tab has static content. this t
我在 jquery 中有一个有效的 a.click() 函数...但是如果我单击一个 anchor ,我会打开一个新窗口...但是我怎样才能阻止浏览器本身打开一个新窗口? 示例: $('a')
有没有简单的方法来创建代码:如果 URL 更改或单击链接显示 div(例如加载 gif 3 秒),则显示页面?有点像空白的白色页面,加载 gif 旋转 3 秒然后显示页面? 谢谢! 最佳答案 给定 G
我需要知道此时按钮的状态是否被点击? 谢谢 最佳答案 if (myButton.state & UIControlStateHighlighted) { // Do your stuff the
我正在 NSImageView 上绘制一条 NSBezierPath 线。我正在创建 NSBezierPath 对象,设置 moveToPoint,设置 lineToPoint,设置 setLineW
我的 Selenium 代码存在问题,无法正确执行按键 + 单击操作。 测试应打开 jqueryui.com 链接并选择页面上的前 2 个 li 元素。 我正在使用 Selenium 2.23 和 F
单击时我将更改字符串一部分的样式。例如“TEXT”,然后单击“T”,之后它会将样式从黑色更改为红色,仅 T在我的代码中,当我单击文本时,我拆分文本并保留在“split”数组中,它将调用handleCl
我在网站上有一个 anchor 。当有人点击它时,我在 jquery 中执行一些操作并更改名称,但是当再次单击它时,事件被触发,尽管我已经更改了它的名称。代码在这里: $(".like_cont a[
我有一个下载链接Download我希望每次当有人点击“下载”时,我都可以将其插入数据库total_downloads+1。为了插入数据库,我通常使用 然后 if (isset($_POST['d
我是一名优秀的程序员,十分优秀!