6

默认情况下,JavaFXTextField具有内置的ContextMenu“撤消”、“复制”、“剪切”等选项。设置为可编辑时ComboBox也具有相同的效果(实际上是编辑器的一部分,即 a )。ContextMenuComboBoxTextField

我想ContextMenu用自定义替换它,但我在禁用默认设置时遇到了问题。

我尝试使用ContextMenu鼠标单击事件,但ComboBox两者ComboBox.getEditor()都有 null ContextMenu

我错过了什么吗?

4

3 回答 3

7

我找到了一种禁用默认弹出菜单的方法。然后您可以添加自己的,而不会获得双菜单效果。

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 添加菜单 - 我知道这会起作用。

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());
    }
});
于 2013-03-13T05:49:57.387 回答
2

正如您已经说过的,调用GetContextMenu()返回 null (这是一个重要线索,默认一个是实现细节),如果您添加一个附加值ContextMenu,它会出现在默认值之上。

尝试用以下代码替换上下文菜单:

ContextMenu cm = new ContextMenu();
cm.getItems().add(new MenuItem("Test"));

textbox.setContextMenu(cm);

产生以下结果。

在此处输入图像描述

覆盖鼠标单击事件也不起作用,因为您仍然需要通过某些似乎不可能的属性访问默认的上下文菜单。

我还检查了 CSS 参考,以查看是否ContextMenu可以通过其中一个控件子结构进行定位,但这同样没有返回任何结果。

基于此信息,默认值似乎ContextMenu是控件的实现细节TextField(或者它可能是父类TextInputControl),并且当前无法更改。

更新

我联系了 Jonathan Giles(JavaFX UI 控制团队的 Oracle 技术主管),他告诉我提交错误报告。

我搜索了错误数据库并找到了一些现有的报告(RT-23213 和 RT-24823),所以这似乎是一个已知问题。到今天为止,这个问题仍然存在,被认为是中等优先级,但显然它将在 FX 8.0 中得到修复。

从错误报告评论中:

默认上下文菜单由控件的皮肤创建,目前不是公共 API。我们需要决定是否以及何时可以通过公共 API 访问上下文菜单,但它可能需要等待更广泛的工作以使皮肤更加公开。

于 2012-11-26T23:21:43.040 回答
0

我希望它会有所帮助,我在上下文菜单中内置的 editText 遇到了同样的问题,这对我有用..

编辑文本等;图像视图四;

@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);
}
于 2015-02-08T18:35:14.330 回答