- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
以下问题:我需要知道在特定时刻,天气我的TableView当前是否正在编辑。我用了editingCellProperty并将特定的业务逻辑绑定(bind)到它,以便在表切换这些模式时获得通知。
不幸的是,状态并不总是正确显示,因为我有特定的单元格(在同一列内),这些单元格根本不应该被编辑,但当单击不可编辑的单元格时,TablePosition 仍然被设置到 EditingCellProperty 中,因此我得到的信息是,我的 TableView 正在编辑,尽管根据条件被告知,该单元格不可编辑,并且编辑模式从未真正启动。
我创建了一个小示例,其中 ColumnName 的所有偶数行都是可编辑的,而奇数行则不可编辑。
示例代码:
public class TableViewEditableStateError extends Application
{
public static void main( final String[] args )
{
launch( args );
}
@Override
public void start( final Stage primaryStage )
{
Item item1 = new Item( 1, "Item1" );
Item item2 = new Item( 2, "Item2" );
Item item3 = new Item( 3, "Item3" );
Item item4 = new Item( 4, "Item4" );
ObservableList<Item> itemList = FXCollections.observableArrayList( item1, item2, item3, item4 );
TableColumn<Item, Integer> columnId = new TableColumn<>( "ColumnId" );
TableColumn<Item, String> columnName = new TableColumn<>( "ColumnName" );
columnId.setCellValueFactory( new PropertyValueFactory<Item, Integer>( "id" ) );
columnName.setCellValueFactory( new PropertyValueFactory<Item, String>( "name" ) );
// columnName.setCellFactory( TextFieldTableCell.forTableColumn() ); -> Using own implementation for editablestate-behaviour
columnName.setCellFactory( new Callback<TableColumn<Item, String>, TableCell<Item, String>>()
{
@Override
public TableCell<Item, String> call( final TableColumn<Item, String> column )
{
TableCell<Item, String> cell = new EditableTableCell<Item>()
{
@Override
public void startEdit()//Business-Rule to deceide, which cell is editable.
{
if ( getTableRow().getIndex() % 2 != 0/* Only Odd Values are editable. -> Any Random Condition */)
{
System.out.println( "Do not initiate Editing." );
return;
}
System.out.println( "initiate Editing." );
super.startEdit();
}
};
return cell;
}
} );
columnName.setOnEditCommit( new EventHandler<CellEditEvent<Item, String>>()
{
@Override
public void handle( final CellEditEvent<Item, String> event )
{
final Item item = event.getRowValue();
System.out.println( "Change Item " + item + " from " + event.getOldValue() + " to new value "
+ event.getNewValue() );
item.setName( event.getNewValue() );
}
} );
final TableView<Item> tableView = new TableView<>( itemList );
tableView.getColumns().add( columnId );
tableView.getColumns().add( columnName );
tableView.setColumnResizePolicy( TableView.CONSTRAINED_RESIZE_POLICY );
tableView.setEditable( true );
columnId.setEditable( false );
Label label = new Label( "Editing-State: is not editing..." );
//Listener to record editing behaviour:
tableView.editingCellProperty().addListener( new ChangeListener<TablePosition<Item, ?>>()
{
@Override
public void changed( final ObservableValue<? extends TablePosition<Item, ?>> observable,
final TablePosition<Item, ?> oldValue, final TablePosition<Item, ?> newValue )
{
System.out.println( "Editstate changed to: " + newValue );
if ( newValue != null )
label.setText( "Editing-State: is editing..." );
else
label.setText( "Editing-State: is not editing..." );
}
} );
BorderPane layout = new BorderPane();
layout.setCenter( tableView );
layout.setTop( label );
Scene scene = new Scene( layout, 400, 400 );
scene.getStylesheets().add( getClass().getResource( "application.css" ).toExternalForm() );
primaryStage.setScene( scene );
primaryStage.show();
}
class EditableTableCell<S> extends TableCell<S, String>
{
protected TextField textField;
@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.selectAll();
textField.requestFocus();
}
} );
}
@Override
public void cancelEdit()
{
super.cancelEdit();
setText( getItem() == null ? "" : getItem().toString() );
setContentDisplay( ContentDisplay.TEXT_ONLY );
textField = null;
}
@Override
public void updateItem( final String item, final boolean empty )
{
super.updateItem( item, empty );
if ( empty )
{
setText( null );
setGraphic( null );
}
else
{
if ( isEditing() )
{
if ( textField != null )
{
textField.setText( getItem() == null ? "" : getItem().toString() );
}
setGraphic( textField );
setContentDisplay( ContentDisplay.GRAPHIC_ONLY );
}
else
{
setText( getItem() == null ? "" : getItem().toString() );
setContentDisplay( ContentDisplay.TEXT_ONLY );
}
}
}
private void createTextField()
{
textField = new TextField( getItem() == null ? "" : getItem().toString() );
textField.setOnKeyPressed( new EventHandler<KeyEvent>()
{
@Override
public void handle( final KeyEvent keyEvent )
{
if ( keyEvent.getCode() == KeyCode.ENTER )
{
commitEdit( textField.getText() );
}
else if ( keyEvent.getCode() == KeyCode.ESCAPE )
{
cancelEdit();
}
}
} );
textField.focusedProperty().addListener( new ChangeListener<Boolean>()
{
@Override
public void changed( final ObservableValue<? extends Boolean> observable, final Boolean oldValue,
final Boolean newValue )
{
if ( !newValue && textField != null )
{
final String text = textField.getText();
commitEdit( text );
}
}
} );
}
}
}
数据类项目:
public class Item
{
private final IntegerProperty id = new SimpleIntegerProperty();
private final StringProperty name = new SimpleStringProperty();
public Item( final int id, final String name )
{
this.id.set( id );
this.name.set( name );
}
public int getId()
{
return id.get();
}
public String getName()
{
return name.get();
}
public void setId( final int id )
{
this.id.set( id );
}
public void setName( final String name )
{
this.name.set( name );
}
public IntegerProperty idProperty()
{
return id;
}
public StringProperty nameProperty()
{
return name;
}
}
我将问题范围缩小到 editCell TableView 的方法,因为它不对特定于单元格的可编辑状态使用react:
/**
* Causes the cell at the given row/column view indexes to switch into
* its editing state, if it is not already in it, and assuming that the
* TableView and column are also editable.
*/
public void edit(int row, TableColumn<S,?> column) {
if (!isEditable() || (column != null && ! column.isEditable())) {
return;
}
if (row < 0 && column == null) {
setEditingCell(null);
} else {
setEditingCell(new TablePosition<>(this, row, column));
}
}
但是由于 setEditingCell() 是一个私有(private)方法,我无法按照我希望的方式重写 edit-Method 。所以我很好奇:谁能告诉我在同一列中实现动态可编辑表格单元格的正确方法,同时TableView的editingCell-State将始终保持正确?
最佳答案
在监听器中类似这样的东西可以忽略编辑你不想要的单元格更改
editingCellProperty().addListener((obs,ov,nv) -> {
if (nv!=null && nv.getRow() % 2 != 0/* Only Odd Values are editable. -> Any Random Condition */)
{
System.out.println( "Pretend this never happened" );
}
else
System.out.println("Editstate changed to: " + nv);
});
即使我在 EditableCell 构造函数中为某些单元格 setEditable(false)
,监听器仍然会触发。它认为它不会发生在 TableCell 编辑方法中,因为它会检查 !isEditable()
。发生的情况是 editorialCell 发生变化,从正在编辑的最后一个单元格到未编辑的新单元格。我想这有点道理,但是您不会得到空值,但单元格的 TablePosition 未被编辑。即使没有正在编辑的单元格,尝试编辑不可编辑的单元格仍然会触发监听器。
我认为这需要一个错误报告。
关于java - 如何正确避免特定的 UITableViewCell 可编辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23740462/
我添加了编辑按钮 self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButto
我试图在运行时“干净地”更改 UIBarButtonItem 文本,以便可以切换编辑/完成模式。然而,每次我在运行时更改 title 属性时,动画看起来都很笨拙。我正在寻找模拟联系人应用程序中“编辑/
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我想更改 INI 文件中的一些值。不幸的是,我在 2 个不同的部分有键,它们共享相同的名称但需要不同的值。我的代码使用 Get-IniContent函数来自 PsIni . 示例 INI 文件: [P
是否有通知或委托(delegate)方法可用于检测表格 View 何时进入编辑状态? 我想要做的是检测表正在编辑,然后显示一个额外的行,上面写着“添加新项目”或类似的东西。 我尝试在加载 View C
例如,我试图从 svg 读取样式块,我可以获取类型但不能获取字符串。 $svgTemplate = new SimpleXMLElement($_POST['SvgTemplateImport']);
我可以使用 self.navigationItem.leftBarButtonItem = self.editButtonItem; 通过按下导航面板上的编辑按钮让 UITableViewContro
我正在使用markitup!作为 Markdown 编辑器( example )。 目前,我需要按预览按钮(绿色勾号)来显示预览面板。 我希望自动显示预览 - 我怎样才能实现这一点? 最佳答案 我没有
我的处境非常糟糕。我丢失了源代码,客户需要在应用程序中进行一些更改。想想一个编辑程序集的例子:Test.dll,然后添加代码行,最后重新编译它 所以我的问题是: -可以这样做吗? -如果可能的话,什么
我使用了一些 JavaScript 来通过按钮更改段落元素的内容。它工作正常,但我还想让按钮控制标题和附图。给我指明正确的方向吗? 这是我用来更改段落的代码 .... 谢谢! 最佳答案 尝试将 Ja
是否有任何 Emacs lisp 插件可以让我轻松地在 yaml 文件中编辑或输入数据。 例如: --- sample yaml file ---Name : Addr :City :State:Zi
新手Java问题,我确定已经解决了,但是在任何地方都找不到解决方案:( 我想使用这里包含的java程序http://sourceforge.net/projects/ant-tibco/files/
在我的网页中,我使用了 gridview。在这个 GridView 中,它显示了一组用户信息。我刚刚从智能标签菜单中添加了一个按钮。我的要求是当我点击每个用户对应的按钮时,它会重定向到另一个页面并显示
我想在没有任何框架的情况下直接在 JS 中编辑一个 SVG 文件。 基本上我有一个 SVG 主文件,其中应该包含一些子 SVG。 我已经在 Ajax 中检索了这些子项的内容,但我想将它们插入到 SVG
我有我的 ViewModel,我有我的 Controller 可以从 ViewModel 正确显示,但是我不确定如何使 ViewModel 可编辑,以便将编辑后的数据发送回模型。我只想编辑 Order
我不确定我的做法是否正确。 IplImage *dog_1 = cvCreateImage(cvGetSize(oriImg), oriImg->depth, oriImg->nChannels);
我有一个创建二维码的网络服务器。在此过程中,我得到一个 BarcodeQRCode 对象,我可以从中获取图像 (.getImage())。 我不确定如何将这张图片发回给客户。我不想将它保存在文件中,而
已编辑:我的第一个问题解决了,但又出现了另一个问题,只提供了一个用户 ID。这是修改后的代码的屏幕截图。 回到表格,用户将按下编辑按钮,这样他就可以编辑问题并给出适当的操作.. 我的上表代码是这样的:
据我了解,我无法通过重新启动服务器来清除 MySQL 查询缓存。 每次运行 sql 时,我都试图获得与第一个代码块类似的结果 1-这是在重新启动 Apache 和 MySQL 之前(第一次使用这些查询
我正在创建一个页面来搜索项目,然后能够编辑/更新它。当它只返回一个结果时我能够做到这一点,但当它给我多个结果时我只能编辑最后一项。下面是我的代码: ....... $dj =$_POST[djnum]
我是一名优秀的程序员,十分优秀!