2015-10-06 5 views
2

Когда вы щелкните правой кнопкой мыши на TextField, есть опции Отменить, Повторить, Вырезать, Копировать, Вставить, Удалить и Выбрать все.JavaFX Добавить в меню правой кнопки мыши для TextField

Я хочу добавить «Меню» в этот список из моего класса контроллера, но не знаю, как это сделать.

Вот что я получил до сих пор:

Это перезаписывает существующие пункты меню:

ContextMenu contextMenu = new ContextMenu(); 
MenuItem register = new MenuItem("Register"); 
contextMenu.getItems().add(register); 
charName.setContextMenu(contextMenu); 

Оба эти возвращения нуль:

charName.getContextMenu() 
charName.contextMenuProperty().getValue() 

ответ

5

Вы можете заменить ИН -строенный TextField ContextMenu, установив свой собственный (как показано ниже):

enter image description here

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.stage.Stage; 

public class GiveMeContext extends Application { 
    @Override 
    public void start(final Stage stage) throws Exception { 
     ContextMenu contextMenu = new ContextMenu(); 
     MenuItem register = new MenuItem("Register"); 
     contextMenu.getItems().add(register); 

     TextField textField = new TextField(); 
     textField.setContextMenu(contextMenu); 

     stage.setScene(new Scene(textField)); 
     stage.show(); 
    } 
    public static void main(String[] args) throws Exception { 
     launch(args); 
    } 
} 

Добавление к встроеному ContextMenu немного Tricker и требует преимущественной непубличной API.

Вы не можете получить встроенный ContextMenu с использованием общедоступного свойства textField.getContextMenu, поскольку он не возвращается (этот метод возвращает только меню, которое было задано кодом приложения, а не внутренняя реализация скина управления JavaFX).

customcontext

Имейте в виду, что следующий код будет почти наверняка перерыв в Java 9, как он использует устаревший com.sun API, которые will likely no longer be available. Более подробно об этом см JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization

import com.sun.javafx.scene.control.skin.TextFieldSkin; 
import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.stage.Stage; 

public class GiveMeContext extends Application { 
    @Override 
    public void start(final Stage stage) throws Exception { 
     TextField textField = new TextField(); 
     TextFieldSkin customContextSkin = new TextFieldSkin(textField) { 
      @Override 
      public void populateContextMenu(ContextMenu contextMenu) { 
       super.populateContextMenu(contextMenu); 
       contextMenu.getItems().add(0, new SeparatorMenuItem()); 
       contextMenu.getItems().add(0, new MenuItem("Register")); 
      } 
     }; 
     textField.setSkin(customContextSkin); 

     stage.setScene(new Scene(textField)); 
     stage.show(); 
    } 
    public static void main(String[] args) throws Exception { 
     launch(args); 
    } 
} 
+0

Старинное, что в функцию, так что я мог бы просто позвонить addRegister() или addMenuItem(), который поможет мне сделать обновления при переходе на Java 9. Высокий ответ @jewelsea – milesacul

+0

@milesacul Можете ли вы предоставить этот код в Java9? –

Смежные вопросы