Как покрасить конкретную ячейку в примере номера ячейки цвета JTable (2,2)?

У меня есть этот код, и я хочу покрасить каждую ячейку в свой цвет, например, я хочу покрасить номер ячейки 1,1 красным, а номер ячейки 1,2 - светло-красным и так далее. Как это возможно? Я прошел много примеров но все они показывают, как раскрасить ячейку по щелчку мыши или больше, и я не хочу ни того, ни другого. Заранее спасибо.

package test;

public class ModelJTable extends JFrame {
    private DefaultTableModel model;

    private JTable table;

    public ModelJTable() throws IOException {
        super();
        model = new DefaultTableModel();
        model.addColumn("price");
        model.addColumn("quantity");
        model.addColumn("buy");
        model.addColumn("sell");
        String array[][] = new String[6][6];
        array[0][0] = "35";
        array[0][1] = "1";
        array[0][2] = "2";
        array[1][0] = "34";
        array[1][1] = "2";
        array[1][2] = "3";
        array[2][0] = "37";
        array[2][1] = "2";
        array[2][2] = "6";
        array[3][0] = "33";
        array[3][1] = "7";
        array[3][2] = "8";
        array[4][0] = "34";
        array[4][1] = "9";
        array[4][2] = "4";
        array[5][0]="35";
        array[5][1]="9";
        array[5][2]="6";

        String mainarray[][] = new String[6][6];
                //copy all elements of array to mainarray


        for(int i=0;i<5;i++)
        {
            String temp[]={""};
            model.addRow(temp);
        }
        for (int i = 5; i < 10; i++) {
            model.insertRow(i, array[i-5]);
            // System.out.print(mainarray[i][j]+" ");
        }
        table = new JTable(model);

        JTextField textBox=new JTextField();
        TableColumn soprtColumn=table.getColumnModel().getColumn(1);

        soprtColumn.setCellEditor(new DefaultCellEditor (textBox));

        table.setCellSelectionEnabled(true);

        textBox.setBackground(Color.RED);
        JPanel inputPanel = new JPanel();
        inputPanel.add(addButton);
        inputPanel.add(removeButton);
        Container container = getContentPane();
        container.add(new JScrollPane(table), BorderLayout.CENTER);
        container.add(inputPanel, BorderLayout.NORTH);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400, 300);
        setVisible(true);
    }

        public static void main(String args[]) throws IOException {
        new ModelJTable();
    }
     public Component getTableCellRendererComponent
     (JTable table, Object value, boolean isSelected,
     boolean hasFocus, int row, int column) 
  {
      Component cell = model.getTableCellRendererComponent
         (table, value, isSelected, hasFocus, row, column);
      if( value instanceof Integer )
      {
          Integer amount = (Integer) value;
          if( amount.intValue() < 0 )
          {
              cell.setBackground( Color.red );
              // You can also customize the Font and Foreground this way
              // cell.setForeground();
              // cell.setFont();
          }
          else
          {
              cell.setBackground( Color.white );
          }
      }
      return cell;
  }
}

person maddy    schedule 04.06.2013    source источник
comment
На этот вопрос отвечали десятки раз на SO (см. Связанные ссылки в правом столбце этого вопроса). Ответ всегда один и тот же: используйте пользовательский TableCellRenderer. Учебное пособие по Google Swing Средство визуализации JTable.   -  person Guillaume Polet    schedule 04.06.2013
comment
@Gulliaume Polet ,@Jannis Alexakis....Но это не то, что я ищу??Я хочу, чтобы мой стол был цветным, когда я его показываю   -  person maddy    schedule 04.06.2013
comment
Ну да, это то, что делает пример. Он показывает вам, как создать подкласс DefaultTableCellRenderer, чтобы раскрасить ваши ячейки так, как вам нравится. Если это не то, что вы ищете, то я не понимаю вашего вопроса.   -  person Jannis Alexakis    schedule 04.06.2013
comment
@maddy Это именно то, о чем вы просите. Вот еще один пример того, что вы спрашиваете: stackoverflow.com/ вопросов/7181699/ Если это не то, что вы хотите, то ваш вопрос неясен.   -  person Guillaume Polet    schedule 04.06.2013


Ответы (1)


  • есть несколько ошибок я не могу что-то прокомментировать

  • измените if (isRowSelected(row) && isColumnSelected(column)) { на if ((row == 2) && (column == 2)) { (нужно проверить раньше, если количество строк/столбцов больше, чем...), затем

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

из кода

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.*;

public class RemoveAddRows extends JFrame {

    private static final long serialVersionUID = 1L;
    private Object[] columnNames = {"Type", "Company", "Shares", "Price"};
    private Object[][] data = {
        {"Buy", "IBM", Integer.valueOf(1000), Double.valueOf(80.50)},
        {"Sell", "MicroSoft", Integer.valueOf(2000), Double.valueOf(6.25)},
        {"Sell", "Apple", Integer.valueOf(3000), Double.valueOf(7.35)},
        {"Buy", "Nortel", Integer.valueOf(4000), Double.valueOf(20.00)}
    };
    private JTable table;
    private DefaultTableModel model;
    private javax.swing.Timer timer = null;

    public RemoveAddRows() {
        model = new DefaultTableModel(data, columnNames) {
            private static final long serialVersionUID = 1L;

            @Override
            public Class getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        table = new JTable(model) {
            private static final long serialVersionUID = 1L;

            @Override
            public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                Component c = super.prepareRenderer(renderer, row, column);
                if (isRowSelected(row) && isColumnSelected(column)) {
                    ((JComponent) c).setBorder(new LineBorder(Color.red));
                }
                return c;
            }
        };
        DefaultTableCellRenderer stringRenderer = (DefaultTableCellRenderer) table.getDefaultRenderer(String.class);
        stringRenderer.setHorizontalAlignment(SwingConstants.CENTER);
        ListSelectionModel rowSelMod = table.getSelectionModel();
        rowSelMod.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                int row = table.getSelectedRow();
                int col = table.getSelectedColumn();
                String str = "Selected Row(s): ";
                int[] rows = table.getSelectedRows();
                for (int i = 0; i < rows.length; i++) {
                    str += rows[i] + " ";
                }
                str += "Selected Column(s): ";
                int[] cols = table.getSelectedColumns();
                for (int i = 0; i < cols.length; i++) {
                    str += cols[i] + " ";
                }
                str += "Selected Cell: " + table.getSelectedRow() + ", " + table.getSelectedColumn();
                System.out.println(str);
                Object value = table.getValueAt(row, col);
                System.out.println(String.valueOf(value));
            }
        });
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane);
        JButton button1 = new JButton("Remove all rows");
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                if (model.getRowCount() > 0) {
                    for (int i = model.getRowCount() - 1; i > -1; i--) {
                        model.removeRow(i);
                    }
                }
                System.out.println("model.getRowCount() --->" + model.getRowCount());
            }
        });
        JButton button2 = new JButton("Add new rows");
        button2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                start();
            }
        });
        JPanel southPanel = new JPanel();
        southPanel.add(button1);
        southPanel.add(button2);
        add(southPanel, BorderLayout.SOUTH);
    }

    private void start() {
        timer = new javax.swing.Timer(2500, updateCol());
        timer.start();
    }

    public Action updateCol() {
        return new AbstractAction("text load action") {
            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {
                DefaultTableModel model = (DefaultTableModel) table.getModel();
                Object[] data0 = {"Buy", "IBM", Integer.valueOf(1000), Double.valueOf(80.50)};
                model.addRow(data0);
                Object[] data1 = {"Sell", "MicroSoft", Integer.valueOf(2000), Double.valueOf(6.25)};
                model.addRow(data1);
                Object[] data2 = {"Sell", "Apple", Integer.valueOf(3000), Double.valueOf(7.35)};
                model.addRow(data2);
                Object[] data3 = {"Buy", "Nortel", Integer.valueOf(4000), Double.valueOf(20.00)};
                model.addRow(data3);
                System.out.println("model.getRowCount() --->" + model.getRowCount());
                timer.stop();
                int rowIndex = table.getRowCount() - 1;
                table.changeSelection(rowIndex, 0, false, false);
            }
        };
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                RemoveAddRows frame = new RemoveAddRows();
                frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}
person mKorbel    schedule 04.06.2013
comment
Большое спасибо за вашу помощь, но это не то, что я хочу. Это меняет цвет сетки, когда я нажимаю на определенную ячейку, но я хочу, чтобы вся ячейка была заполнена цветом, а не после выбора мыши, но я хочу, чтобы ячейка 2, 2, чтобы быть окрашенным, когда я его ОТОБРАЖАЮ. Спасибо, что уделили время для чтения и понимания моего ужасного кода. - person maddy; 05.06.2013
comment
re_read мое второе изменение, если (isRowSel....(нет проблем с кодированием всего кода вашим..., остальное я оставляю вам), вы можете добавить любое другое if (еще одно согласованное), но затем требуется использовать откат, определенный в else (table.getBackground) - person mKorbel; 05.06.2013