Вопрос по swing, jtable, tablecellrenderer, java – Раскраска jTable строки

4

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

private class CustomCellRenderer extends DefaultTableCellRenderer {

/* (non-Javadoc)
 * @see    
javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
 */

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

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

//Set foreground color
// rendererComp.setForeground(Color.red);
//Set background color
  rendererComp .setBackground(Color.pink);

 return rendererComp ;
 }

}

И я называю приведенный выше код, используя,

 jTable1.getColumnModel().getColumn(3).setCellRenderer(new CustomCellRenderer());

Но я хочу сделать то же самое для строк в jTable..There нет getColumnModel () или getColumn () в случае строк..Так какой альтернативный способ сделать это? Я делаю это в Netbeans с помощью Java Swing ..

Ваш Ответ

3   ответа
6

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

import java.awt.Color;
import java.awt.Component;
import java.util.Enumeration;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class TestTable {

    public class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {

        @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);
            setText(String.valueOf(value));
            boolean interestingRow = row % 5 == 2;
            boolean secondColumn = column == 1;
            if (interestingRow && secondColumn) {
                setBackground(Color.ORANGE);
            } else if (interestingRow) {
                setBackground(Color.YELLOW);
            } else if (secondColumn) {
                setBackground(Color.RED);
            }
            return this;
        }

    }

    private JFrame f;
    private JTable table;

    protected void initUI() {
        Vector<Vector<Object>> data = new Vector<Vector<Object>>();
        Vector<String> columNames = new Vector<String>();
        columNames.add("Col 0");
        columNames.add("Col 1");
        columNames.add("Col 2");
        for (int i = 0; i < 20; i++) {
            Vector<Object> v = new Vector<Object>();
            v.add(i % 3 == 0 ? "Hello" : "World");
            v.add("Some data in row " + (i + 1));
            v.add("Some other data in row " + (i + 1));
            data.add(v);
        }
        table = new JTable(new DefaultTableModel(data, columNames));
        Enumeration<TableColumn> en = table.getColumnModel().getColumns();
        while (en.hasMoreElements()) {
            TableColumn tc = en.nextElement();
            tc.setCellRenderer(new MyTableCellRenderer());
        }
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.add(new JScrollPane(table));
        f.pack();
        f.setVisible(true);

    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestTable().initUI();
            }
        });
    }

}
@ Tickua Вы сами не вызываете TableCellRenderer, вы позволяете JTable сделать это за вас. Он будет вызывать вас автоматически для всех ваших строк при первом отображении, а затем, запустив соответствующие события TableModel, в конечном итоге вызовет ваш TableCellRenderer. Если у вас все еще есть проблемы с этим, подумайте о прочтенииthis tutorial или отправьте другой вопрос на SO.
Раскраска строк работает в соответствии с вашим примером, но есть одна проблема .. Можете ли вы помочь мне Luna
for (int i = 0; i & lt; serialNumber; i ++) {if ((jTable1.getValueAt (i, 1) .toString ()). equals (BidNumber)) {}} Мне нужно вызвать это из условия if, передав & APOS; я & APOS; значение в виде строки и 1 в качестве столбца .. не могли бы вы упростить код для этого? Luna
@ Tickua Я не уверен, что понимаю ваш комментарий. В методеgetTableCellRendereComponentу вас есть доступ ко всей информации, которая вам может понадобиться: JTable, текущее значение ячейки и положение ячейки в таблице (строка и столбец), а также, выбран ли текущий ряд, и если текущая ячейка сосредоточенный. Из таблицы вы также получаете доступ к вашей TableModel (table.getModel ()). Я думаю, что оттуда должно быть довольно легко вычислить любое желаемое условие и установить соответствующий цвет фона.
Это я знаю ... Но мой вопрос заключается в том, как я могу вызвать метод getTableCellRendereComponent (), указав мою i-ю строку и 1-й столбец ... Я пытался таким же образом ... , renderer.getTableCellRendererComponent (jTable1, 1, true, true, i, 1); Luna
3

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

0

лучше, если бы вы использовали gridLayout с использованием layoutManager для вашего контейнера (я думаю, это должен быть JFrame). Вы можете добавлять отдельные компоненты (JPanels, Jbuttons или любой другой JComponent) и обрабатывать их внешний вид с помощью методов paint () / repaint ().

EDIT

OR Вы можете изменить метод getTableCellRendererComponent (....), чтобы установить свои собственные цвета фона, используя вложенные операторы if-else или switch-case в соответствии со строками int, столбцами int (которые предоставляются в качестве аргументов).

Это будет намного проще

Я не вижу, как это грязно. Напротив, использование JTable для отображения TableData на самом деле является хорошей практикой. Слишком часто люди используют сложные макеты и панели для отображения данных таблицы.
использование JTable - это нормально, но вы должны реализовать интерфейс TableCellRenderer, а не наследовать весь класс
Спасибо, Гийом Полет .. Luna
Какой в этом смысл? Используя DefaultTableCellRenderer, вы также автоматически получаете подходящие L & F-зависимые цвета (цвет выделения фона различен для разных L & F / платформ). Если рендеринг на самом деле не JLabel, а что-то более сложное, я не вижу, почему бы не использовать то, что уже есть.
да, это правда. Я понимаю вашу точку зрения

Похожие вопросы