Как сделать уникальный цвет шрифта для линий в JCombobox? - PullRequest
1 голос
/ 01 июня 2009

Я хочу установить цвет шрифта для строк / записей в JCombobox, уникальный для каждой строки. Таким образом, в основном, когда вы нажимаете стрелку выпадающего меню, вы должны увидеть несколько линий, которые имеют разные цвета, и я хочу сам указать цвета на основе их свойств. Как мне это сделать? Спасибо!

Ответы [ 3 ]

2 голосов
/ 01 июня 2009

Вам необходимо создать собственный ListCellRenderer следующим образом:

class Renderer extends JLabel implements ListCellRenderer {

и реализовать этот метод:

public Component getListCellRendererComponent(JList list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        // Get the selected index. (The index param isn't
        // always valid, so just use the value.)

        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        } else {
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }

        // Display the text
        String text = (String) value;
        setText(text);

        // Get the source

Затем, в зависимости от вашего источника, используйте this.setForeground (Color color), чтобы установить цвет вашего текста. Наконец,

return this;

}

1 голос
/ 18 июля 2013

Вы можете использовать ListCellRenderer. Вам нужно написать собственный класс для этого. Вот полный код для установки переднего плана на основе индекса (чтобы избежать дублирования). Вы также можете установить собственный фон выбора и фон для этого. Смотрите комментарии в коде.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class ListCellRendererDemo2 extends JFrame
{
Hashtable<Integer,Color> table;
JComboBox<String> c;

    public ListCellRendererDemo2()
    {
        createAndShowGUI();
    }

    private void createAndShowGUI()
    {
        setTitle("JComboBox Demo");
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        table=new Hashtable<Integer,Color>();
        table.put(1,Color.RED);
        table.put(2,Color.BLUE);
        table.put(3,Color.GREEN);
        table.put(4,Color.GRAY);


        c=new JComboBox<String>();
        c.addItem("Item 1");
        c.addItem("Item 2");
        c.addItem("Item 3");
        c.addItem("Item 4");
        c.addItem("Item 5");
        c.addItem("Item 6");
        c.addItem("Item 7");
        c.addItem("Item 8");

        c.setRenderer(new MyListCellRenderer(table));

        add(c);
        setSize(400,400);
        setVisible(true);
    }

    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable(){
            public void run()
            {
                new ListCellRendererDemo2();
            }
        });
    }
}
class MyListCellRenderer extends DefaultListCellRenderer
{
Hashtable<Integer,Color> table;

    public MyListCellRenderer(Hashtable<Integer,Color> table)
    {
        this.table=table;

        // Set opaque for the background to be visible
        setOpaque(true);
    }

    public Component getListCellRendererComponent(JList jc,Object val,int idx,boolean isSelected,boolean cellHasFocus)
    {
        // Set text (mandatory)
        setText(val.toString());

        // Set the foreground according to the selected index
        setForeground(table.get(idx));

            // Set your custom selection background, background
            // Or you can get them as parameters as you got the table
            if(isSelected) setBackground(Color.LIGHT_GRAY);
            else setBackground(Color.WHITE);

    return this;
    }
}
1 голос
/ 01 июня 2009

Вам, вероятно, придется предоставить пользовательский рендер для вашего JComboBox, ознакомьтесь с руководством Sun здесь:

http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer

(Извините за отсутствие ссылки, пока не могу опубликовать ссылки, так как я новый участник)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...