2011-07-23 25 views
2

我正在使用JList,並試圖爲單元使用JTextAreas(實現ListCellRenderer)。它不工作。單元格只顯示ListCellRenderer.toString()而不是實際的JTextArea。有人可以幫忙嗎?謝謝。包含JTextAreas的JList顯示JTextAreas的toString()而不是JTextArea


    DefaultListModel listModel = new DefaultListModel(); 
    JList list = new JList(listModel); 
    add(list); 

class ButtonListener implements ActionListener() { 
    public void actionPerformed(ActionEvent e){ 
    listModel.clear(); 
    for (String s : stringArray) { 
     listModel.addElement(new Listm(s)); 
    } 
    } 
} 

class Listm extends JTextArea implements ListCellRenderer { 
    protected Listm(String text) { 
    setText(text); //Outputting the text element displays the desired String 
    } 

    public Component getListCellRendererComponent(JList list, Object object, int number, boolean bool, boolean bool2) { 
    setPreferredSize(new Dimension(x, y)); 
    return this; 
    } 
    } 
} 
+1

爲了更快地獲得更好的幫助,請發佈[SSCCE](http://pscode.org/sscce.html)。 –

+0

因爲我不知道問題出在哪裏,所以我比較冗長。 –

+0

但無論冗長,你的代碼沒有多大意義。請發佈可編譯代碼。 –

回答

4

你應該只發布可編譯代碼,而你的代碼有點混亂。您不應將文本傳遞到渲染器的構造函數,因爲這個構造函數將用於呈現列表中所有項目的單個渲染器(除非您希望所有項目都使用相同的代碼)。您不應該忽略傳入getListCellRendererComponent方法的Object參數,因爲這是渲染器項目顯示的數據。例如:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class MyGui extends JPanel { 
    public static final String[] DATA = {"One\n1", "Two\n2", "Three\n3"}; 
    private DefaultListModel listModel = new DefaultListModel(); 
    private JList list = new JList(listModel); 

    public MyGui() { 
     list.setCellRenderer(new Listm(3, 30)); 
     add(new JScrollPane(list)); 
     for (String datum : DATA) { 
     listModel.addElement(datum); 
     } 
    } 

    private class Listm extends JTextArea implements ListCellRenderer { 
     protected Listm(int rows, int cols) { 
     super(rows, cols); 
     setBorder(BorderFactory.createLineBorder(Color.blue)); 
     } 

     public Component getListCellRendererComponent(JList list, Object value, 
       int index, boolean isSelected, boolean cellHasFocus) { 
     setText(value.toString()); 
     if (cellHasFocus) { 
      setBackground(FOCUSED_COLOR); 
     } else if (isSelected) { 
      setBackground(SELECTED_COLOR); 
     } else { 
      setBackground(null); 
     } 
     return this; 
     } 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("MyGui"); 
     frame.getContentPane().add(new MyGui()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 
+0

非常好。我不記得哪個Q,但你以前幫過我一些可靠的答案。謝謝。 –

+0

@farm:不客氣! –

-1

您應該使用渲染器。我現在沒有代碼,但它非常簡單。 JList的默認渲染器調用toString()並顯示結果。

+0

不是你的倒立選民;我認爲你應該使用渲染器是正確的。雖然使用'toString()'是一個實現細節,這是一個很好的線索,說明事情出錯了。 'toString()'的使用不適用於'Icon'類型的值,BTW。 – trashgod

+0

'toString()'不適用於自定義單元格渲染器,除非代碼指定它將使用此代碼。否則,渲染器可以選擇使用編碼器如此選擇的包含對象的任何屬性(或者如果他這樣選擇,則根本沒有)。 –