2016-11-12 34 views

回答

5

推动和保持事件可以很容易地在JavaFX中模拟,就像这个question一样。

一旦你得到了初始事件,你需要做的就是从TextField中调用ContextMenu。由于TextField.getContextMenu()不会返回默认的,您可以提供自己的或尝试获取默认的。

获取默认值会有点棘手,因为它是TextFieldBehavior类的一部分。它包含此方法public void contextMenuRequested(ContextMenuEvent e);,因此您只需提供一个ContextMenuEvent,然后从TextField中触发该事件。

这是一个快速的实现:

public class BasicView extends View { 

    public BasicView(String name) { 
     super(name); 

     TextField textField = new TextField(); 

     addPressAndHoldHandler(textField, Duration.seconds(1), event -> { 
      Bounds bounds = textField.localToScreen(textField.getBoundsInLocal()); 
      textField.fireEvent(new ContextMenuEvent(ContextMenuEvent.CONTEXT_MENU_REQUESTED, 
        0, 0, bounds.getMinX() + 10, bounds.getMaxY() + 10, false, null)); 
     }); 

     setCenter(new VBox(15.0, new Label("Push and hold for ContextMenu"), textField)); 
    } 

    private void addPressAndHoldHandler(Node node, Duration holdTime, EventHandler<MouseEvent> handler) { 
     class Wrapper<T> { 
      T content; 
     } 

     Wrapper<MouseEvent> eventWrapper = new Wrapper<>(); 

     PauseTransition holdTimer = new PauseTransition(holdTime); 
     holdTimer.setOnFinished(event -> handler.handle(eventWrapper.content)); 

     node.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> { 
      eventWrapper.content = event; 
      holdTimer.playFromStart(); 
     }); 
     node.addEventHandler(MouseEvent.MOUSE_RELEASED, event -> holdTimer.stop()); 
     node.addEventHandler(MouseEvent.DRAG_DETECTED, event -> holdTimer.stop()); 
    } 

    @Override 
    protected void updateAppBar(AppBar appBar) { 
     appBar.setTitleText("Push and Hold"); 
    } 

} 

在桌面上,这是你会得到什么:

好消息是,你并不需要修改文本菜单进行Android,JavaFX有一个自定义的:

请注意,不同的菜单项将根据上下文自动更改,如在“桌面”弹出窗口中。

+0

什么是“TextFieldBehavior”类?有没有实际的类名?如果你的意思是TextField类,你不能指'TextField.getContextMenu' ...不会返回你默认的,然后说这个'TextFieldBehaviour'类中的默认值。这些错字问题? ContextMenuEvent中的默认上下文菜单是不是? – Lealo

+0

这里没有错别字。 'TextFieldBehavior'是私有的(com.sun ...包),所以你不能访问它。但是如果你触发'ContextMenuEvent',它将在该类中由'contextMenuRequested'处理。 –

0

快速搜索会显示一些名为“上下文菜单”的内容。 这里是小的实现:

TextView tv; 

    @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      tv = (TextView) findViewById(R.id.tv1); 
      registerForContextMenu(tv); 
    } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 
    { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.setHeaderTitle("Select The Action"); 
     menu.add(0, v.getId(), 0, "Copy");//groupId, itemId, order, title 
    } 
    @Override 
    public boolean onContextItemSelected(MenuItem item){ 
     if(item.getTitle()=="Copy"){ 
      String text = tv.getText().toString(); 
      Log.e("onContextItemSelected",text); 
     } 

     return true; 
    } 

当你点击的TextView它显示了从“onCreateContextMenu”给定标题和选项的弹出窗口。一旦你选择了一个选项“OnContextItemSelected”被调用。然后,您可以根据需要使用变量“文本”。不要忘记使用registerForContextMenu(tv)注册上下文菜单的视图。