代码之家  ›  专栏  ›  技术社区  ›  user3607625

如何在选中一列中的复选框后动态更改JTable中的行背景颜色?

  •  0
  • user3607625  · 技术社区  · 10 年前

    我试图在JTable中展示一些数据。我已经创建了Jtable,除了更改某些特定行的背景色之外,所有内容都很清晰,用户在最后一列上勾选复选框。它必须动态工作。你能给我一些提示、代码等吗?

    1 回复  |  直到 10 年前
        1
  •  2
  •   runholen    10 年前

    像这样吗?

    import java.awt.BorderLayout;
    import java.util.Vector;
    import javax.swing.*;
    import java.awt.*;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.*;
    
    public class JTableTest extends JFrame implements TableModel{
    
        Vector<Object[]> lines = new Vector<Object[]>();
        private String[] headers = {"String","Boolean"};
    
        public JTableTest(){
            for (int t = 0; t < 100; t++) lines.addElement(new Object[]{"Row "+t,Boolean.FALSE});
            JPanel p = (JPanel)getContentPane();
            p.setLayout(new BorderLayout());
            JTable table = new JTable();
            table.setDefaultRenderer(String.class, new MyRenderer());
            p.add(new JScrollPane(table));
            table.setModel(this);
            p.setPreferredSize(new Dimension(400,200));
            pack();
            setVisible(true);
        }
        public static void main(String[] args){
            new JTableTest();
        }
        @Override
        public int getRowCount() {
            return lines.size()+1;
        }
        @Override
        public int getColumnCount() {
            return headers.length;
        }
        @Override
        public String getColumnName(int columnIndex) {
            return headers[columnIndex];
        }
        @Override
        public Class<?> getColumnClass(int col) {
            if (col == 1) return Boolean.class;
            return String.class;
        }
        @Override
        public boolean isCellEditable(int row, int col) {
            return col==1;
        }
        @Override
        public Object getValueAt(int row, int col) {
            return lines.elementAt(row)[col];
        }
        @Override
        public void setValueAt(Object aValue, int row, int col) {
            lines.elementAt(row)[col] = aValue;
        }
        @Override
        public void addTableModelListener(TableModelListener l) {
        }
        @Override
        public void removeTableModelListener(TableModelListener l) {
        }
        private class MyRenderer extends DefaultTableCellRenderer{
            @Override
            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);
                if (lines.elementAt(row)[1] == Boolean.TRUE) c.setBackground(Color.orange);
                else c.setBackground(table.getBackground());
                table.repaint();
                return c;
            }
        }
    }