2011-07-23 3 views
2

JListを使用していて、セルにListCellRendererを実装するJTextAreasを使用しようとしています。それは動作していません。セルは実際のJTextAreaの代わりにListCellRenderer.toString()を表示するだけです。助けてもらえますか?ありがとう。JTextAreasを含むJListは、JTextAreaの代わりにJTextAreasのtoString()を表示します。


    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

@ファーム:どうぞよろしく! –

-1

レンダラーを使用する必要があります。今はコードがありませんが、かなりシンプルです。 JListのデフォルトレンダラーはtoString()を呼び出し、その結果を表示します。

+0

あなたのダウン投票者ではありません。私はあなたがレンダラーを適用することについて正しいと思います。 'toString() 'の使用法は実装の詳細ですが、どこがうまくいかないのかという良い手がかりになります。 'toString()'の使用は 'Icon'型の値には適用されません。 – trashgod

+0

'toString()'は、カスタムセルレンダラーに適用されません。それ以外の場合、レンダラーは、コーダーが選択するオブジェクトのプロパティを使用することもできます(そうした場合はまったく選択できません)。 –

4

setCellRenderer()を呼び出すことを確認します。これは、「リストの各セルをペイントするために使用されるデリゲート」を設定します。

関連する問題