Клеточные рендереры в 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();
}
}
Простой комбинация клавиш Ctrl + щелчок по методу, который вы вызываете, показывает проблему. Когда вы устанавливаете фон для 'DEFAULT_RENDERER', вы устанавливаете его как значение по умолчанию для других. Ура. Также обратите внимание, что у вас нет ЛЮБОЙ логики, чтобы различать строки. Фрагмент кода в нижней части вопроса, похоже, не связан с визуализатором. Почему в мире вы ожидали, что он это сделает? Что не так с методами, которые Google дает вам на «jtable color single row»? Это включает в себя также немало вопросов SO. – Ordous
Это то, что я на самом деле хотел спросить ... как отличить строки –
возможный дубликат [Изменение цвета ячеек без изменения цвета в других ячейках (Jtable)] (http://stackoverflow.com/questions/24555289/changing- cell-color-without-change-color-in-other-cells-jtable) – Marco13