Topic: CrossTable的问题

  Print this page

1.CrossTable的问题 Copy to clipboard
Posted by: rego
Posted on: 2002-12-25 21:16

Swing中的JTable无法实现交叉表的功能,我目前的做法是使用JClass的JCTable,使用3个TableModel分别控制行头、列头和交叉表,不知有无更好的解决办法?

2.CrossTable的问题 [Re: rego] Copy to clipboard
Posted by: 烂泥
Posted on: 2002-12-25 21:45

交叉表 是什么意思?呵呵

3.Re:CrossTable的问题 [Re: rego] Copy to clipboard
Posted by: rego
Posted on: 2002-12-26 21:19

就像是Excel里的Pivot Table。
给出我写的代码,希望能抛砖引玉。
package com.mydomain.table;

import javax.swing.table.*;
import javax.swing.ListModel;
import javax.swing.event.TableModelEvent;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright Coffee 2002</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/

public class CrossTableModel extends AbstractTableModel {

CrossTableModelUtility ctmu;
IInnerTableProvider itp;
IRowHeaderProvider rhp;
IColumnHeaderProvider chp;

public CrossTableModel(CrossTableModelUtility ctmu) {
this.ctmu =ctmu;
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
public int getColumnCount() {
return chp.getColumnHeaderModel().getColumnCount()+2 ;
}
public Object getValueAt(int row, int column) {
switch (column) {
case 0: {
if (row==0)
return null;
return ctmu.lookupRowHeader(row-1);
}

case 1: {
if (row==0)
return null;
return ctmu.getRowHeaderModel().getValueAt(row-1,1);
}

default:
if (row==0)
return ctmu.getColumnHeaderModel().getValueAt(0,column-2);
return ctmu.getInnerTableModel().getValueAt(row-1, column-2);
}
}
public int getRowCount() {
return rhp.getRowHeaderModel().getColumnCount()+1 ;
}
private void jbInit() throws Exception {
}
public String getColumnName(int column) {
switch (column) {
case 0: case 1:
return null;

default:
return ctmu.lookupColumnHeader(column-2);
}
}
public Class getColumnClass(int columnIndex) {
return CompositeModel.class;
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
if (rowIndex!=0)
return false;

default:
return true;
}
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
/**@todo: Override this javax.swing.table.AbstractTableModel method*/
super.setValueAt( aValue, rowIndex, columnIndex);
}
}

package com.mydomain.table;

import javax.swing.table.*;

/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright Coffee 2002</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/

public interface CrossTableModelUtility {
public AbstractTableModel getInnerTableModel();
public AbstractTableModel getColumnHeaderModel();
public AbstractTableModel getRowHeaderModel();
public TableCellRenderer getCompositeRenderer();
public TableCellEditor getCompositeEditor();
public void addArchModelListener(ArchModelListener l);
public int getRowHeaderCount();
public int getColumnHeaderCount();
public Object lookupRowHeader(int row);
public String lookupColumnHeader(int column);
public Object lookupCellValue(int row, int column);
public CompositeModel lookupColumnArchCellValue(int column);
public CompositeModel lookupRowArchCellValue(int row);
}

4.你的代码没有注解! [Re: rego] Copy to clipboard
Posted by: 烂泥
Posted on: 2002-12-27 00:32

没有明白,还是直接把功能写出来!
难道是要完成EXcel的数据透视???

5.Re:CrossTable的问题 [Re: rego] Copy to clipboard
Posted by: rego
Posted on: 2002-12-27 20:55

例如一个班级有50个学生,每个学生参加10门以上的考试。
所谓的交叉表就是以学生名字为行,课程为列,在对应的格子里填入该学生这门课程的成绩。

听上去很简单,可是在Swing中实现并非易事,似乎必须突破Swing的范围。

6.Re:CrossTable的问题 [Re:rego] [Re: rego] Copy to clipboard
Posted by: 烂泥
Posted on: 2002-12-28 16:58

行头由“考试”的课程数据构造不是行吗?
把"学生"的名字集放在第 0 列不就行了

7.没有碰到实际问题是很难理解的 [Re: rego] Copy to clipboard
Posted by: jeasonzhao
Posted on: 2002-12-28 17:30

呵呵,我说的是废话

8.Re:CrossTable的问题 [Re: rego] Copy to clipboard
Posted by: supermy
Posted on: 2002-12-31 09:54

你用的是什么数据库,ORACLE,SQL SERVER,MY SQL 等一般大型数据库都自带这些功能。

9.Re:CrossTable的问题 [Re: rego] Copy to clipboard
Posted by: Biubiu
Posted on: 2003-01-01 12:57

rego wrote:
例如一个班级有50个学生,每个学生参加10门以上的考试。
所谓的交叉表就是以学生名字为行,课程为列,在对应的格子里填入该学生这门课程的成绩。

听上去很简单,可是在Swing中实现并非易事,似乎必须突破Swing的范围。


就你所说的这些,一个简单的JTable就可以搞定。把学生的名字设置成不可编辑就可以了。为什么非用交叉表呢?


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923