日期:2014-05-20  浏览次数:20740 次

Java中JTable、JTableHeader显示问题
我需要将数据库的查询结果显示到JTable里面,表的首行为数据表的列名通过JTableHeader的方法来获取,现在可以实现将数据显示到table当中,但是由于数据比较多,table里面显示出来非常拥挤,我上网查了下利用JTable的setAutoResizeMode(JTable.AUTO_RESIZE_OFF)方法可以将下面的数据显示的不那么拥挤,但是对于数据项少的数据又显得很别扭,有很大一部分空白,尤其是当下面table显示的数据不那么拥挤的情况下当拖动下面的滚动条的时候表格内的数据会随着拖动向后显示,但是那个表头却不动。。这样就造成了数据对应错乱。。。
而且表格中由于有些数据项内容比较多所以显示出来也不那么全。。。
求问如何才能合理设计让这些数据显示完全的同时看起来也比较美观呢?
Java jtable jtableheader 数据库

------解决方案--------------------
如果是用了 JScrollPane,

那么 JTableHeader 默认是被放进 column header 里面的,column header 是一个 viewport,其 view 的水平滚动跟中间的 viewport 水平滚动同步,怎么会出现 “当拖动下面的滚动条的时候表格内的数据会随着拖动向后显示,但是那个表头却不动” 的情况?

你是不是没用 JScrollPane ? 还是你自己把 JTableHeader 放在了 JScrollPane 之外?
------解决方案--------------------
表头不动的情可能是你设置了就table的尺寸。setAutoResizeMode(JTable.AUTO_RESIZE_OFF)是对的,不知道你的datatable是怎么写的, 建议是不要直接对就table动手,而是直接重写defaulttablemodel而不是直接创建defaulttablemodel,然后直接将重写后的tablemodel加入到table里面就好了,另外关于数据拥挤的问题,你可以设置每一列的宽度,网上随便可以找到怎么设置。另外给你一个重写tablemodel的列子:
class ProductModel extends AbstractTableModel{
Vector<YProduct> data=new Vector<YProduct>();
String[] columns={"编号","名称","计量单位","品牌","规格","分类","条形码","进价","批发价","零售价","数量"};
public ProductModel(Vector<YProduct> data){
this.data=data;
}
@Override
public int getRowCount() {
if(this.data==null)
return 0;
return this.data.size();
}

@Override
public int getColumnCount() {
return columns.length;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
YProduct product=data.get(rowIndex);

String r="";
switch(columnIndex){
case 0:
r=product.getId();
break;
case 1:
r=product.getName();
break;
case 2:
if(product.getUnit()!=null)
r=product.getUnit();
break;
case 3:
if(product.getBrand()!=null)
r=product.getBrand();
break;
case 4:
if(product.getSpecification()!=null)
r=product.getSpecification();
break;
case 5:
if(PmsDictionary.getDesc("PMSPRODUCT", "CATEGORY", (byte)product.getCategory())!=null)
r=PmsDictionary.getDesc("PMSPRODUCT", "CATEGORY", (byte)product.getCategory());
break;
case 6:
if(product.getShapeCode()!=null)
r=product.getShapeCode();
break;
case 7:
if(product.getBidPrice()!=0)
r=product.getBidPrice()+"";
break;
case 8:
if(product.getTradePrice()!=0)
r=product.getTradePrice()+"";
break;
case 9:
if(product.getRetailPrice()!=0)
r=product.getRetailPrice()+"";
break;
case 10:
if(product.getCount()!=0)
r=product.getCount()+"";
break;
}
return r;
}
@Override
public String getColumnName(int column) {
return columns[column];
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
    }
}

------解决方案--------------------