2014-10-02 4 views
-1

Я использую TableCellRenderer в функции для изменения цвета строки.Цвет JTable строка

public void change_color(JTable tableName){ 
tableName.setDefaultRenderer(Object.class, new TableCellRenderer(){ 
    private DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer(); 

      @Override 
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
       Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

        c.setBackground(Color.RED); 


     //Add below code here 
       return c; 
      } 

     }); 

} 

Он меняет цвет всей таблицы. Для вызова этой функции я использую следующее условие.

if(ellapsed.getMinutes() > 30) 
      { 
      change_color(table_dineIn,ellapsed.getMinutes()); 
      } 

Невозможно выяснить проблему. Я пробовал другие коды, но мне ничего не помогало.

+0

Простой комбинация клавиш Ctrl + щелчок по методу, который вы вызываете, показывает проблему. Когда вы устанавливаете фон для 'DEFAULT_RENDERER', вы устанавливаете его как значение по умолчанию для других. Ура. Также обратите внимание, что у вас нет ЛЮБОЙ логики, чтобы различать строки. Фрагмент кода в нижней части вопроса, похоже, не связан с визуализатором. Почему в мире вы ожидали, что он это сделает? Что не так с методами, которые Google дает вам на «jtable color single row»? Это включает в себя также немало вопросов SO. – Ordous

+0

Это то, что я на самом деле хотел спросить ... как отличить строки –

+0

возможный дубликат [Изменение цвета ячеек без изменения цвета в других ячейках (Jtable)] (http://stackoverflow.com/questions/24555289/changing- cell-color-without-change-color-in-other-cells-jtable) – Marco13

ответ

0

Клеточные рендереры в JTable, JList и т.д. используются как штамп (см Editors and Renderers для подробностей).

Это означает, что обычно (идентичный) JComponent используется для покраски всех ячеек. Этот компонент заполняется только соответствующим содержимым, прежде чем он будет использоваться для окраски ячейки. И когда фон установлен на RED, он останется красным, пока не будет установлен другой цвет.

Я не уверен, чего вы хотели достичь, используя этот пример DEFAULT_RENDERER. Вы можете просто наследовать от DefaultTableCellRenderer и вернуть компонент (который фактически является самим рендерером) прямо. Однако, в любом случае, вы должны включать некоторый код, который удостоверяется, что соответствующий цвет устанавливается для каждого вызова, примерно как

.... 
if (shouldBeRed(row, column)) { 
    c.setBackground(Color.RED); 
} else { 
    c.setBackground(notRed); 
} 
return c; 

(обратите внимание, что это на самом деле может быть скрыт в вызове к super метод, если вы расширяете DefaultTableCellRenderer, но детали здесь зависит от того, будете вы держать этот DEFAULT_RENDERER экземпляр или нет ...)

вы также можете быть заинтересованы в this example of blinking table cells, показывая, как несколько ячеек таблицы могут быть назначены разные цвета, основанные на определенных критериев.


EDIT: Пример. Хотя я обычно стараюсь избегать answereing подобных вопросов с примерами, как это, потому что даже для малейшего модификации, вы будете задать еще один вопрос, который в этом случае, вероятно, в строке

  • тома, как ООН -highlight строки
  • как выделить несколько строк
  • как выделить несколько строк с различными цветами
  • ...

Yo Вы найдете ответы на все эти вопросы в https://stackoverflow.com/a/24556135/3182664 - тем временем, я помету этот вопрос как дубликат.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableCellRenderer; 

public class TableRowColor 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("TableRowColor"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.getContentPane().setLayout(new BorderLayout()); 

     final JTable table = createTable(); 
     JScrollPane scrollPane = new JScrollPane(table); 
     frame.getContentPane().add(scrollPane, BorderLayout.CENTER); 

     JButton changeColorButton = new JButton("Change color"); 
     changeColorButton.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       changeColor(table, 1); 
      } 
     }); 
     frame.getContentPane().add(changeColorButton, BorderLayout.SOUTH); 

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

    private static JTable createTable() 
    { 
     String[] columnNames = { "First Name", "Last Name", "Sport", }; 
     Object[][] data = { { "Kathy", "Smith", "Snowboarding" }, 
      { "John", "Doe", "Rowing" }, { "Sue", "Black", "Knitting" }, 
      { "Jane", "White", "Speed reading" }, { "Joe", "Brown", "Pool" } }; 
     return new JTable(data, columnNames); 
    } 

    public static void changeColor(JTable table, final int coloredRow) 
    { 
     table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() 
     { 
      @Override 
      public Component getTableCellRendererComponent(JTable table, 
       Object value, boolean isSelected, boolean hasFocus, int row, 
       int column) 
      { 
       super.getTableCellRendererComponent(table, value, isSelected, 
        hasFocus, row, column); 
       if (row == coloredRow) 
       { 
        setBackground(Color.RED); 
       } 
       else 
       { 
        setBackground(null); 
       } 
       return this; 
      } 
     }); 
     table.repaint(); 

    } 

} 
-2

Следующая будет цвет 30 строки таблицы:

public void change_color(JTable tableName){ 
tableName.setDefaultRenderer(Object.class, new TableCellRenderer(){ 
    private DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer(); 

      @Override 
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
       Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
       if (row == 30) { 
        c.setBackground(Color.RED); 
       }  
       return c; 
      } 

     }); 

} 

Edit:

Если вы хотите выбрать таблицу цветов на основе данных, добавить, что данные в табличной модели (например, времени хранится в определенном столбце), затем используйте модель в рендерере. Например:

static final int TIME_ELLAPSED_COL = ...; 
... 
if (((Time) table.getModel().getValueAt(row, TIME_ELLAPSED_COL)).getMinutes() > 30) { 
    c.setBackground(Color.RED); 
} 
... 
+0

На основе ellapsed.getHours() ... Я добавляю строку, и если ellapsed.getMinutes()> 30, мне нужен этот фон строки чтобы быть красным –

+0

while (rs.next()) { dtm.addRow (новый объект [] {rs.getString («Номер заказа»), rs.getString («Таблица»), rs.getString («Имя официанта» "), rs.getString (" Истекшее время "), false}); Время ellapsed = rs.getTime («Время истекло»); if (ellapsed.getMinutes()> 30) { change_color (table_dineIn); } –

+0

Ваш ответ не работает, его все еще окрашивает всю таблицу. –

Смежные вопросы