IWontQuit 2014-12-15 11:45
浏览 1116

关于JTable渲染器Renderer的问题,求高手解答!!!!

 public class MyButtonRender implements TableCellRenderer
    {
        private JPanel panel;
        private JButton add,reduce;
        private JTextField numbertf;
        public MyButtonRender()
        {
            this.initAdd();
            this.initReduce();
            this.initNumbertf();
            this.initPanel();
            // 添加按钮
            this.panel.add(this.add);
            this.panel.add(this.numbertf);
            this.panel.add(this.reduce);
        }
        private void initAdd()
        {
            this.add = new JButton("+");
            // 设置按钮的大小及位置。
            this.add.setBounds(0, 0, 41, 20);
        } 
        private void initReduce(){
            this.reduce = new JButton("-");
            // 设置按钮的大小及位置。
            this.reduce.setBounds(82, 0, 41, 20);
        }     
        private void initNumbertf(){
            this.numbertf=new JTextField();
            this.numbertf.setBounds(42,0,30,20);
        }
        private void initPanel()
        {
            this.panel = new JPanel();
            // panel使用绝对定位,这样button就不会充满整个单元格。
            this.panel.setLayout(null);
        }
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
                int column)
        {
            return this.panel;
        }
    }

这是我渲染器的代码,就是在一个单元格内添加两个按钮和一个文本框

 public  class AllTableModel extends AbstractTableModel{
    private static final long serialVersionUID = 1L;
    protected Vector content=null;
    private String[] title_name = { "编号", "名称", "型号","数量"};
    public void addRow(String ID, String name,String model,JPanel number) {
        Vector v = new Vector(title_name.length);
        v.add(0,ID);
        v.add(1,name);
        v.add(2, model);
        v.add(3,number);
        content.add(v);
   }         
    //需要子类自行提供addRow方法    
     public AllTableModel(){
           content = new Vector();
     }   
     public AllTableModel(int count){
           content = new Vector(count);
     }       
     public void removeRow(int row) {
           content.remove(row);
     }       
     public void removeRows(int row, int count) {
             for (int i = 0; i < count; i++) {
                 if (content.size() > row) {
                     content.remove(row);
                 }
             }
     }   
     public int getColumnCount() {
         String[] inherit=getTitlename();
         return inherit.length;
     } 
     public int getRowCount() {
         return content.size();
     }   
     public Object getValueAt(int row, int col) {
         return  ((Vector) content.get(row)).get(col);
     }   
     public String getColumnName(int col) {
         String[] inherit=getTitlename();
         return inherit[col];
     } 
     public void setValueAt(Object value, int row, int col) {
             ((Vector) content.get(row)).remove(col);
             ((Vector) content.get(row)).add(col, value);
             this.fireTableCellUpdated(row, col);
     }   
     public boolean isCellEditable(int rowIndex, int columnIndex) {
        if (columnIndex == 0) {
            return false;
        }
        return true;
    }
    //需要在子类中定义自己的getTitlename方法
    public String[] getTitlename(){
         return title_name;
    }
}

这是我的TableModel的代码

我想问为什么我用DefaultTableModel,然后用两个数组初始化,就可以显示出来渲染器的效果,但是要是用自己写的TableModel,然后调用addRow方法添加,表格中就什么也不显示,这是为什么?

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 R语言Rstudio突然无法启动
    • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
    • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
    • ¥15 用windows做服务的同志有吗
    • ¥60 求一个简单的网页(标签-安全|关键词-上传)
    • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
    • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
    • ¥100 为什么这个恒流源电路不能恒流?
    • ¥15 有偿求跨组件数据流路径图
    • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值