问题描述:怎样实现鼠标单击jTable单元格,然后所选中的单元格背景色发生改变?(我在网上搜了一些都是一单击整行都变色了的)
请给出测试通过后的具体代码及调用过程

解决方案 »

  1.   

    protected  int editingColumn 
              标识正在编辑的单元格的列。 
    protected  int editingRow 
              标识正在编辑的单元格的行。 
    protected  Color gridColor 
              网格的颜色。 
      

  2.   

    很多年前做过,大概是这样的
    1. 定义一个类,实现TableCellRenderer接口。你可以从DefaultTableCellRender继承,
    class MyTableCellRender extends DefaultTableCellRenderer
    getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    {
          Component c = new Label();
          c.setBackGroundColor( ... );
          return c;
    }2. table->getColumnModel()->getColumn()->setTableRender(new MyTableCellRender());如果所有的列都要能改变颜色,要遍历所有的列,都设置你自己的render。这时可以只生成一个render对象,大家都用这一个对象,而不用每次new一个新对象
      

  3.   


    public class TbCellRender extends DefaultTableCellRenderer {    public TbCellRender() {
        }    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int col) {        Component comp = super.getTableCellRendererComponent(table, value,
                    isSelected, hasFocus, row, col);
            if(isSelected)
              comp.setBackground(Color.red);
            return comp;
        }
    }
    调用方法:jTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    TableColumn column = jTable.getColumnModel().getColumn(col);
    column.setCellRenderer(new TbCellRender());
      

  4.   

    看Java tutorial的例子, 讲得非常好.
      

  5.   

    哎,都测试过啦,还是不行.我想实现的效果是鼠标单击jTabel中任一单元格,然后你所单击过的单元格就变色
      

  6.   

    重写TableCellRenderer,想怎么显示就怎么显示,一切都在自己掌握中。
      

  7.   

    TableCellRenderer 非常怪异 比如以下实验代码
    public class MultiLineCellRenderer implements TableCellRenderer 
    {
        JTextArea text=new JTextArea();
        JScrollPane p=new JScrollPane(text);
        public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column) 
        {
            text.setLineWrap(true);
            text.setWrapStyleWord(true);
            if (hasFocus) 
            {
                p.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(122, 138, 153), 2));     
                text.setText(value.toString());
            }
            else 
            {
            }
            return p;
        }
    }p.setBorder只对选中单元格有效,但是text.setText对选中单元格和该单元格以下所有单元格都有效(选中单元格以上单元格保持空白)。并且不管该单元格以下所有单元格实际内容是什么,全部被显示为选中单元格内容。
      

  8.   

    其实只要加一行代码就可以的
    table.setCellSelectionEnabled(true);package qq;import java.awt.BorderLayout;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;public class Test { private JTable table;
    private JFrame frame; /**
     * Launch the application
     * @param args
     */
    public static void main(String args[]) {
    try {
    Test window = new Test();
    window.frame.setVisible(true);
    } catch (Exception e) {
    e.printStackTrace();
    }
    } /**
     * Create the application
     */
    public Test() {
    initialize();
    } /**
     * Initialize the contents of the frame
     */
    private void initialize() {
    frame = new JFrame();
    frame.getContentPane().setLayout(new BorderLayout());
    frame.setBounds(100, 100, 500, 375);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final JScrollPane scrollPane = new JScrollPane();
    frame.getContentPane().add(scrollPane, BorderLayout.CENTER); table = new JTable(50,5);
    table.setSelectionBackground(Color.red);
    table.setCellSelectionEnabled(true);
    scrollPane.setViewportView(table);
    }}
      

  9.   

    public Object getValueAt( int rowIdx, int columnIdx ) {
    return getModel().getValueAt( rowIdx, columnIdx );
    }
    用这个方法获得要选的单元格,然后修改颜色。
      

  10.   

    我以前写的程序是,当单元格内成绩小于60,显示红色。用jTextArea当renderer,然后设置小于60的单元格成红色。所以楼主可以在用户单击后,给单元格修改内容,作标记,然后有标记的单元格上色。
      

  11.   


    public class ColorTableCellRenderer extends DefaultTableCellRenderer {    /** Creates a new instance of FEColorTableCellRenderer */
        public FEColorTableCellRenderer() {
            super();
        }
      
        @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 % 2 == 0) {
                this.setBackground(Color.white);
            } else {
                this.setBackground(new Color(206,231,255));
            }
            if (row == table.getSelectedRow())
            {
                this.setBackground(new Color(244, 244, 128));
            }  
         
            return this;
        }
    我自己程序里用的!但是不知道你可以用不!红字的地方是设置选中行的颜色,我这边是黄色。
    你在你的Jtable.setDefaultRenderer(JTable.getColumnClass(0), new ColorTableCellRenderer());我这边这样用的!你试验下
      

  12.   

    不好意思上面的红字没有显示if (row == table.getSelectedRow())
            {
                this.setBackground(new Color(244, 244, 128));
            } 
    这段是设置选中行颜色 你看看是否可以用 
      

  13.   

    汗,我要实现的是每次单击过的单元格都变色,而不是所单击单元格所在的行变色.
    而且根据你所说的我改成这样还是不能达到想要的效果.
     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 == table.getSelectedRow()&&column==table.getSelectedColumn())
            {
                this.setBackground(Color.red);
            }     
            return this;
       }
      

  14.   

      public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value,
                    isSelected, hasFocus, row, column);
            if(isSelected)
              table.setValueAt("0",row,column);
            return this;
    }
    这个TableCellRenderer真的好奇怪,这样就可以实现所单击过的单元格呈现0,但就是实现不了所单击过的单元格变色
      

  15.   

    public class TestRenderer extends DefaultTableCellRenderer {
        public TestRenderer() {
            super();
        }
        public Component getTableCellRendererComponent(JTable table, Object value,
                                                       boolean isSelected, boolean hasFocus,
                                                       int row, int column) {
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            if(isSelected) {
                setBackground(Color.red);
            }
            return this;
        }
    }其实,关键是调用的地方:
    JTable tbl = new JTable(sorter);
    TestRenderer testRenderer = new TestRenderer();
    tbl.setDefaultRenderer(Object.class, testRenderer);
    //如果你的cell的type是Integer,就需要下面这句
    tbl.setDefaultRenderer(Integer.class, testRenderer);
      

  16.   

    都给到这一步了,做人要厚道啊
    不要说你用不了是因为sorter编译不过去JTable tbl = new JTable(sorter);
      

  17.   

    编译过啦,就是运行达不到要的效果啊.难道你敢说给的代码在你那边运行过且实现我要的效果!?如果是,你的开发环境是?我这边是Netbeans5.5.1,jdk是1.5的