我想在tableview中添加一个上下文菜单,更具体地说,我想在右键单击时在表行上显示上下文菜单。
我试着用这个代码
final EventHandler click = new EventHandler() {
public void handle(MouseEvent t) {
}
@Override
public void handle(Event arg0) {
}
};
final Context menu = new ContextMenu();
MenuItem item = new MenuItem("Add Image");
item.setOnAction(new EventHandler() {
public void handle(ActionEvent t)
{
}
@Override
public void handle(Event arg0)
{
//some code here
}});
menu.getItems().addAll(item);
EditingCell cellFactory = new EditingCell(click,menu);
TableColumn col = new TableColumn("column1");
col.setCellFactory(cellFactory);
上面的代码在JavaFX2.0中工作正常,右键单击时我得到了一个上下文菜单,当我用JavaFX2.1上下文菜单运行我的代码时,它是如何工作的。
我尝试使用showingProperty()方法获取上下文菜单的显示属性,它在JavaFX2.1中返回false,在JavaFX2.0中返回true
此外,我还尝试制作了自定义的cellfactory类,下面是我的代码(我从正式的JAVAFX TreeView上下文菜单示例中获取)
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
class TextFieldTreeCellImpl extends TableCell<String,String> {
private TextField textField;
private ContextMenu addMenu = new ContextMenu();
public TextFieldTreeCellImpl() {
MenuItem addMenuItem = new MenuItem("Add Employee");
addMenu.getItems().add(addMenuItem);
addMenuItem.setOnAction(new EventHandler() {
public void handle(Event t) {
}
});
setContextMenu(addMenu);
}
@Override
public void startEdit() {
super.startEdit();
if (textField == null) {
createTextField();
}
setText(null);
setGraphic(textField);
textField.selectAll();
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText((String) getItem());
//setGraphic(getTableCell().getGraphic());
}
@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());
}
setText(null);
setGraphic(textField);
} else {
setText(getString());
//setGraphic(getTreeItem().getGraphic());
}
}
}
private void createTextField() {
textField = new TextField(getString());
textField.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
if (t.getCode() == KeyCode.ENTER) {
commitEdit(textField.getText());
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
}
}
});
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
}
final Callback<TableColumn, TableCell> cellFactory =
new Callback<TableColumn, TableCell>() {
public TableCell call(TableColumn p) {
return new TextFieldTreeCellImpl();
}
};
col.setCellFactory(cellFactory);
官方的TreeView
和TableView
教程都可以很好地使用JavaFX2.1。问题是,您正在混合这些代码示例。当TableColumn
的单元格工厂需要TableCell
时,不能返回TreeCell
。只需遵循TableView教程,并将EditingCell替换为以下具有ContextMenu的内容:
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TableCell;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
class EditingCell extends TableCell<Person, String> {
private TextField textField;
private ContextMenu addMenu = new ContextMenu();
public EditingCell() {
MenuItem addMenuItem = new MenuItem("Print Me");
addMenu.getItems().add(addMenuItem);
addMenuItem.setOnAction(new EventHandler() {
public void handle(Event t) {
// Do something with current row
Person curr = getTableView().getItems().get(getIndex());
System.out.println(curr.getFirstName() + " " + curr.getLastName());
}
});
}
@Override
public void startEdit() {
super.startEdit();
if (textField == null) {
createTextField();
}
setText(null);
setGraphic(textField);
textField.selectAll();
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText((String) getItem());
setGraphic(null);
}
@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());
}
setText(null);
setGraphic(textField);
} else {
setText(getString());
setGraphic(null);
setContextMenu(addMenu);
}
}
}
private void createTextField() {
textField = new TextField(getString());
textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
textField.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
if (t.getCode() == KeyCode.ENTER) {
commitEdit(textField.getText());
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
}
}
});
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
}
问题内容: 让我们来看看, 我知道如何更改ListView的样式(选择项目时为橙色): android:listSelector =“ @ drawable / xxx”和带有位图或@color的可绘制对象 关键是,为了具有一致的设计,我必须对上下文菜单执行相同的操作,但是我看不到在哪里进行更改。没有listSelector,没有任何更改。 问题答案: 如果通过上下文菜单表示长按菜单,那么我已使用
我用appium来测试我的移动应用程序。使用TouchAction,我可以让appium驱动程序长按edittext,以显示上下文菜单,允许用户“全选”、“复制”、“粘贴”文本。 但现在,我无法让appium驱动程序点击这些选项中的任何一个[“全选”、“复制”、“粘贴”]。我试图用下面的内容引用选项,但没有用。因为选项的类型不是ListView。 WebElement optionListView
PrimeFaces 4.0、Glassfish 3.1.2、Mojarra 2.1.6 我创建了一个p:dataTable和一个对dataTable的contextMenu引用。dataTable的第一列包含p:commandLink。问题是,如果我用鼠标右键单击commandLink,则该行不会被选中。如何选择实际行?我用Javascript尝试了一下,但没有结果。 我想,我应该使用Prime
这里有一个项目,我需要在WPF应用程序中自定义上下文菜单,其中将在所有MenuItems的底部放置一个按钮。 但是,如果我要通过XAML添加按钮,它将作为集合中的另一项出现在上下文菜单中,鼠标移过高亮显示将作用于它。 我希望有一个上下文菜单调优到网格样的样式,这样我就可以自定义样式下的它。 有什么想法可以实现这一点(最好是在XAML中)吗?
你好,我有一个带有slidingtab的活动,一个viewpager,在viewpager中,我以编程方式添加了Listviews 问题是,如果showMenu为true,则上下文菜单不会显示,但如果showMenu为false,则其他函数工作。因此“OnItemClickListener”似乎没有问题,因为它被正确调用了,但问题是“ShowContextMenuForChild”。 我做错了什么
我对上下文菜单有问题。在本主题之后,我发现在尝试加载上下文菜单insight JavaFX任务时有一个限制。我测试了实现platform.runlater(),但没有成功。 其他可能的解决方案是: