2010-06-22 46 views
1

我在這裏一個新手剛剛加入這個完美的事情,社區。我不得不承認,這是編程問題和答案的最佳網站。現在讓我切入正題:JList的每一行可能需要有不同的字體顏色

我試圖創建在那裏我可以輸入線用不同的字體顏色從ColorChooser採取一個JList。我有如下

感謝您事先的任何答案中描述試過的東西了。 最好的問候, DWC

這裏是我的示例代碼:

class CustomObject 
{ 
    String s; 
    Color color; 
    String scolor; 

    public CustomObject(Color color, String s) 
    { 
     this.s = s; 
     this.color = color; 
    } 

    public String getColor() 
    { 
     return scolor = Integer.toString(color.getRGB()); 
    } 

    public String getData() 
    { 
     return s; 
    } 

    @Override 
    public String toString() 
    { 
     return s + color.getRGB(); 
    } 

} 

class myListRenderer extends DefaultListCellRenderer 
{ 

Color color; 

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

    if (value != null) 
    { 
     CustomObject o = (CustomObject)value; 
     setText(o.getData()); 
     color = new Color(Integer.parseInt(o.getColor())); 
     setForeground(color); 
    } 
    return this; 
} 
} 

我的主要問題是,我得到一個錯誤:在該行

java.lang.ClassCastException: java.lang.String cannot be cast to app.CustomObject 

CustomObject o = (CustomObject)value; 
+0

可能DUP:http://stackoverflow.com/questions/1076473/how-to-generate-a-jlist-with-alternating-colors – Xorty 2010-06-22 12:20:29

+0

我已經檢查過該解決方案,但我不確定如何實際手動給出我想要在每種情況下使用的顏色,與此例不同。 – kxk 2010-06-22 12:36:03

+0

這不是一個SSCCE。我該如何編譯?你在哪裏構建CustomObject並將其添加到模型中?你有沒有看到我在下面的鏈接中提供給你的SSCCE?另外爲什麼getColor方法返回一個String,setForeground()方法需要一個Color對象。既然你傳遞了一個Color對象,爲什麼你要將它轉換爲String/Color? – camickr 2010-06-23 16:30:39

回答

3

如果你想要每一行都有不同的背景顏色,那麼你需要將第在模型中的信息。因此,不是簡單地在模型中存儲字符串,而是存儲包含兩個屬性(顏色和文本)的自定義對象。然後,您的自定義渲染器使用Color設置線條的背景和文本以設置線條的值。

posting示出了使用這種方法的一個例子。該示例適用於組合框,但概念相同。

編輯:我相信這是最初的例子:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.plaf.basic.*; 

public class ComboBoxColor extends JFrame 
{ 
    public ComboBoxColor() 
    { 
     Object[] items = { Color.red, Color.green, Color.blue }; 
     JComboBox comboBox = new JComboBox(items); 
     comboBox.setRenderer(new ColorRenderer(comboBox)); 
     getContentPane().add(comboBox, BorderLayout.NORTH); 
     add(new JTextField(), BorderLayout.SOUTH); 
    } 

    public static void main(String[] args) 
    { 
     ComboBoxColor frame = new ComboBoxColor(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    class ColorRenderer extends BasicComboBoxRenderer 
    { 
     JComboBox comboBox; 
     Border border; 


     public ColorRenderer(JComboBox comboBox) 
     { 
      this.comboBox = comboBox; 
      border = new LineBorder(Color.WHITE); 
     } 

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

      setText(value.toString()); 

      if (!isSelected) 
       setBackground((Color)value); 

      return this; 
     } 
    } 
} 
+0

camickr你能告訴我自定義渲染器如何工作嗎?我知道我問的太多了,但正如我所說的,我對編寫自定義代碼並不熟悉的Java有點新鮮...... – kxk 2010-06-22 16:51:18

+0

你在哪裏給出了一個鏈接到一個示例渲染器,用於交替線條的顏色。所以代碼沒有那麼大的不同。您將值轉換爲您的「自定義對象」。然後使用自定義對象的顏色設置背景。然後,使用自定義對象的文本設置標籤的文本。如果您需要更多幫助,請發佈您的SSCCE(http://sscce.org)。還要注意,你應該擴展默認的渲染器,而不是JLabel。 – camickr 2010-06-22 19:22:30

+0

我試圖讓這個工作現在,但我面臨着這一行的一些問題: CustomObject o =(CustomObject)value; 對於一些bizzare原因我得到的異常: java.lang.ClassCastException:java.lang.String不能轉換爲app.CustomObject – kxk 2010-06-23 15:06:14

相關問題