默认情况下,JavaFX的TextField
有一个内置的ContextMenu
与“撤消”,“复制”,“剪切”等选项。 该ComboBox
也有同样的ContextMenu
,当它被设置为可编辑(该ComboBox
实际上是这是一个编辑的部分TextField
)。
我要取代这个ContextMenu
有一个自定义的,但我在使用禁用默认的一个问题。
我试图消耗ContextMenu
和鼠标点击事件,但ComboBox
和ComboBox.getEditor()
都有一个空ContextMenu
。
我缺少的东西吗?
正如我们已经指出,将呼叫GetContextMenu()
返回null(这是大线索默认的是一个实现细节),如果你添加一个额外的ContextMenu
出现在默认的。
尝试用下面的代码替换上下文菜单:
ContextMenu cm = new ContextMenu();
cm.getItems().add(new MenuItem("Test"));
textbox.setContextMenu(cm);
将产生以下结果。
重写鼠标单击事件不会工作,要么因为你仍然需要通过一些属性,它似乎不能够访问默认的上下文菜单。
我还检查了CSS参考,看看是否ContextMenu
为目标,能够通过控制子结构之一,但这又返回任何结果。
基于这些信息,它看起来好像默认ContextMenu
是的实现细节TextField
控制(或者它的父类TextInputControl
)和当前无法改变。
更新
我接触的乔纳森·贾尔斯(在JavaFX的UI在甲骨文的技术领导团队控制)谁告诉我,以便将错误报告。
我搜索bug数据库,并已发现了一些现有报表(RT-23213和RT-24823),所以它看起来这是一个已知的问题。 由于今天的问题仍然是开放的,被认为是中等优先级,但显然这将是固定的FX 8.0。
从错误报告的意见:
默认的上下文菜单被控制的皮肤,这是目前未公开API创建。 我们需要决定是否以及何时上下文菜单中应该通过公开的API访问,但它可能会需要等待更广泛的工作,使皮肤更加公开。
我已经找到一种方法来禁用默认弹出菜单。 然后,你可以添加你自己的,没有得到双重菜单效果。
ComboBox<String> cb_ = new ComboBox<>();
final EventDispatcher initial = cb_.getEditor().getEventDispatcher();
cb_.getEditor().setEventDispatcher(new EventDispatcher()
{
@Override
public Event dispatchEvent(Event event, EventDispatchChain tail)
{
if (event instanceof MouseEvent)
{
//shot in the dark guess for OSX, might not work
MouseEvent mouseEvent = (MouseEvent)event;
if (mouseEvent.getButton() == MouseButton.SECONDARY ||
(mouseEvent.getButton() == MouseButton.PRIMARY && mouseEvent.isControlDown()))
{
event.consume();
}
}
return initial.dispatchEvent(event, tail);
}
});
注 - 我不是通过在组合框菜单中添加自己的菜单,我不知道这会工作(可能)。
如果换在横向盒组合框,并添加一个菜单到横向盒 - 我知道这会工作。
HBox hbox = new HBox();
ContextMenu contextMenu = new ContextMenu();
....
hbox.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>()
{
@Override
public void handle(ContextMenuEvent event)
{
contextMenu.show(hbox, event.getScreenX(), event.getScreenY());
}
});
我希望这会有所帮助,我有同样的问题EDITTEXT内置的上下文菜单,这个工作对我来说..
的EditText等; ImageView的IV;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et=(EditText) findViewById(R.id.et1);
iv=(ImageView) findViewById(R.id.iv1);
registerForContextMenu(et);
registerForContextMenu(iv);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
menu.clear();
if(v==et)
getMenuInflater().inflate(R.menu.editmemu, menu);
if(v==iv)
getMenuInflater().inflate(R.menu.imagemenu, menu);super.onCreateContextMenu(menu, v, menuInfo);
}