2013-03-18 50 views
0

是否可以將listcellrenderer應用於純粹的jlist中的一個單元格?我的代碼目前在應用渲染器時工作正常,但我想爲每個條目設置不同的動態變量。道歉,如果這是一個模糊..將ListCellRenderer應用於JList上的單個單元格

所以總結 - 我想listcellrenderer只應用於列表中的一個單元格,我將如何做到這一點?

謝謝!

回答

2

是否有可能將listcellrenderer應用於純粹的jlist中的一個單元格?

不,所有單元格必須共享相同的渲染器。這就是渲染器的工作原理。

我的代碼目前在應用渲染器中工作正常,但我想爲每個條目設置不同的動態變量。

這可以完成。渲染器可以根據它應該呈現的數據的狀態更改渲染單元格的方式。

道歉,如果這是一個有點含糊..

它總是更好,如果你更多地解釋和顯示的代碼。

所以總結一下 - 我想將listcellrenderer應用於列表中的一個單元格,我該怎麼做?

再次讓渲染器的行爲取決於單元格的值。有關更詳細的答案,請考慮創建併發布sscce並解釋更多(例如,呈現不同的方式?)。

+0

非常感謝,我將發佈代碼並對這個問題更加詳細的解釋! – iainmac 2013-03-18 23:49:15

+0

這裏是問題的鏈接,如果你有任何想法,那就太棒了! http://stackoverflow.com/questions/15489102/dynamically-changing-contents-of-listcellrenderer – iainmac 2013-03-18 23:51:20

+0

@iainmac通常的做法是編輯你現有的問題來包含例子而不是創建一個新的問題。 – rob 2013-03-19 00:37:38

4

您必須將ListCellRenderer應用於列表中的所有元素,但這並不意味着它必須以相同的方式呈現所有元素。例如,你可以根據它的值(原始值或者僅僅基於值的類,或者甚至基於單元格的索引)呈現單元格:

package com.example; 

import java.awt.Color; 
import java.awt.Component; 

import javax.swing.DefaultListCellRenderer; 
import javax.swing.DefaultListModel; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JScrollPane; 

public class ListCellRendererExample extends JFrame { 

    public ListCellRendererExample() { 
     DefaultListModel model = new DefaultListModel(); 
     model.addElement(Color.BLUE); 
     model.addElement("hello"); 
     model.addElement(5); 
     model.addElement(Color.RED); 

     JList jlist = new JList(model); 
     jlist.setCellRenderer(new SuperDuperListCellRenderer()); 
     add(new JScrollPane(jlist)); 

     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     pack(); 
     setLocationByPlatform(true); 
     setVisible(true); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     new ListCellRendererExample(); 
    } 

    private static class SuperDuperListCellRenderer extends DefaultListCellRenderer { 
     @Override 
     public Component getListCellRendererComponent(JList list, Object value, 
       int index, boolean isSelected, boolean cellHasFocus) { 

      // If the value is a color, give the cell a blank value but save its 
      // value so we can later change its background to the value's color. 
      Color bgColor = null; 
      if (value instanceof Color) { 
       bgColor = (Color) value; 
       value = " "; 
      } 

      // Prepend the index to the "even" rows (the first row is row 1) 
      if ((index + 1) % 2 == 0) { 
       value = index + ": " + value; 
      } 

      Component renderComponent = super.getListCellRendererComponent(
        list, value, index, isSelected, cellHasFocus); 

      // If the value is a color, set the cell's background to that color. 
      if (bgColor != null) { 
       renderComponent.setBackground(bgColor); 
      } 

      return renderComponent; 
     } 
    } 
} 
+0

非常好的SSCCE!1+ – 2013-03-19 00:38:20

+0

@rob thanks for幫助! – iainmac 2013-03-22 00:53:42

相關問題