Изменить цвет фона строки JTable на основе значения столбца

привет, я новичок в java jtable cellrendered. Я ищу способ, который работает в моей программе, но мне не повезло найти его. Вот мой JTable

Employee ID   |   Name     |   Status    |   Position
  00565651        Roger       Active        Manager
  00565652        Gina        Active        Crew
  00565652        Alex        Inactive      Crew
  00565652        Seph        Active        Manager    

данные поступили из базы данных MS Access, но я хочу изменить фон/передний план строк, которые имеют значение «неактивно» в столбце статуса. Я нашел много примеров в Интернете, но все это не возможно в моей программе. Кто-нибудь может мне помочь? это моя модель

String[] columnNames = {"Employee ID","Name", "Status", "Position"};
DefaultTableModel model = new DefaultTableModel(columnNames, 0);

и это способ создать мою таблицу и как я извлекаю данные из базы данных

public MyList(){//my constructor
    frame();
    loadListFromDB();
}
public void frame(){//
   //codes for frame setsize,titles etc...
   tblList = new JTable();
   tblList.getTableHeader().setPreferredSize(new Dimension(100, 40));
   tblList.getTableHeader().setFont(new Font("SansSerif", Font.BOLD, 25));
   tblList.setAutoCreateRowSorter(true);
   tblList.setModel(model);
   scrollPane.setViewportView(tblList);
   loadListFromDB();

}
public void loadListFromDB(){
   String sql = "SELECT emp_id,lname,fname,positional_status from tblEmployee";
    try{
        PreparedStatement ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        while (rs.next()){
            Vector row = new Vector();
            for (int i = 1; i <= 4; i++){
                row.addElement( rs.getObject(i) );
            }
            model.addRow(row);
        }
    }catch(Exception err){
        //for error code
    }
}

Как я могу добавить таблицу таким образом? Может ли кто-нибудь привести простой пример, чтобы изменить цвет строки? Заранее спасибо. Моя программа остановилась на этой проблеме.


person Lileth Hernandez    schedule 20.07.2014    source источник
comment
возможный дубликат Как установить столбец и строку JTable цвет?   -  person DavidPostill    schedule 20.07.2014
comment
но данные были просто инициализированы с самого начала, мои данные пришли из базы данных, я не знаю, как поместить мои данные в строку [][] на основе вашего примера.   -  person Lileth Hernandez    schedule 20.07.2014
comment
Ваша проблема заключается не в том, чтобы поместить данные в таблицу, а в том, чтобы изменить цвет строки. Вы должны посмотреть на TableCellRenderer часть примера и добавить рендеринг в свою таблицу.   -  person DavidPostill    schedule 20.07.2014
comment
Вы также можете взглянуть на Визуализация строк таблицы   -  person DavidPostill    schedule 20.07.2014
comment
Источник данных не имеет значения; вот еще один пример.   -  person trashgod    schedule 20.07.2014


Ответы (1)


«Я хочу изменить фон/передний план строк, которые имеют значение «неактивно» в столбце статуса»

На самом деле это просто вопрос получения значения из таблицы/модели. если статус для этой строки неактивен, установите фон/передний план для каждой ячейки в этой строке. Поскольку рендерер визуализируется для каждой ячейки, то в основном вам нужно получить значение [row][statusColumn], и это будет значение статуса для каждой строки. Что-то типа

table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
    @Override
    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row, int col) {

        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);

        String status = (String)table.getModel().getValueAt(row, STATUS_COL);
        if ("active".equals(status)) {
            setBackground(Color.BLACK);
            setForeground(Color.WHITE);
        } else {
            setBackground(table.getBackground());
            setForeground(table.getForeground());
        }       
        return this;
    }   
});

Вот простой пример

введите здесь описание изображения

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

import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

public class TableRowDemo {

    private static final int STATUS_COL = 1;

    private static JTable getTable() {
        final String[] cols = {"col 1", "status", "col 3"};
        final String[][] data = {
                {"data", "active", "data"},
                {"data", "inactive", "data"},
                {"data", "inactive", "data"},
                {"data", "active", "data"}
        };
        DefaultTableModel model = new DefaultTableModel(data, cols);
        return new JTable(model) {
            @Override
            public Dimension getPreferredScrollableViewportSize() {
                return new Dimension(350, 150);
            }
        };
    }

    private static JTable getNewRenderedTable(final JTable table) {
        table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
            @Override
            public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus, int row, int col) {
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
                String status = (String)table.getModel().getValueAt(row, STATUS_COL);
                if ("active".equals(status)) {
                    setBackground(Color.BLACK);
                    setForeground(Color.WHITE);
                } else {
                    setBackground(table.getBackground());
                    setForeground(table.getForeground());
                }       
                return this;
            }   
        });
        return table;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JOptionPane.showMessageDialog(null, new JScrollPane(getNewRenderedTable(getTable())));
            }
        });
    }
}

Другой вариант — @Override prepareRenderer таблицы. Это даст вам тот же результат.

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

import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

public class TableRowDemo {

    private static final int STATUS_COL = 1;

    private static JTable getTable() {
        final String[] cols = {"col 1", "status", "col 3"};
        final String[][] data = {
                {"data", "active", "data"},
                {"data", "inactive", "data"},
                {"data", "inactive", "data"},
                {"data", "active", "data"}
        };
        DefaultTableModel model = new DefaultTableModel(data, cols);
        return new JTable(model) {
            @Override
            public Dimension getPreferredScrollableViewportSize() {
                return new Dimension(350, 150);
            }
            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int col) {
                Component c = super.prepareRenderer(renderer, row, col);
                String status = (String)getValueAt(row, STATUS_COL);
                if ("active".equals(status)) {
                    c.setBackground(Color.BLACK);
                    c.setForeground(Color.WHITE);
                } else {
                    c.setBackground(super.getBackground());
                    c.setForeground(super.getForeground());
                }
                return c;
            }
        };
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JOptionPane.showMessageDialog(null, new JScrollPane(getTable()));
            }
        });
    }
}
person Paul Samsotha    schedule 20.07.2014
comment
Отличный ответ, я искал это. Можем ли мы одновременно изменить стиль заголовков таблицы? - person Mohammed Mohammed; 10.12.2014
comment
@peeskillet, как можно изменить метод подготовки рендеринга, чтобы изменить цвет столбца вместо цвета фона строки? - person Aequitas; 13.08.2015
comment
@peeskillet, когда я использовал ваш код, выбор моей таблицы изменился; он был настроен на выбор строки, теперь он выбирает ячейку, также изменился цвет выбранной ячейки, а не цвет по умолчанию - person Amr Saber; 17.03.2017
comment
я получаю исключение в потоке AWT-EventQueue-0 java.lang.NullPointerException в строке получения значения строки, String entry = (String) table.getModel().getValueAt(row, 2), помогите, пожалуйста, спасибо. - person Hachachin; 10.05.2017
comment
В методе getTableCellRendererComponent имеет ли значение, буду ли я (а) просто вызывать super.getTableCellRendererComponent, а затем вносить изменения в формат, вызывая методы super или this, а затем возвращать this (как это делает этот ответ) или (б) объявлять новый Component x = super.getTableCellRendererComponent и затем изменить формат на x и вернуть x? - person Candamir; 27.07.2017