【问题标题】:If a cell value is same, changing a cell background in JTable如果单元格值相同,则更改 JTable 中的单元格背景
【发布时间】:2023-12-17 15:32:01
【问题描述】:

我有一个关于 JTable 的问题。

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

我不知道该怎么办......

P.S:对不起,我不知道这里的代码怎么输入……;;

【问题讨论】:

    标签: java swing jtable tablecellrenderer listselectionlistener


    【解决方案1】:

    您可以实现ListSelectionListener 来跟踪表格中的选择更改。然后实现TableCellRenderer,这将改变单元格的背景与所选对象的相同值。查看How to Use Tables 以获取有关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();
                }
            });
        }
    }
    

    【讨论】:

    • +1 好主意,但我认为它should be done into Renderer and without Model
    • @mKorbel 是的!看起来更干净。我也包括在内。
    • 在这里你的胡同......,我的尊重(并且接受默认情况下不能支持伟大的代码)
    最近更新 更多