2011-09-18 127 views
4

我正在學習一系列Java教程。我有一個關於教程的問題72.Java - 已棄用的方法 - 該怎麼辦?

鏈接:http://www.youtube.com/watch?v=9z_8yEv7nIc&feature=relmfu

在視頻的7:02,這句話被寫入。但是,此方法在Java 1.7中已被棄用。

RightList.setListData(LeftList.getSelectedValues());

Eclipse中返回以下錯誤:

Object[] javax.swing.JList.getSelectedValues() 
    getSelectedValues 
    @Deprecated 
    public Object[] getSelectedValues() 
    Deprecated. As of JDK 1.7, replaced by getSelectedValuesList() 
    Returns an array of all the selected values, in increasing order based on their indices in the list. 
    Returns: 
    the selected values, or an empty array if nothing is selected 
    See Also: 
    isSelectedIndex(int), getModel(), addListSelectionListener(javax.swing.event.ListSelectionListener) 

但這返回一個錯誤說「的方法setListData(Object[]) in the type JList is not applicable for the arguments (List)'

替換上述語句的正確方法是什麼?


另外,我想借此機會問另一個無關的問題。它是更好地初始化變量的方法外,像這樣:

private   JList  LeftList = new JList(); 
    private   JList  RightList = new JList(); 
    private   JButton  Move  = new JButton("Move -->"); 

    private static String[] Items  = {"Item 1", "Item 2","Item 3","Item 4","Item 5"}; 

相比(如視頻所示):聲明變量,如上面的類外,但裏面的方法分配值給他們?

要麼性能更好?

+1

你在問初始化*變量,而不是*聲明*它們。此外,這不是「課外」,而是一種方法。初始化*變量的位置取決於它們的使用方式,通常是一種偏好問題。性能差異通常可以忽略不計,除非您創建*巨大數量的數字並在創建時初始化變量,而不是根據需要進行初始化。 –

+0

好的,謝謝你的回覆。我傾向於交替使用這樣的術語,對於任何混淆抱歉。我應該使用正確的術語,謝謝提醒。 =) – Deley

+0

'LeftList'是什麼類型的變量?它是JList嗎?同時顯示實際的錯誤信息,而不是你對它的解釋。 –

回答

9

根據JList的javadoc Java7我看到你確實沒有別的選擇 - 這兩種API(getSelectedValuesListsetDataList)無關。

要解決這個問題,一個簡單的解決方案是執行LeftList.getSelectedValuesList().toArray() - 它將爲您提供一個適合於setDataList的陣列。免責聲明:我不知道這是否是Java推薦的「正確」用法,但它應該起作用。另外,請注意,不贊成使用的API並不意味着它不起作用 - 如果您覺得現在不想投入時間,那麼仍然可以使用舊的API(例如在您的情況下做一個教程,而不是一些正在進行的產品,將在未來10年的生產)

至於第二個問題 - 這是一個味道的問題,我更喜歡聲明變量,而不需要在類聲明和設置中初始化它們他們與構造函數中的值。習慣上給常量賦初值(例如public static final String AAA = "XYZ";

+0

除了我不關心的類型錯誤之外,這很好用。再次,我會嘗試使用適當的樣式約定。謝謝大家。我希望我能接受你所有的答案,但我不能。 =) – Deley

+0

偉大的解決方案。我偶然發現了同樣的問題。 – skiabox

3

你需要更新setListData方法採取新的參數類型(以及所期待的Object[],包括迭代這個數組方法,可能事情任何其他代碼等),僅僅因爲一些已經過時沒有按這並不意味着刪除,但。

要做什麼取決於您的直接目標:是學習材料還是學習材料更新所有源以編譯時不帶警告。

+0

好吧,我正在瀏覽智能感應菜單,但找不到其他任何東西轉動對象數組。我應該創建一個方法來做同樣的事情嗎?是的,編譯時不需要警告是有益的。但是,我不明白他們,例如(JList是一個原始類型,對泛型JList 的引用應該被參數化)。謝謝。 – Deley

+0

不,您需要更改* your *方法(即教程代碼)以使用替換已棄用方法的方法的返回值類型。再次,它取決於你的目標:IMO試圖重寫代碼*並且*學習材料*和*將泛型扔到混合中是一團糟。選擇一些東西,首先關注它,然後完成剩下的事情。 –

+0

好的,也許我正在嘗試做出不必要的更改。我會牢記這個建議。感謝您的輸入。 – Deley

2

我看了一下有問題的教程。

你對API的問題,你需要做到以下幾點:

rightList.setListData(leftList.getSelectedValuesList().toArray()); 

PS:關於風格的一些技巧。在Java中,變量通常以小寫字母開頭,類名以大寫字母開頭。在上面的代碼中,它向我展示了您試圖在類上調用靜態方法,因此您可能需要將名稱更改爲小寫。

+0

啊,謝謝。它現在有效,只給我一個關於類型的錯誤,我很高興忽略它。我會牢記樣式提示,因爲按照適當的約定比我自己的約定更重要。 =) – Deley