Выделите указанную строку JTable - PullRequest
0 голосов
/ 28 мая 2018

Я знаю, что были предыдущие темы для аналогичной проблемы, но даже с этим я не смог решить свою проблему.

Так вот, когда я добавляю новую пустую строку в свой JTable, я хочувыделить его серым цветом.Так что это работает для первого, но когда я пытаюсь добавить второй ряд, второй будет белым ...

Я попытался отладить, но безуспешно, я не нашел свою ошибку.

Вот класс для выделения строки:

class GrayWhiteRenderer extends DefaultTableCellRenderer {

    private int rowToColored;

    GrayWhiteRenderer(int rowToColored) {
        this.rowToColored = rowToColored;
        Color color = UIManager.getColor ( "table.row" );
    }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            if (UIManager.getColor ( "table.row" )==Color.GRAY) {
                c.setBackground(Color.GRAY.brighter());
            }
            else if(row == rowToColored) {
                c.setBackground(Color.GRAY.brighter());
            } else {
                c.setBackground(Color.WHITE);
            }
        return c;
    }
}

Я сохраняю индекс всей новой строки в rowToAdd в начале его (например: [19, 20, 21, -1, -1, ...]. -1 - этознать, когда мне нужно перестать смотреть, если мне нужно выделить больше):

while(rowToAdd[k]!=-1) {
    System.out.println("rowToAdd[k] : "+rowToAdd[k]);
    dataTable.setDefaultRenderer(Object.class, new GrayWhiteRenderer(rowToAdd[k]));
    k++;
}

А вот класс для проверки:

package Graphic;

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;

class Test implements Runnable, ActionListener {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Test());
    }

    JTable table;

    @Override
    public void run() {
        JFrame frame = new JFrame("Custom Cell Renderer");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        table = new JTable(new DefaultTableModel(0, 2) {
            @Override
            public Class<?> getColumnClass(int c) {
                return Object.class;
            }
        });

        class GrayWhiteRenderer extends DefaultTableCellRenderer {
            private int rowToColored;
            GrayWhiteRenderer(int rowToColored) {
                this.rowToColored = rowToColored;
            }
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                if (UIManager.getColor ( "table.row" )==Color.GRAY) {
                    c.setBackground(Color.GRAY.brighter());
                }
                else if(row == rowToColored) {
                    c.setBackground(Color.GRAY.brighter());
                } else {
                    c.setBackground(Color.WHITE);
                }
                return c;
            }
        }

        table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(table.getRowCount()));
        table.setTableHeader(null);

        JButton btn = new JButton("Add Row");
        btn.addActionListener(this);

        JToolBar bar = new JToolBar();
        bar.setFloatable(false);
        bar.add(btn);

        JPanel content = new JPanel(new BorderLayout());
        content.add(bar, BorderLayout.NORTH);
        content.add(new JScrollPane(table), BorderLayout.CENTER);

        frame.setContentPane(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        int nextRow = table.getRowCount();
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        model.addRow(new Object[] { "" + nextRow, "" + nextRow });
        for(int i=0; i<model.getColumnCount(); i++) {
            table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(i));
        }
    }

}

1 Ответ

0 голосов
/ 28 мая 2018

Итак, я исправил ваш пример.Вот ваш код с моими комментариями

@Override
public void actionPerformed(ActionEvent ae) {
    int nextRow = table.getRowCount();
    DefaultTableModel model = (DefaultTableModel) table.getModel();
    model.addRow(new Object[] {"" + nextRow, "" + nextRow});
    // the correct row is: nextRow. No loop required here.
    table.setDefaultRenderer(Object.class, new GrayWhiteRenderer(nextRow));
}

Я бы также исправил ваш рендерер, чтобы выделить выделение

class GrayWhiteRenderer extends DefaultTableCellRenderer {
    private int rowToColored;

    GrayWhiteRenderer(int rowToColored) {
        this.rowToColored = rowToColored;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        // As I know there is no value is registered for "table.row" in UIManager
        // so I've skipped the first condition
        if (row == rowToColored) {
            c.setBackground(Color.GRAY.brighter());
        } else {
            // use correct color depended on whether the cell is selected or not!
            c.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
        }
        return c;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...