Установить цвет каждой строки в JTable - Java Swing - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу установить цвет для каждой строки моего JTable в зависимости от сделанного ранее расчета.Тем не менее, расчет является правильным, и он запускает метод setRowColor(), написанный мной самостоятельно, с правильным цветом, но цвет всей таблицы устанавливается.

Итак, если последний элемент оранжевый, вся таблица устанавливаетсяна оранжевый, хотя метод setRowColor() вызывается с другим цветом.То же самое касается любого другого цвета.Вы можете увидеть это на выходе консоли здесь:

Row 0: White
Row (0) & Cell (0) to java.awt.Color[r=255,g=255,b=255]
Row (0) & Cell (1) to java.awt.Color[r=255,g=255,b=255]
Row (0) & Cell (2) to java.awt.Color[r=255,g=255,b=255]


Row 1: Orange
Row (1) & Cell (0) to java.awt.Color[r=255,g=200,b=0]
Row (1) & Cell (1) to java.awt.Color[r=255,g=200,b=0]
Row (1) & Cell (2) to java.awt.Color[r=255,g=200,b=0]

Он всегда устанавливает всю таблицу в последний вызванный цвет!Почему это и как я могу это исправить?Вот мой код:

private void setRowColor(int row, Color color){

        for (int i = 0; i < 3; i++) {
            TableCellRenderer tableCellRenderer = sellTable.getCellRenderer(row, i);
            Component c = sellTable.prepareRenderer(tableCellRenderer, row, i);
            c.setBackground(color);

            System.out.println("Row (" + row + ") & Cell (" + i + ") to " + color.toString());
        }

        System.out.println();
        System.out.println();

    }

Ответы [ 3 ]

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

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

import java.awt.Color;
import java.awt.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * <code>ColoredRenderer</code>.
 */
public class ColoredRenderer {

    public static void main(String[] args) {
        ColorRenderer renderer = new ColorRenderer();
        renderer.setColorForCell(0, 0, Color.YELLOW);
        renderer.setColorForCell(1, 0, Color.CYAN);
        renderer.setColorForCell(2, 0, Color.GRAY);
        renderer.setColorForCell(3, 0, Color.BLUE);
        renderer.setColorForCell(4, 0, Color.GREEN);
        JTable table = new JTable(10, 5);
        // set my renderer for all cells. 
        table.setDefaultRenderer(Object.class, renderer); 
        // Probably in your code you need to set it for each column by using
        // table.getColumnModel().getColumn(columnIndex).setCellRenderer(renderer);
        JFrame frm = new JFrame("Color test");
        frm.add(new JScrollPane(table));
        frm.pack();
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    private static class ColorRenderer extends DefaultTableCellRenderer {
        private final Map<String, Color> colorMap = new HashMap<>();

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            setBackground(null);
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            getColorForCell(row, column).ifPresent(this::setBackground);
            return this;
        }

        public void setColorForCell(int row, int col, Color color) {
            colorMap.put(row + ":" + col, color);
        }

        public Optional<Color> getColorForCell(int row, int col) {
            return Optional.ofNullable(colorMap.get(row + ":" + col));
        }
    }
}

PS Я использую здесь некоторые функции Java8 (Необязательно + Ссылка на метод).Если потребуется, я могу переписать этот код без этих функций.

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

но цвет всей таблицы устанавливается.

Один и тот же рендеринг используется для всех ячеек одного типа данных в таблице.Таким образом, вы не можете установить цвет рендерера заранее.Вам нужно установить цвет при каждом отображении ячейки.

Я хочу установить цвет для каждой строки моего JTable на другой, в зависимости от вычисления

Этот расчет должен быть добавлен к процессу рендеринга.Это позволит динамически окрашивать строку, если данные в строке изменяются.

Простой способ сделать это - переопределить метод prepareRenderer(...) таблицы.Простой пример такого подхода:

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

        //  Alternate row color

        if (!isRowSelected(row))
            c.setBackground(row % 2 == 0 ? getBackground() : Color.LIGHT_GRAY);

        return c;
    }
};

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

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

Это было бы возможно только в том случае, если вы сделаете цвет фона частью модели данных, то есть каждое значение в каждой ячейке должно содержать как отображаемое значение, так и его цвет фона.Затем вам нужно создать и добавить TableCellRendererTableCellEditor, если таблица редактируемая), которая отображает ваши данные.

Например, если вы указываете каждый элемент данных так же просто, как Object[]{color, string} (нерекомендуется; лучше создать класс неизменяемого контейнера), вы можете обойтись без этого:

(изменено с https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#renderer)

public class ColorTextRenderer extends JLabel implements TableCellRenderer {
    public ColorTextRenderer() {
        setOpaque(true); //MUST do this for background to show up.
    }

    public Component getTableCellRendererComponent(
                            JTable table, Object value,
                            boolean isSelected, boolean hasFocus,
                            int row, int column) {
        setBackground((Color)((Object[])value)[0]);
        setText     ((String)((Object[])value)[1]);
        return this;
    }
}
...