2016-03-11 26 views
1

我想添加一個帶有actionListener的JButton到JPanel中,而不需要像下面那樣聲明JButton。用actionListener添加新的JButton()而不聲明它

JPanel tempPanel = new JPanel(); 
tempPanel.add(new JButton().addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      // DO SOMETHING 
     } 
    })); 

錯誤消息給我Cannot resolve method 'add(void)'

我不知道爲什麼這是不正確的。這只是一個語法錯誤嗎?或者是不是我可以像這樣添加JButton和ActionListener?

我知道肯定,如果我這樣做,它會工作。

JButton tempButton = new JButton(); 
tempButton.addActionListener(new ActionListener() { 
    @Override 
     public void actionPerformed(ActionEvent e) { 
      // DO SOMETHING 
     } 
    }); 
tempPanel.add(tempButton); 

我會感謝您的幫助。提前致謝。

+2

因爲'addActionListener'是你調用方法' JButton',並且該方法不會返回'JButton',因爲它是'void'。最後'void'不是'add'方法的有效參數。你不能像'Java'那樣正常鏈接那些方法,因爲它們很可能不會返回'this'。 – SomeJavaGuy

+0

謝謝你回答我的問題。 所以,這是否意味着沒有什麼不同的方法來使我的第一個代碼工作?除了我已經寫作第二代碼的方式嗎? –

+4

新的JButton(new AbstractAction(){...})你需要在AbstractAction中實現actionPerformed方法,但你會得到基本相同的結果 – MadProgrammer

回答

1

由於tempPanel.add()的返回值爲addActionListener(),Java無法提供錯誤消息。

一些庫確實提供了鏈接功能(例如,Android中的對話框),您可以編寫這樣的代碼。但是,恐怕在這種情況下,你必須首先聲明它,然後爲JButton添加一個監聽器。或者,您可以嘗試編寫自己的JButton擴展的Button類,並且可以在其構造函數中將參數添加爲偵聽器。

2

JButton#addActionListener返回void,是鏈中的最後一個調用,這是編譯器試圖發送到JPanel#add的結果,顯然這是沒有意義的。

雖然我不會爭辯方法鏈的優點,但API是它的方式。

你可以做這樣的事情......

JPanel tempPanel = new JPanel(); 
tempPanel.add(new JButton(new AbstractAction() { 
    @Override 
    public void actionPerformed(java.awt.event.ActionEvent e) { 
     //... 
    } 
})); 

代替,這將導致同樣的事情,你現在要做的

相關問題