Задавать строки разных цветов в JTable? - PullRequest
0 голосов
/ 22 декабря 2018

Добрый день, у меня проблема с моим классом рендеринга, использованным для рендеринга JTable.Я хочу, чтобы цвет фона строк от 1 до 4 был синим, от 5 до 6 - оранжевым, а с 18 до 20 - красным.Тем не менее, это не позволяет мне сделать это.Я не получаю никаких ошибок, но этот код позволяет мне установить только одно из этих трех условий.Если я добавлю этот код, единственное, что появляется в таблице, это последние три строки красного цвета, и я хочу, чтобы три строки были одновременно.

class TeamBold extends DefaultTableCellRenderer {
    private String nombre;

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
            int row, int column) {

        JLabel parent = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if (value.equals(nombre)) {
            parent.setFont(parent.getFont().deriveFont(Font.BOLD)); //Here I just set a certain cell to bold
        }
        for (int i = 0; i<table.getRowCount();i++) {

        }
        if (row >= 0 && row <4) {
            parent.setBackground(Color.BLUE);
            parent.setForeground(Color.WHITE);
        }
        if (row >= 4 && row <6) {
            parent.setBackground(Color.orange);
            parent.setForeground(Color.WHITE);
        } 
        if (row >= 17 && row <19) {
            parent.setBackground(Color.RED);
            parent.setForeground(Color.WHITE);
        } 
        else {
            parent.setBackground(Color.white);
        }
        return parent;
    }

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

Остались блоки "else".Это код.

JLabel parent = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
		if (value.equals(nombre)) {
			parent.setFont(parent.getFont().deriveFont(Font.BOLD));
		}

		if (row >= 0 && row < 4) {
			parent.setBackground(Color.BLUE);
			parent.setForeground(Color.WHITE);
		} else if (row >= 4 && row < 6) {
			parent.setBackground(Color.orange);
			parent.setForeground(Color.BLACK);
		} else if (row >= 17 && row < 20) {
			parent.setBackground(Color.RED);
			parent.setForeground(Color.WHITE);
		} else {
			parent.setForeground(Color.black);
			parent.setBackground(Color.white);
		}
		return parent;
0 голосов
/ 22 декабря 2018

Другим вариантом является переопределение prepareRenderer(...) метода JTable.Этот подход будет работать, даже если в вашей таблице есть объекты String, Integer, объекты в вашей модели.Проверьте Рендеринг таблицы строк для получения дополнительной информации.

Базовая реализация этого предложения будет выглядеть примерно так:

JTable table = new JTable(25, 5)
{
    public Component prepareRenderer(TableCellRenderer renderer, int row, int column)
    {
        Component c = super.prepareRenderer(renderer, row, column);

        if (isRowSelected(row)) return c;

        //  Customize row colors

        c.setBackground( getBackground() );
        c.setForeground( getForeground() );

        if (row < 4)
        {
            c.setBackground(Color.BLUE);
            c.setForeground(Color.WHITE);
        }
        else if (row < 6)
        {
            c.setBackground(Color.orange);
            c.setForeground(Color.BLACK);
        }
        else if (row >= 17 && row < 20)
        {
            c.setBackground(Color.RED);
            c.setForeground(Color.WHITE);
        }

        return c;
    }
};

Вам необходимо использовать getVauleAt(...)метод, чтобы получить значение, чтобы определить, хотите ли вы сделать ячейку жирным.

0 голосов
/ 22 декабря 2018

else охватывает только последние if.

Также не уверен, хотите ли вы установить передний или задний план в блоке else.

Я предполагаю, что вы хотитеelse s вроде:

    if (row >= 0 && row <4) {
        parent.setBackground(Color.BLUE);
        parent.setForeground(Color.WHITE);
    } else if (row >= 4 && row <6) {
        parent.setBackground(Color.orange);
        parent.setForeground(Color.WHITE);
    } else if (row >= 17 && row <19) {
        parent.setBackground(Color.RED);
        parent.setForeground(Color.WHITE);
    } else {
        // setForeground?? - currently whatever was set last time through.
        parent.setBackground(Color.white);
    }

Также шрифт обычно оставляют на то, что было установлено в прошлый раз.

Возможно, лучше написать что-то вроде:

import static java.awt.Color. *;

    Component component = super.getTableCellRendererComponent(
        table, value, isSelected, hasFocus, row, column
    );

    // Here we just set a certain cell to bold
    component.setFont(parent.getFont().deriveFont(
        value.equals(nombre) ? Font.BOLD: Font.PLAIN
    )); 

    final Color fg;
    final Color bg;
    if (0 <= row && row < 4) {
        fg = WHITE; bg = BLUE;
    } else if (row <= 4 && row < 6) {
        fg = WHITE; bg = ORANGE;
    } else if (17 <= row && row < 19) {
        fg = WHITE; bg = RED;
    } else {
        fg = BLACK; bg = WHITE;
    }
    component.setForeground(fg);
    component.setBackground(bg);

(Обратите внимание, this работает также component, но вам необходимо его настроить.)

...