2016-05-10 17 views
1

JScrollPaneパネルにJList mediaListがあります。リストの内容はDefaultListModelによって維持されます。 JDBC(Sqlite 3)を使用してクエリを作成した後に新しいリストモデルを取得しましたJListのListCellRendererがDefaultListModelの適​​切なインデックスを表示しない

新しく生成されたモデルのサイズがサイズより大きい場合、スクロールペインがモデルの新しいインデックスを描画しないという問題に直面しています以前にフェッチされたモデル。

//コードはmediaModelの長さは3

あるときには、インデックスの下に印刷し、

label.addMouseListener (new MouseAdapter() { 
    DefaultListModel<HashMap<String,String>> mediaModel=new DefaultListModel<>(); 
    mediaModel=mProvider.getNextMenu(paramsCid); // new DefaultListModel 

    medialist = new JList(mediaModel); 
    medialist.setOpaque(false);   
    medialist.setCellRenderer(new MediaCellRenderer()); 

    panel = new JScrollPane(medialist); 
    panel.setPreferredSize(new Dimension(300,300)); 
    pane1.setOpaque(true); 
}); 

class MediaCellRenderer implements ListCellRenderer { 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     System.out.println("index: "+index); 
     JLabel menuTextLabel = new JLabel(mediaModel.get(index).get("title")); 
     return menuTextLabel; 
    } 
} 

mediaModelの長さが2

index: 0 
index: 1 

インデックス以下MediaCellRendererプリントされたときにことを観察したスニペットしかし、

index: 0 
index: 1 
index: 0 // it prints 0 instead of 2 

誰でもこの問題を理解するのに役立つことができますか?

+0

すぐに役立つようにするには、[MCVE]または[ショート、自己完結型、正しい例](http://www.sscce.org/)を投稿してください。いくつかのデータをハードコードしてDBに置き換えます。 –

+0

上記のコードのgetNextMenuは、以下の形式のDefaultListModelを提供します:HashMap fieldList = new HashMap (); listModel.addElement(fieldList); – Kalx

+0

* "..上のコードでは.."と説明しています。私はMCVEをもっと詳しく見ていきます。 –

答えて

1

まず、レンダリングコードが正しくありません。新しいJLabelを作成するべきではありません。レンダラーを使用するという考えは、JList内のすべてのアイテムに対して同じレンダラーを共有することです。これにより、より効率的になります。詳細については、Using a Custom RendererのSwingチュートリアルのセクションを読んでください。実際のレンダラーのサンプルコードについては、コンボボックスのチュートリアルへのリンクをたどる必要があります。

しかし、mediaModelの長さは問題はあなたがGUIに新規のListModelを追加していないです3

あるときには、インデックスの下に表示します。

mediaModel=mProvider.getNextMenu(paramsCid); 
medialist = new JList(mediaModel); 
medialist.setOpaque(false);   
medialist.setCellRenderer(new MediaCellRenderer()); 

panel = new JScrollPane(medialist); 
panel.setPreferredSize(new Dimension(300,300)); 
pane1.setOpaque(true); 

上記は、新しいJScrollPaneを作成しますが、スクロールペインをフレームに追加していません。

より良い解決策は、単に新しいListModelJListを更新することです:

mediaModel=mProvider.getNextMenu(paramsCid); 
mediaList.setModel(mediaModel); 
//medialist = new JList(mediaModel); 
//medialist.setOpaque(false);   
//medialist.setCellRenderer(new MediaCellRenderer()); // may need this as well? 

//panel = new JScrollPane(medialist); 
//panel.setPreferredSize(new Dimension(300,300)); 
//pane1.setOpaque(true); 

これは新しいJListの持つ既存のスクロールペインを更新します。

+0

上記の解決策は私のために働いた。 – Kalx

関連する問題