2015-01-02 5 views
0

Я пытаюсь создать JPopupMenu, но по какой-то причине он не отображает текст, который я установил на JMenuItems. Само меню работает, в нем есть элементы меню, и они отзывчивы, но текст не отображается. Я создаю меню, как это:JPopupMenu не показывает текст JMenuItem

private void createPopupMenu() { 
    this.popupMenu = new JPopupMenu();  
    this.addMouseListener(new PopupListener(this)); 
    JMenuItem addPlaceMenuItem = new JMenuItem(SketchPad.ADD_PLACE_POPUP_TEXT); 
    addPlaceMenuItem.setAction(new PopupAction(ActionType.AddPlace)); 
    this.popupMenu.add(addPlaceMenuItem); 
    JMenuItem addTransitionMenuItem = new JMenuItem(SketchPad.ADD_TRANSITION_POPUP_TEXT); 
    addTransitionMenuItem.setAction(new PopupAction(ActionType.AddTransition)); 
    this.popupMenu.add(addTransitionMenuItem);  
} 

В случае, если это имеет значение, вот PopupListener:

class PopupListener extends MouseAdapter { 

    SketchPad pad; 

    public PopupListener(SketchPad pad) 
    { 
     this.pad = pad; 
    } 

    public void mousePressed(MouseEvent e) { 
     maybeShowPopup(e); 
    } 

    public void mouseReleased(MouseEvent e) { 
     if (e.getButton() == MouseEvent.BUTTON1) 
     { 
      this.pad.getController().deselectAllNodes(); 
     } 
     else 
     { 
      maybeShowPopup(e); 
     } 
    } 

    private void maybeShowPopup(MouseEvent e) { 
     if (e.isPopupTrigger()) {    
      pad.popupPosition = new Point(e.getX(), e.getY()); 
      pad.popupMenu.show(e.getComponent(), e.getX(), e.getY()); 
     } 
    } 
} 

Что я здесь отсутствует?

+1

Рассмотрите возможность использования JComponent # setComponentPopupMenu вместо использования MouseListener – MadProgrammer

ответ

3

но по какой-то причине он не отображает текст, который я установил на JMenuItems.

addPlaceMenuItem.setAction(new PopupAction(ActionType.AddPlace)); 

Метод setAction(...) сброса свойств пункта меню с свойствами действий. Поэтому вам необходимо установить для свойства NAME свойство Action, чтобы установить текст пункта меню.

Так что в вашем случае это выглядит как стоимость имущества NAME должно быть:

SketchPad.ADD_PLACE_POPUP_TEXT 

Или другой подход, чтобы сбросить текст пункта меню после того, как вы установите действие

JMenuItem addPlaceMenuItem = new JMenuItem(new PopupAction(ActionType.AddPlace)); 
addPlaceMenuItem.setText(SketchPad.ADD_PLACE_POPUP_TEXT); 
2

Эффект зависит от платформы. В частности, «В Microsoft Windows пользователь по соглашению вызывает всплывающее меню на releasing правой кнопкой мыши, когда курсор находится над включенным компонентом». Ваша реализация mouseReleased() не позволяет даже проверять isPopupTrigger(). Вместо этого обработайте выбор и проверьте триггер. Аналогичный подход показан в GraphPanel, чтобы обрабатывать несколько вариантов выбора и контекстное меню.