如何禁用的文本字段的默认上下文菜单(How to disable the default conte

2019-07-04 03:27发布

默认情况下,JavaFX的TextField有一个内置的ContextMenu与“撤消”,“复制”,“剪切”等选项。 该ComboBox也有同样的ContextMenu ,当它被设置为可编辑(该ComboBox实际上是这是一个编辑的部分TextField )。

我要取代这个ContextMenu有一个自定义的,但我在使用禁用默认的一个问题。

我试图消耗ContextMenu和鼠标点击事件,但ComboBoxComboBox.getEditor()都有一个空ContextMenu

我缺少的东西吗?

Answer 1:

正如我们已经指出,将呼叫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访问,但它可能会需要等待更广泛的工作,使皮肤更加公开。



Answer 2:

我已经找到一种方法来禁用默认弹出菜单。 然后,你可以添加你自己的,没有得到双重菜单效果。

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());
    }
});


Answer 3:

我希望这会有所帮助,我有同样的问题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);
}


文章来源: How to disable the default context menu on a text field