If a cell value is same, changing a cell background in JTable

后端 未结 1 853
别那么骄傲
别那么骄傲 2021-01-17 07:17

I have a question for JTable.

When I select a cell and then there are same value cell in JTable which I chose, that cells highlight background red color.

I d

相关标签:
1条回答
  • 2021-01-17 07:45

    You can implement ListSelectionListener to track selection changes in a table. Then implement TableCellRenderer that would change background of a cell with the same value of a selected object. Check out How to Use Tables for more details on JTable, renderers and selection.

    Here is a very simple example that demonstrates this idea:

    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();
                }
            });
        }
    }
    

    Here is a result:

    enter image description here

    EDIT: solution using renderer only, without table model

    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();
                }
            });
        }
    }
    
    0 讨论(0)
提交回复
热议问题