1

JavaApiからDirectoryListModelクラスを拡張するクラスを定義しました。AbstractListModel

内部的には、Fileオブジェクトのリストがあります。私はこの方法を次のように定義しましたgetElementAt(int index)

@Override
public Object getElementAt(int index) {
    return directoryElements.get(index)
}

問題は、を使用してJListを実行しようとするとDirectoryListModel、ファイル名だけでなくファイルのフルパスが表示されることです。このコードを次のように変更できます。

@Override
public Object getElementAt(int index) {
    return directoryElements.get(index).getName();

}

不思議に思うかもしれませんが、問題は、onclickイベントでFileオブジェクトを取得して、それらを使用してチェック(ディレクトリかどうかなど)できるようにすることです。文字列をgetElementAt()返すと、その可能性が失われるので、JListがウィンドウに表示する前にFileオブジェクトをフォーマットできる方法があるかどうか、またはシンプルエレガントな方法があるかどうかを確認したいと思います。これを行う。

ありがとう

4

2 に答える 2

2

次の 2 つの理由から、DefaultListCellRenderer を拡張してカスタム コードを追加します。

a) ボーダー、行選択の強調表示など、デフォルトのレンダラーのデフォルトの動作が得られます...
b) レンダラー (すべての Swing レンダラーと同様) は、より高速な描画のために最適化されています。

class MyRenderer extends DefaultListCellRenderer
{
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
    {
        Component c = super.getListCellRendererComponent(list,value,index,false,false) ;
        JLabel label = (JLabel)c;

        label.setText(...);

        return c ;
    }
}

レンダラーの詳細については、リストの使用方法に関する Swing チュートリアルのセクションを参照してください。

于 2010-05-13T03:47:46.337 に答える
2

あなたにとって最善の方法は、レンダラーを使用することです。名前からわかるように、レンダラーは、パラダイム内Vのバッキング データを再生するために使用されます。この場合、 yourはバッキング データであり、レンダラーは の表示したい部分だけを表示するために使用されます。MMVCFileFile

を拡張して を実装するカスタム セル レンダラーを実装するJLabel場合ListCellRenderer、次のような 1 つのインターフェイス メソッドを実装することで簡単な試みから始めることができます。

 public Component getListCellRendererComponent(JList list,
                                               Object value,
                                               int index,
                                               boolean isSelected,
                                               boolean cellHasFocus) {

     setText(((File)value).getName());
     return this;
 }

ListCellRenderer詳しいガイダンスについては、javadoc を参照してください。

于 2010-05-13T00:18:03.487 に答える