2012-06-07 76 views
1

我有時會看到這樣的代碼:設置對象關於其創建屬性

new myJFrame().setVisible(true); 

我並不確切地知道它是如何工作的,但它實際上創建了一個myJFrame,並將其設置可見,以替代其設置在構造函數中可見。

我想知道的是,如果有將是一個辦法做到這一點上的JMenuItem或JButton的自動爲其分配一個ActionListener,而無需先明確聲明它,如:

myJMenu.add(new JMenuItem("Item").addActionListener(myActionListener)); 

哪,據我所知,不起作用。

我並不完全是需要它的工作,我只想知道它是否可能,因爲它會爲我節省一些好時機。

在此先感謝。

回答

3

它被稱爲method chaining簡而言之,一個類支持或不支持,取決於它的寫法。

它做的方法很簡單:

public class Bar { 

    private Set<Foo> foos; 

    public Bar addFoo(Foo foo) { 
    this.foos.add(foo); 
    return this; 
    } 
} 

從這也可以看到爲什麼它是不可能說沒有這樣寫鏈的方法。

+0

你的意思是,我只能做到帶班我創建和這樣寫?更具體地說,我可以用JMenuItem和/或JButton來做到嗎? (因爲我不知道我是否能看到它們是如何創建的) –

+0

@AndréLeria是的。或者別人用這種方式寫的類。 Swing類通常不以這種風格寫。但是如果你閱讀一個方法的javadoc,它應該是顯而易見的:如果文檔說方法返回'this',那麼你可以鏈接它們。如果它返回'void',則不能。 – biziclop

0

,如果你想污穢你可以做一個非final類的匿名擴展,並添加一個匿名的構造函數初始化的東西:

ArrayList ar=new ArrayList() 
    { 
     { 
     add(new Object()); 
     } 
    }; 
+0

如果有的話,這比非鏈接版本更不可讀:) – biziclop

+0

是的,但在某些情況下,這是有用的。對於這種情況,它是純粹的混亂;) –

+0

像例如添加噸的項目菜單,或初始化一個ArrayList或散列映射與許多項目。 –

3

你提出的代碼將無法工作,因爲JMenuItem.addActionListener()不返回任何東西(這是一個無效的方法),所以沒有什麼可以作爲參數傳遞給JMenu.add()

在第一個例子中,也沒有返回,但沒關係。

正如@biziclop所述,在某些編碼風格中,大多數方法返回this,以便它們可以鏈接在一起。例如,使用Fluent InterfaceBuilders傾向於這樣做。

3

作爲替代,可以考慮使用JMenuItem構造函數的Action

myJMenu.add(new JMenuItem(new AbstractAction("Item") { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     ... 
    } 
}); 
+0

有一個相關示例[此處](http://stackoverflow.com/a/4039359/230513)。 – trashgod

+0

這不是任何選擇,回答問題 – mKorbel

+1

這是通過改變'...));'到'{....})致敬你的答案;'' – mKorbel

相關問題