0

私の意図は、ListCellRenderer を使用して、アクセスされた (またはクリックされた) リンクを含む赤いセルを強調表示し、アクセスされていないリンクを緑色で強調表示することです。レンダラーは、セルを赤くマークすることに関しては機能しているようです。ただし、さらに行を追加すると、その後はすべて赤色になります。さらに、隣接していない 2 つのセルをマークすると、それらもすべて赤でマークされます。

私は最初にブール変数を持っていたクラス Feed を持っていますが、m_isRead 変数が listModel にあるようにコードを変更しました。ここにコンストラクターがあります。

    public Feed (URL url, String urlName) {
         this.m_urlName = urlName;
         this.m_observers = new ArrayList<Observer>();  
         this.m_isRead = isRead;
    }

現在、このインスタンス変数は、レンダラーを含む listModel クラスで false に設定されています。

 m_isRead = false.

このメソッドを必要としないように調整した ListCellRenderer を使用する場合:

m_feeds.get(index).getM_urlName();

私は次のように進めます:

 class MyCellRenderer extends JLabel implements ListCellRenderer {
         public MyCellRenderer() {
             setOpaque(true);
         }

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

             setText(value.toString());

             Color background = Color.GREEN;
             Color foreground = Color.BLACK;

               //find out if the specific has been read or not
               if (m_feeds.get(index).isM_isRead() == true) {
                 background = Color.RED;
                 foreground = Color.WHITE;


             } else {
                 background = Color.GREEN;
                 foreground = Color.BLACK;
             };

             setBackground(background);
             setForeground(foreground);

             return this;
         }
     }

次に、選択したアイテムを取得するために使用するメソッドを備えた別の内部クラスがあり、その時点でm_isReadを true (読み取り) に設定します。これは Feed クラスから独立し、それに関連するコードはコメントアウトされています。

public class ChangeSelectedIndex implements ListSelectionListener {

    @Override
    public void valueChanged(ListSelectionEvent e) {

        for (int i = 0; i < m_listModel.size(); i++) {  
            if (m_listModel.getElementAt(i) != null) {    
                m_urlName = m_list.getSelectedValue();
                initiateParsing();
                m_updateFeedButton.setEnabled(true);

               // TODO fix behavior for cell renderer
               //this sets the value of the feed being clicked to true
              // m_feeds.get(i).setM_isRead(true);
                 m_isRead = true;
            }
         }// end for 
     }
}

結果は同じです。行を追加すると、それらは緑色で正しいです。各行をクリックすると、最初にクリックした行に隣接する行をクリックした場合、各行が読み取られますが、たとえば、 4 つの行があり、最初の行と最後の行をクリックすると、その間の行 (クリックしていない行) を含むすべての行が赤くなります。同様に、新しい行を追加すると、赤になります。つまり、これらの行の 1 つでもクリックすると、その後に追加する行が赤になります。

誰でも助けることができますか?

前もって感謝します、

乾杯

4

1 に答える 1