JTable的数据是程序启动的时候从SQL数据库中加载



JTable的数据是程序启动的时候从SQL数据库中加载的。所以行数不能固定。但列数是固定的。
1、JTable如何直接读取选中一行中每个单元格的数据?
2、用鼠标按住列名那里 可以移动更改列的位置。如何禁止这样的功能?
3、如何禁止双击单元格更改单元格内容这种功能?
4、我对数据库中的数据在一个FRAME里进行 增加,删除,修改等功能后。如何在JTable上直接反馈出来?是重新从SQL中加载数据显示JTable?还是有什么其他方法能实现?

=======================================================================

在jTable 的MouseClick中写:
int row = jTable1.getSelectRow();
int col= jTable1.getSelectRow();
String str = (String)jTable1.valueAt(row,col).toString();
这样就可以取得table中的每个单元格的内容了.

限制列名移动,好像是不行的哦

=======================================================================
testtable.getTableHeader().setReorderingAllowed(false);
=======================================================================
我现在也在做一个类似的软件!
我是先实现了一个抽象的 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 集合当中读取数据了!

==========================================================================================
可以先用表格模式里面设置大点的行数,然后用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);
}