2013-07-19 2 views
0

Я пытаюсь вызвать всплывающее меню, когда пользователь вводит определенный символ. В моем случае это точка ключа. Но ничего не происходит. Я думаю; Я что-то упустил. Не могли бы вы сказать мне, что wrong.Because я укомплектовать путатьВсплывающее меню кажется неработающим

public class d extends JPanel { 
    String phase="Some Clue "; 
    final JTextArea area; 
    final JPopupMenu menu; 

    public d(){ 
     super(new BorderLayout()); 

     area=new JTextArea(); 
     area.setLineWrap(true); 
     JButton button=new JButton("Clear"); 

     menu=new JPopupMenu(); 
     JMenuItem item=new JMenuItem(phase); 
     menu.add(item); 

     add(area,BorderLayout.NORTH); 
     add(button,BorderLayout.SOUTH); 
     add(menu); 
    } 

    public static void main(String...args){ 
     JComponent c=new d(); 
     JFrame frame=new JFrame(); 
     frame.setContentPane(c); 
     frame.setSize(300,300); 
     frame.setVisible(true); 
    } 

    ActionListener listener=new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent ae) { 
     PopupMenu menu=new PopupMenu(); 
     int pos=area.getCaretPosition(); 
     try { 
      Rectangle r= area.modelToView(pos); 
      menu.show(area, r.x, r.y); 
     } catch (BadLocationException ex) { 
      System.out.print(ex.toString()); 
     } 
     KeyStroke ks=KeyStroke.getKeyStroke(KeyEvent.VK_P,0,false); 
     area.registerKeyboardAction(listener, ks,JComponent.WHEN_FOCUSED);  
    } 
}; 

ответ

1

Переместить эти заявления в конструкторе класса d

KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_P, 0, false); 
area.registerKeyboardAction(listener, ks, JComponent.WHEN_FOCUSED); 

так что KeyStroke зарегистрирован в JTextAreaarea

Также нет необходимости создавать всплывающее меню (AWT) в прослушивателе - повторное использование menu, объявленного на уровне класса.

ActionListener listener = new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent ae) { 

     int pos = area.getCaretPosition(); 
     try { 
      Rectangle r = area.modelToView(pos); 
      menu.show(area, r.x, r.y); 
     } catch (BadLocationException ex) { 
      System.out.print(ex.toString()); 
     } 

    } 
}; 

Помимо Использование Java соглашения об именовании классов начинаются с заглавной письма, например PopupTest, а не d

+0

Спасибо Его сделано – user2583511

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