如果单元格值相同,则更改JTable中的单元格背景

我有一个JTable的问题。

当我选择一个单元格然后在我选择的JTable中有相同的值单元格时,该单元格突出显示背景红色。

我不知道该怎么办….

PS:对不起,我不知道如何在这里输入代码…… ;;

您可以实现ListSelectionListener来跟踪表中的选择更改。 然后实现TableCellRenderer ,它将更改具有所选对象的相同值的单元格的背景。 有关JTable ,渲染器和选择的更多详细信息,请查看如何使用表 。

这是一个非常简单的例子,它展示了这个想法:

 import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import java.awt.Color; import java.awt.Component; public class TableDemo { private static void createAndShowGUI() { JFrame frame = new JFrame("TableDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel contentPanel = new JPanel(); String[] columnNames = { "Column1", "Column2" }; Object[][] data = { { "1", "3" }, { "2", "5" }, { "7", "1" }, { "5", "3" } }; JTable table = new JTable(); MyModel model = new MyModel(Color.RED, table.getBackground()); model.setDataVector(data, columnNames); table.setModel(model); table.setColumnSelectionAllowed(true); table.setDefaultRenderer(Object.class, new TestCellRenderer()); SelectionListener listener = new SelectionListener(table); table.getSelectionModel().addListSelectionListener(listener); table.getColumnModel().getSelectionModel() .addListSelectionListener(listener); JScrollPane scrollPane = new JScrollPane(table); contentPanel.add(scrollPane); contentPanel.setOpaque(true); frame.add(contentPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } static class TestCellRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); MyModel model = (MyModel) table.getModel(); c.setBackground(model.getCellColor(row, column)); return c; } } static class MyModel extends DefaultTableModel { private Object selectedObject; private Color selectedColor; private Color normalColor; public MyModel(Color selectedColor, Color normalColor) { this.selectedColor = selectedColor; this.normalColor = normalColor; } public Color getCellColor(int row, int column) { if (getValueAt(row, column).equals(selectedObject)) return selectedColor; return normalColor; } public void setSelectedObject(Object selectedObject) { this.selectedObject = selectedObject; fireTableRowsUpdated(0, getRowCount()); } } static class SelectionListener implements ListSelectionListener { private JTable table; SelectionListener(JTable table) { this.table = table; } public void valueChanged(ListSelectionEvent e) { int rowIndex = table.getSelectedRow(); int colIndex = table.getSelectedColumn(); if (!e.getValueIsAdjusting() && colIndex != -1 && rowIndex != -1) { ((MyModel) table.getModel()).setSelectedObject(table .getValueAt(rowIndex, colIndex)); } } } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } } 

结果如下:

在此处输入图像描述

编辑:仅使用渲染器的解决方案,没有表模型

 import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import java.awt.Color; import java.awt.Component; public class TableDemo { private static void createAndShowGUI() { JFrame frame = new JFrame("TableDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel contentPanel = new JPanel(); String[] columnNames = { "Column1", "Column2" }; Object[][] data = { { "1", "3" }, { "2", "5" }, { "7", "1" }, { "5", "3" } }; JTable table = new JTable(new DefaultTableModel(data, columnNames)); table.setColumnSelectionAllowed(true); TestCellRenderer renderer = new TestCellRenderer(); table.setDefaultRenderer(Object.class, renderer); SelectionListener listener = new SelectionListener(table); table.getSelectionModel().addListSelectionListener(listener); table.getColumnModel().getSelectionModel() .addListSelectionListener(listener); JScrollPane scrollPane = new JScrollPane(table); contentPanel.add(scrollPane); contentPanel.setOpaque(true); frame.add(contentPanel); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } static class TestCellRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); int columnIndex = table.getSelectedColumn(); int rowIndex = table.getSelectedRow(); if (columnIndex != -1 && rowIndex != -1){ Object selectedValue = table.getValueAt(rowIndex, columnIndex); if (value.equals(selectedValue)) { c.setBackground(Color.RED); } else { c.setBackground(table.getBackground()); } } return c; } } static class SelectionListener implements ListSelectionListener { private JTable table; SelectionListener(JTable table) { this.table = table; } public void valueChanged(ListSelectionEvent e) { int rowIndex = table.getSelectedRow(); int colIndex = table.getSelectedColumn(); if (!e.getValueIsAdjusting() && colIndex != -1 && rowIndex != -1){ table.repaint(); } } } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } }