Использование cutsom TableCellRenderer для изменения фона ячейки - PullRequest
0 голосов
/ 19 марта 2012

У меня есть таблица с тремя столбцами строк. Я хочу, чтобы последний столбец имел зеленый фон и жирный шрифт. Поэтому я считаю, что мне нужен пользовательский TableCellRenderer. Но когда я вызываю table.setDefaultRenderer, он ищет Class columnClass вместе с экземпляром моего пользовательского средства визуализации. Поэтому я дал ему значение String.class. Но он не используется для рендеринга, я установил точку останова в его методе getTableCellRendererComponent, и он не ударил.

Вот код, где я устанавливаю пользовательский рендерер -

public class TableTest extends JPanel implements ActionListener {

    MyTableCellRenderer renderer = new MyTableCellRenderer();
    MyTableModel model = new MyTableModel();
    JTable table = new JTable();


    public TableTest() {
        super(new GridLayout(1,0));

        this.setPreferredSize(new Dimension(800, 800));

        model.addRow(Arrays.asList("Testing", "Hello world", "Goodbye"));
        model.addRow(Arrays.asList("Testing", "Hello world", "Goodbye"));
        table = new JTable(model);
        table.setDefaultRenderer(String.class, new MyTableCellRenderer());
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        table.setFillsViewportHeight(true);

        //Create the scroll pane and add the table to it.
        JScrollPane scrollPane = new JScrollPane(table);

        //Add the scroll pane to this panel.
        add(scrollPane);
    }
}



public class MyTableCellRenderer extends JLabel implements TableCellRenderer {

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

        this.setText(value.toString());
        setBackground(Color.GREEN);
        setText("Test");
        return this;
}   

public class MyTableModel extends AbstractTableModel {

    private List<String> columnNames = new ArrayList<String>();

    private List<List> data = new ArrayList();

    {
        columnNames.add("Test");
        columnNames.add("Test");
        columnNames.add("Test");
    }

    public void addRow(List<String> rowData) {
        data.add(rowData);
        fireTableRowsInserted(data.size() - 1, data.size() - 1);
    }

    public int getRowCount() {
        return data.size();
    }

    public int getColumnCount() {
        return columnNames.size();
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        return data.get(rowIndex).get(columnIndex);
    }

}

Что я делаю не так, почему средство визуализации ячеек не привыкло?

Примечание: я отредактировал пост, включив в него другие классы.

Ответы [ 4 ]

3 голосов
/ 19 марта 2012

может быть, там вы можете узнать, как использовать Renderer для JTable , примеры здесь или здесь или здесь

3 голосов
/ 19 марта 2012

Проверьте ваш TableModel.getColumnClass(int col), может быть, он возвращает Object.class.Затем вам нужно зарегистрировать средство визуализации с Object.class вместо String.class, то есть:

table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
2 голосов
/ 19 марта 2012

Я хочу, чтобы последний столбец имел зеленый фон и жирный шрифт.

Если вы просто хотите, чтобы пользовательский рендеринг в последнем столбце вместо вызова table.setDefaultRenderer(), вы могли бы использовать это вместо (при условии, что у вас есть фиксированное количество столбцов в таблице):

table.getColumnModel().getColumn(table.getColumnCount()-1).setCellRenderer(new MyTableCellRenderer());
1 голос
/ 19 марта 2012

Я вижу, у вас есть свой MyTableModel.Вы перегружены getColumnClass() в вашей модели?Затем вы можете указать, что первый столбец содержит строки, и таблица должна затем использовать средство визуализации, установленное для строк.

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