- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个类 ExtendedTableView
通过扩展TableView
,我想允许用户创建一个带有预设设置的扩展TableView,并允许单元格可编辑。以下是简要显示如何编辑单元格的代码部分:
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle("Table View Sample");
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
//Create a customer cell factory so that cells can support editing.
Callback<TableColumn, TableCell> cellFactory = new Callback<TableColumn, TableCell>() {
@Override
public TableCell call(TableColumn p) {
return new EditingCell();
}
};
//Set up the columns
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth( 100 );
firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
firstNameCol.setCellFactory(cellFactory);
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setMinWidth( 100 );
lastNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName"));
lastNameCol.setCellFactory(cellFactory);
// lastNameCol.setEditable( false );
TableColumn emailCol = new TableColumn("Email");
emailCol.setMinWidth(400);
TableColumn primaryEmailCol = new TableColumn("Primary Email");
primaryEmailCol.setMinWidth(200);
primaryEmailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("primaryEmail"));
primaryEmailCol.setCellFactory(cellFactory);
//Make this column un-editable
primaryEmailCol.setEditable( false );
TableColumn secondaryEmailCol = new TableColumn("Secondary Email");
secondaryEmailCol.setMinWidth(200);
secondaryEmailCol.setCellValueFactory(new PropertyValueFactory<Person, String>("secondaryEmail"));
secondaryEmailCol.setCellFactory(cellFactory);
// secondaryEmailCol.setEditable( false );
emailCol.getColumns().addAll(primaryEmailCol, secondaryEmailCol);
//Add the columns and data to the table.
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
//Make the table editable
table.setEditable(true);
//Modifying the firstName property
firstNameCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
@Override
public void handle(CellEditEvent<Person, String> t) {
((Person) t.getTableView().getItems().get(t.getTablePosition().getRow())).setFirstName(t.getNewValue());
}
});
//Modifying the lastName property
lastNameCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
@Override
public void handle(CellEditEvent<Person, String> t) {
((Person) t.getTableView().getItems().get(t.getTablePosition().getRow())).setLastName(t.getNewValue());
}
});
//Modifying the primary email property
primaryEmailCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
@Override
public void handle(CellEditEvent<Person, String> t) {
((Person) t.getTableView().getItems().get(t.getTablePosition().getRow())).setPrimaryEmail(t.getNewValue());
}
});
//Modifying the secondary email property
secondaryEmailCol.setOnEditCommit(new EventHandler<CellEditEvent<Person, String>>() {
@Override
public void handle(CellEditEvent<Person, String> t) {
((Person) t.getTableView().getItems().get(t.getTablePosition().getRow())).setSecondaryEmail(t.getNewValue());
}
});
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.getChildren().addAll(label, table);
vbox.setPadding(new Insets(10, 0, 0, 10));
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public class EditingCell extends TableCell<Person, String> {
private TextField textField;
public EditingCell() {
}
@Override
public void startEdit() {
super.startEdit();
if (textField == null) {
createTextField();
}
setGraphic(textField);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
Platform.runLater(new Runnable() {
@Override
public void run() {
textField.requestFocus();
textField.selectAll();
}
});
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText((String) getItem());
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
if (textField != null) {
textField.setText(getString());
}
setGraphic(textField);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
} else {
setText(getString());
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
}
}
private void createTextField() {
textField = new TextField(getString());
textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
textField.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
if (t.getCode() == KeyCode.ENTER) {
commitEdit(textField.getText());
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
} else if (t.getCode() == KeyCode.TAB) {
commitEdit(textField.getText());
TableColumn nextColumn = getNextColumn(!t.isShiftDown());
if (nextColumn != null) {
getTableView().edit(getTableRow().getIndex(), nextColumn);
}
}
}
});
textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if (!newValue && textField != null) {
commitEdit(textField.getText());
}
}
});
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
/**
*
* @param forward true gets the column to the right, false the column to the left of the current column
* @return
*/
private TableColumn<Person, ?> getNextColumn(boolean forward) {
List<TableColumn<Person, ?>> columns = new ArrayList<>();
for (TableColumn<Person, ?> column : getTableView().getColumns()) {
columns.addAll(getLeaves(column));
}
//There is no other column that supports editing.
if (columns.size() < 2) {
return null;
}
int currentIndex = columns.indexOf(getTableColumn());
int nextIndex = currentIndex;
if (forward) {
nextIndex++;
if (nextIndex > columns.size() - 1) {
nextIndex = 0;
}
} else {
nextIndex--;
if (nextIndex < 0) {
nextIndex = columns.size() - 1;
}
}
return columns.get(nextIndex);
}
private List<TableColumn<Person, ?>> getLeaves(TableColumn<Person, ?> root) {
List<TableColumn<Person, ?>> columns = new ArrayList<>();
if (root.getColumns().isEmpty()) {
//We only want the leaves that are editable.
if (root.isEditable()) {
columns.add(root);
}
return columns;
} else {
for (TableColumn<Person, ?> column : root.getColumns()) {
columns.addAll(getLeaves(column));
}
return columns;
}
}
}
上面的例子显示类EditingCell extends TableCell<Person, String>
,但我想做的是这样的:
public class ExtendedTableView extends TableView{
public ExtendedTableView(){
init();
}
private void init(){
this.setEditable(true);
this.setTableMenuButtonVisible(true);
}
}
public class EditingCell extends TableCell<UNKNOWN, String>{
private TableColumn<UNKNOWN, ?> getNextColumn(boolean forward) {
}
}
我希望用户能够执行类似 ExtendedTableView table = new ExtendedTableView()
的操作获得一个已预设所有设置且单元格可编辑的表格。如果我必须添加更多行,例如传入类/类类型(而不是 Person
类),也没关系。但我们的想法是创建一个自定义的表格 View ,使其足够通用,并且用户不需要知道使单元格可编辑等所需的代码。
public class MyClass{
public MyClass(){
}
public void createTable(){
ExtendedTableView tableA = new ExtendedTableView();
ExtendedTableView tableB = new ExtendedTableView();
/*somehow find a way to pass classA into tableA so that class table cell can be something like this: "TableCell < ClassA, String>"*/
}
}
public class classA{
}
public class classB{
}
最佳答案
作为一般规则,如果您在 2010 年之后的任何时间使用原始类型,那么您可能没有以最佳方式做事。 (具体来说,不要使用原始类型,除非您正在与遗留代码(即 Java 1.5 之前的代码)交互。)
在这种情况下,您只需使您的 ExtendedTableView
类通用,即给它一个类型参数:
public class ExtendedTableView<T> extends TableView<T> {
public ExtendedTableView(){
init();
}
private void init(){
this.setEditable(true);
this.setTableMenuButtonVisible(true);
}
}
对于您的 EditingCell
类也类似:
public class EditingCell<T> extends TableCell<T, String>{
private TableColumn<T, ?> getNextColumn(boolean forward) {
}
}
现在,给定
public class ClassA { /* ... */ }
和
public class ClassB { /* ... */ }
您的客户端代码就可以做到
ExtendedTableView<ClassA> tableA = new ExtendedTableView<>();
ExtendedTableView<ClassB> tableB = new ExtendedTableView<>();
你可以做类似的事情
TableColumn<ClassA, String> someColumn = new TableColumn<>();
tableA.getColumns().add(someColumn);
someColumn.setCellFactory(tc -> new EditingCell<>());
关于java - 使用仅在运行时已知的参数扩展另一个类的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50028038/
将此矩阵视为一个内存。 p00 p01 p02 p03 p04 p05 p06.... p0n
一般,您如何确定如何根据已知模式迭代数组? 具体,这是我想要迭代的模式,返回一个数组数组:(每个数字都是原始数组的索引值:[0, 1, 2, 3] ) 0 0,1 0,1,2 0,1,2,3 1 1,
问题: 我正在编写一个 C++ 程序,我想在其中从 TCP/IP 套接字读取数据流。数据由几个不同长度和数据类型的数据包组成,但是,它们都是以十六进制格式接收的。在此图中可以看到数据包的长度及其数据类
使用 VC12(在 Visual Studio 2013 RTM 中)[1] 编译此程序会导致崩溃(在所有构建配置中),而实际上它不应该: #include void foo(std::string
我有一个 Snakemake 规则,适用于数据存档并本质上解压其中的数据。文件包含我在规则开始之前知道的不同数量的文件,因此我想利用它并执行类似的操作 rule unpack: input:
有这样的 list 吗? 我对 iOS 开发比较陌生,我认为研究最知名的编译器错误或陷阱列表会很棒。 编辑: 今天我花了太多时间来理解这样的代码发生了什么: 在 *.h @interface I :
如何选择已知 div 中的最后一个子元素,其中该子元素是未知元素。即:元素可以是段落或无序列表。 大多数情况下结构是: Text 但在其他情况下,结构将是: Text More Text
我想绘制以下内容: x = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'] y = [10, 20, 1, 8, 7, 2, 3, 7, 11] 作为条形图
关于未知列表的排序问题,人们已经知道很多了。但是,在堆栈机器中找到已知列表的最佳排序问题呢?也就是说,假设您有以下堆栈计算机: [4,1,3,2] [] [] 也就是说,有3个堆栈的空间,其中1个堆栈
正如主题中所写,我必须使用 mechanize 更改某些输入字段的值,但我没有它的名称只有 id:/让我们坚持这一点。 表单是这样的:
我只是回想起我的大学类(class),想知道这里是否有人在专业环境中使用过“Z 符号”。老实说,这是我一生中参加过的最无聊的类(class)。也许是因为老师,但当时我们真的都认为这是浪费时间。我可能错
我正在尝试编写一个函数来获取 Windows 等效的 HOME。我的 C 技能生疏了,所以请不要介意我的示例代码无法编译。我试图在 Windows Vista 和更新版本上使用 SHGetKnownF
我想找到一个正整数矩阵B,使得AB = BC,其中A和C是具有共同特征值的正整数矩阵。对于这种情况,存在解,但不唯一;我只需要一种解决方案。 有人知道 python 或 matlab 中可以执行此操作
如果您有两个二进制 blob,x 和 y。然后将它们散列在一起,假设使用 SHA-512。入侵者知道 y,这会使反转哈希变得容易多少? 是否有关于 y 有多大并且可以与 x 比较才成为问题的指南?这有
我正在使用Angular-Stripe-Checkout library创建像这样的 stripeToken example 。一些亮点如下所示。 与许多 Angular-stripe 库和示例一样,
我有一个带有 (e,n) 加密数据的公钥,必须通过 RSA 获取纯文本,并且所有这些都在 C 中! 首先我想知道如何找出我的 p 和 q 是什么?我知道它们必须是质数和 p<>q! 最佳答案 首先,因
表1(客户表) Id, CustomerId, IsKnownCustomer,phonemacaddress 1, 空 0 00:9a:34:cf:a4 2, 004024 1 00:6f:64:c
问题是找到第 n-th Catalan 数 mod m,其中 m 是 NOT prime , m = (10^14 + 7)。以下是我尝试过的方法列表:(max N = 10,000) 查表的动态编程
每当我打开我的应用程序时,我都想将我的应用程序连接到一个已知的 wifi 网络/ssid。即使手机当前通过 3G 或任何其他 wifi 网络连接。 仅使用 phonegap/html5 是否可行? 最
我正在做一个项目,我想为特定的用户组(具有管理员角色)实现实时通知,经过一些研究,我明白我需要 session 才能知道哪些用户已登录(默认情况下他们是匿名的)。 另外,我只需要向特定用户发送通知。
我是一名优秀的程序员,十分优秀!