做一个程序需要用到JTable。但遇到点问题。请教下大家。JTable的数据是程序启动的时候从SQL数据库中加载的。所以行数不能固定。但列数是固定的。
1、JTable如何直接读取选中一行中每个单元格的数据?
2、用鼠标按住列名那里 可以移动更改列的位置。如何禁止这样的功能?
3、如何禁止双击单元格更改单元格内容这种功能?
4、我对数据库中的数据在一个FRAME里进行 增加,删除,修改等功能后。如何在JTable上直接反馈出来?是重新从SQL中加载数据显示JTable?还是有什么其他方法能实现?
问题比较多也比较急麻烦大家帮忙看看了  小弟初学JAVA。谢谢了

解决方案 »

  1.   

      在jTable 的MouseClick中写:
      int row = jTable1.getSelectRow();
      int coljTable1.getSelectRow();
      String str = (String)jTable1.valueAt(row,col).toString();
      这样就可以取得table中的每个单元格的内容了.  限制列名移动,好像是不行的哦
      

  2.   

    testtable.getTableHeader().setReorderingAllowed(false);
      

  3.   

    1、JTable如何直接读取选中一行中每个单元格的数据? 
             for (int i = 0; i < table.getColumnCount(); i++) {
                table.getValueAt(table.getSelectedRow(), i);
            }
    2、用鼠标按住列名那里 可以移动更改列的位置。如何禁止这样的功能? 
             table.getTableHeader().setReorderingAllowed(false);
    3、如何禁止双击单元格更改单元格内容这种功能? 
             如果单纯的就想屏蔽鼠标的双击,那么覆盖JTable的方法:
                  protected void processMouseEvent(MouseEvent e) {
                    if (e.getClickCount() == 2) {
                        return;
                    }
                    super.processMouseEvent(e);
                }4、我对数据库中的数据在一个FRAME里进行 增加,删除,修改等功能后。如何在JTable上直接反馈出来?是重新从SQL中加载数据显示JTable?还是有什么其他方法能实现? 
                  直接修改Model的值就可以了吧,保存的时候再走数据库
      

  4.   

    我现在也在做一个类似的软件!
    我是先实现了一个抽象的 AbstractTableModel  类 TBmodel 然后连接数据库,将数据库的查询出来的结果放入到ArrayList当中!
    实现 AbstractTableModel 这个类当中的三个必须实现方法,
              //获得列数,此处的titles,我已经初始化了!
             public int getColumnCount() {
    return titles.size();
    }
            //获得行的行数,此处的data,就是上面提到的ArrayList data 也就是查询出来的结果集
    public int getRowCount() {
    return data.size();
    }
           //此方法就是获得每个单元格的数据
    public Object getValueAt(int rowIndex, int columnIndex) {
    String str[]=(String[])data.get(rowIndex);
    return str[columnIndex];

    }实例化 AbstractTableModel 类 如: TBmodel tb = new TBmodel(); 
    然后你再实例化一个JTable 如: JTable jt = new JTable(tb);
    这样表 jt 就会自动从data 集合当中读取数据了!
      

  5.   

    可以先用表格模式里面设置大点的行数,然后用jTableModel.fireTableDataChanged(); 具体代码如下面个日历表格,我加了部分解释希望对楼主有帮助:
    //设置表格模式为7行7列
            dModel = new AbstractTableModel() { 
                    public int getRowCount() { 
                        return 7; 
                    }
     
                    public int getColumnCount() { 
                        return 7; 
                    }
                    //获取表中单元格的值,为系统当前时间
                    public Object getValueAt(int row, int column) { 
                        if (row == 0) { 
                            //获取表格的标题
                            return getHeader(column); 
                        } 
                        row--; 
                        Calendar now = (Calendar) MyCalendar.this.now.clone();
                        //设置当前日期为一个月第一天
                        now.set(Calendar.DAY_OF_MONTH, 1);
                        //获得这个月的最大天数
                        int dayCount = now.getActualMaximum(Calendar.DAY_OF_MONTH); 
                        //获得当前周的第几天
                        int moreDayCount = now.get(Calendar.DAY_OF_WEEK) - 1; 
                        int index = row * 7 + column; 
                        //计算出当前日期
                        int dayIndex = index - moreDayCount + 1;
                        if (index < moreDayCount || dayIndex > dayCount) { 
                            return null; 
                        } else { 
                            return new Integer(dayIndex); 
                        } 
                    } 
                };
            //建立制定数据的表格    
            dTable = new CalendarTable(dModel, now); 
            dTable.setCellSelectionEnabled(true);//让用户能够同时选择单个单元格或者整个行,同时选择列
            dTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//SINGLE_SELECTION允许一次选择一行
            //设置表格注册接口TableCellRenderer
            dTable.setDefaultRenderer(dTable.getColumnClass(0), new TableCellRenderer() { 
                //当表格处于表现状态时调用 getTableCellRendererComponent   
                public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
                                                                   boolean hasFocus, int row, int column) { 
                        String text = (value == null) ? "" : value.toString(); 
                        JLabel color = new JLabel(text); 
                        color.setOpaque(true); //使得标签不透明
                        //设置标签颜色
                        if (row == 0) { 
                            color.setForeground(hForeground); 
                            color.setBackground(hBackground); 
                        } else { 
                            if (isSelected) { 
                                color.setForeground(sForeground); 
                                color.setBackground(sBackground); 
                            } else { 
                                color.setForeground(foreground); 
                                color.setBackground(background); 
                            } 
                        }
     
                        return color; 
                    } 
                });
            updateView();               
            //隐藏表格线
            dTable.setShowHorizontalLines(false);
            dTable.setShowVerticalLines(false);          
            add(dTable, BorderLayout.CENTER); 
            add(Box.createRigidArea(new Dimension(0,20)));
        }
     //设置表格标题显示
        public static String getHeader(int index) { 
            switch (index) { 
            case 0: 
                return SUN; 
            case 1: 
                return MON; 
            case 2: 
                return TUE; 
            case 3: 
                return WED; 
            case 4: 
                return THU; 
            case 5: 
                return FRI; 
            case 6: 
                return SAT; 
            default: 
                return null; 
            } 
        }
           public static class CalendarTable extends JTable {        private Calendar now;        public CalendarTable(TableModel model, Calendar now) {
                super(model);
                this.now = now;
            }        public void changeSelection(int row, int column, boolean toggle, boolean extend) {
                super.changeSelection(row, column, toggle, extend);
                if (row == 0) {
                    return;
                }
                //获得表格被点击的日期
                Object obj = getValueAt(row, column);
                if (obj != null) {
                    now.set(Calendar.DAY_OF_MONTH, ((Integer)obj).intValue());
                }
            }    }       
        //更新表格,使得表格处于选择状态
        public void updateView() { 
            dModel.fireTableDataChanged();
            dTable.setRowSelectionInterval(now.get(Calendar.WEEK_OF_MONTH),
                                              now.get(Calendar.WEEK_OF_MONTH));
            dTable.setColumnSelectionInterval(now.get(Calendar.DAY_OF_WEEK) - 1,
                                                 now.get(Calendar.DAY_OF_WEEK) - 1);
        }
      
      

  6.   

    1、读取每行单元格内的内容,是getvalueAt(int row,int column);
    2、设置列名是否可以移动是 table.getTableHeader().setReorderingAllowed(true or false);
    3、覆盖iscelleditor(int row,int col)这个方法就可以了
    4、个人感觉要重新加载下
      

  7.   


    在return处写自己的处理阿,我写return是因为不知道你想实现什么功能