2015-05-14 42 views
2

我正在構建一個文字處理器程序作爲我在學校的Java課程的作業,我很難讓popupmen工作,當我右鍵點擊我的文本區域。我已經構建了彈出式菜單,並有我的textarea聽我popuplistener,我已經覆蓋按下鼠標和鼠標發佈功能與Popupmenu不會在java中工作?

class popupframe extends JFrame{ 
JMenuItem copy; 
JMenuItem paste; 
JTextArea textarea = new JTextArea(); 
JPopupMenu pop; 
popupframe(){ 
Container cpane = getContentPane(); 
setSize(300 , 300); 
setLocation(300, 300); 
setTitle("Test"); 
JPopupMenu pop = new JPopupMenu(); 
copy = new JMenuItem("copy"); 
paste = new JMenuItem("paste"); 
textarea = new JTextArea("something goes here", 5, 5); 
pop.add(copy); 
pop.add(paste); 
PopupListener popuplistener = new PopupListener(); 
textarea.addMouseListener(popuplistener); 

} 

class PopupListener extends MouseAdapter{ 
    public void MousePressed(MouseEvent e){ 
     popit(e); 
    } 
    public void MouseReleased(MouseEvent e){ 
     popit(e); 
    } 
    private void popit(MouseEvent e){ 
     if(e.isPopupTrigger()){ 
      pop.show(e.getComponent(), e.getX(), e.getY()); 
     } 
    } 
} 
} 

我不明白爲什麼它不工作,但也許我失去了一些東西的關鍵,請幫忙!!非常感謝

+1

*「我不明白爲什麼它不工作「* - 我們也不能,考慮提供一個[可運行示例](https://stackoverflow.com/help/mcve),它演示了您的問題。這不是代碼轉儲,而是您正在做什麼的一個示例你會遇到這個問題,這會減少混淆和更好的反應 – MadProgrammer

+0

另外,考慮使用['JComponent#serComponentPopupMenu'](http://docs.oracle.com/javase/7/docs/api/javax/swing/ JComponent.html#setComponentPopupMenu(javax.swing.J PopupMenu)),並讓它照顧細節 – MadProgrammer

+0

感謝您的答覆,我編輯了我的代碼,以便您可以更清晰地瞭解我即將發生的操作 –

回答

4

@Override註釋添加到您認爲您正在覆蓋方法...

class PopupListener extends MouseAdapter { 

    @Override 
    public void MousePressed(MouseEvent e) { 
     System.out.println("Pressed"); 
     popit(e); 
    } 

    @Override 
    public void MouseReleased(MouseEvent e) { 
     System.out.println("Pressed"); 
     popit(e); 
    } 

現在,您會發現,這編譯失敗,但是爲什麼呢?因爲Java是區分大小寫,按照慣例,方法名以小寫字符

你會發現,像...

class PopupListener extends MouseAdapter { 

    @Override 
    public void mousePressed(MouseEvent e) { 
     popit(e); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     popit(e); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     popit(e); 
    } 

    private void popit(MouseEvent e) { 
     if (e.isPopupTrigger()) { 
      pop.show(e.getComponent(), e.getX(), e.getY()); 
     } 
    } 
} 

會更好地工作。不過話說回來,你會發現一般

textarea.setComponentPopupMenu(pop); 

顯著更容易,更容易出錯(它不會引起NullPointerException喜歡你的示例代碼會。

+0

我試過了您提供的代碼,但它拋出了一個異常,但是當我嘗試setComponentPopupMenu(彈出)menthod它的工作。非常感謝!雖然我很好奇爲什麼我的方法沒有工作,生病只是實施我從你那裏學到的方法,我感謝你的幫助! :) –

+0

這不是我的代碼,它是你的。您將'pop'定義爲一個實例字段'JPopupMenu pop;',但是在您的構造函數中將它初始化爲一個局部變量,'JPopupMenu pop = new JPopupMenu();'。我確實說過你會根據你的示例代碼得到一個NPE;) – MadProgrammer