1

JList を使用して特定のインデックスの色を変更するにはどうすればよいですか。色を変更することはできますが、リスト全体の色が変更され、特定のインデックスをある色に変更し、別のインデックスを別の色に変更できる必要があります。

私は非常に多くの組み合わせを試しましたが、インデックスではなくリスト全体の色のみを変更しているようです。リスト全体を参照しているため、特定のインデックスに対して変更する方法がわかりません。

    m.aList.setCellRenderer(new MyCellRender());

  private class MyCellRender extends DefaultListCellRenderer  
{    

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

        ArrayList<Object> values = new ArrayList<>();
        ArrayList<String> complete = new ArrayList<>();
        ArrayList<String> incomplete = new ArrayList<>();

        for (int i = 0; i < list.getModel().getSize(); i++) {
            values.add(list.getModel().getElementAt(i));
        }

        for (Object o : values) {
           if (o.toString().contains("COMPLETED")) {
               complete.add(o.toString());
           }
           if (o.toString().contains("INCOMPLETE")) {
               incomplete.add(o.toString());
           }
        }

        for (String s : complete) {
            setForeground(Color.green);
        }
        for (String s1 : incomplete) {
            setForeground(Color.red);
        }

        return( this );  
    }  
}

リストの値には COMPLETED または INCOMPLETE が含まれており、値に応じて色を変更したいと考えています。

4

2 に答える 2

6

リストの値には COMPLETED または INCOMPLETE が含まれており、値に応じて色を変更したいと考えています。

まず、次の 3 つのリストを保持する必要はありません。

ArrayList<Object> values = new ArrayList<>();
ArrayList<String> complete = new ArrayList<>();
ArrayList<String> incomplete = new ArrayList<>();

ListCellRendererコンポーネントは JList の各要素に対して評価されるため、これらのリストは無意味です。次のようにして、要件を簡単に実装できます。

private class MyCellRender extends DefaultListCellRenderer {
   @Override
   public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
       super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
       if(value.toString().contains("INCOMPLETE") ||  value.toString().contains("COMPLETED")) {
           Color fg = value.toString().contains("COMPLETED") ? Color.green : Color.red;
           setForeground(fg);
       } else {
           setForeground(list.getForeground());
       }
       return this;
   }
}

詳細については、 How to Use Lists Trail のWrite a Custom Cell Rendererセクションを参照してください。

于 2014-01-03T16:51:30.900 に答える