带有行标题的JTable


/**
* @author chega
* this class extends JTable and has two sub JTable class in it ,they are:RowHeadTable and LeftTopCornor,they are also JTable,
* RowHeadTable is the rowHeadView of JScrollPane ,and LeftTopCornor is the upper-top cornor of JScrollPane, you can use
* TableWithRowHead like this:<br/>
* <b>
*
* JScrollPane pane = new JScrollPane(table);<br/><br/>
* pane.setRowHeaderView(table.getRowHeadTable());<br/><br/>
* pane.setCorner(JScrollPane.UPPER_LEFT_CORNER, table.getLeftTopCornor());<br/><br/>
* </b>
* If you select a row in RowHeadTable ,then the row at the same row index of TableWithRowHead will also be selectd,so vice-verse
* if you select the only row in LeftTopCornor , the all rows in TableWithRowHead and RowHeadTable will be selected.
* <br/>
* for some reason , the LeftTopTable and RowHeadTable set selectionBackground to white, you can also set it to other new value, but
* some details should be considered.
* <br/>
* <br/>
* <b>Attention:</b>
* some method should not be invoked:table.setRowHeight() and table.getTableHeader().setHeight(),
* alternative methods are supplied:setTableRowHeight() setTableHeadRowHeight().
*/
public class TableWithRowHead extends JTable{
private static final long serialVersionUID = 1L;
private RowHeadTable rowHead = null;
private TableWithRowHead table = null;
private LeftTopCornor leftTopCornor;

public static void main(String...args){
JFrame frame = new JFrame();
final TableWithRowHead table = new TableWithRowHead(new DefaultTableModel(5,5));
table.setAutoCreateRowSorter(true);
table.hideColumn(0);
JScrollPane pane = new JScrollPane(table);
pane.setRowHeaderView(table.getRowHeadTable());
pane.setCorner(JScrollPane.UPPER_LEFT_CORNER, table.getLeftTopCornor());
frame.add(pane,BorderLayout.CENTER);
JButton jb = new JButton("print selected rows");
jb.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
print(table.getSelectedRows());
print(table.getRealRows());
}

private void print(int[] selectedRows) {
System.out.println("===================");
for(int i=0;i<selectedRows.length;i++){
System.out.println(selectedRows[i]+"\t");
}
}
});
frame.add(jb,BorderLayout.SOUTH);
frame.setSize(500,400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public TableWithRowHead(Vector data, Vector columns){
super(data,columns);
this.init();
}

public TableWithRowHead(int row,int col){
super(row,col);
this.init();
}

public TableWithRowHead(DefaultTableModel model){
super(model);
this.init();
}

/**
* this method must be invoked in constructor
*/
private void init(){
this.table = this;
this.rowHead = new RowHeadTable();
this.leftTopCornor = new LeftTopCornor();
TableSelectionListener selectionListener = new TableSelectionListener();
this.table.getSelectionModel().addListSelectionListener(selectionListener);
TableMouseListener l = new TableMouseListener();
this.rowHead.addMouseListener(l);
this.leftTopCornor.addMouseListener(l);
}

public JTable getRowHeadTable(){
return this.rowHead;
}
public JTable getLeftTopCornor(){
return this.leftTopCornor;
}

/**
* make the row in RowHeadTable selected
* @param row
*/
public void setSelected(int row){
this.rowHead.setValueAt(Boolean.TRUE, row, 0);
// this.rowHead.addRowSelectionInterval(row, row);
}
/**
* 设置行选中(this method is for TableWithRowHead)
* @param rows
*/
public void setSelected(int[] rows){
this.rowHead.clearSelected();
this.rowHead.clearSelection();
for(int i=0;i<rows.length;i++){
this.setSelected(rows[i]);
}
//如果选中全部了,则leftTopCornor也选中,否则不选中
if(rows.length==table.getRowCount()){
this.leftTopCornor.setValueAt(Boolean.TRUE, 0, 0);
this.leftTopCornor.selectAll();
}else{
this.leftTopCornor.setValueAt(Boolean.FALSE, 0, 0);
this.leftTopCornor.clearSelection();
}
}
/**
* 返回选中的行(this method is for TableWithRowHead)
*/
public int[] getRealRows(){
int[] selectedRows = this.getSelectedRows();
int[] realRows = new int[selectedRows.length];
for(int i=0;i<realRows.length;i++){
realRows[i] = this.convertRowIndexToModel(selectedRows[i]);
}
return realRows;
}

/**
* 隐藏某列
* @param col
*/
public void hideColumn(int col){
JTableHeader tableHeader = this.getTableHeader();
tableHeader.getColumnModel().getColumn(col).setPreferredWidth(0);
tableHeader.getColumnModel().getColumn(col).setMaxWidth(0);
tableHeader.getColumnModel().getColumn(col).setMinWidth(0);
table.getColumnModel().getColumn(col).setPreferredWidth(0);
table.getColumnModel().getColumn(col).setMaxWidth(0);
table.getColumnModel().getColumn(col).setMinWidth(0);
}
/**
* set row height to a new value <b>height</b>
* @author chega
*
*/
public void setTableRowHeight(int height){
this.table.setRowHeight(height);
this.rowHead.setRowHeight(height);
}
/**
*
* @param row
* @param height
*/
public void setTableRowHeight(int row,int height){
this.table.setRowHeight(row,height);
this.rowHead.setRowHeight(row, height);
}
/**
* set the table header height
*/
public void setTableHeadHeight(int height){
this.table.getTableHeader().setPreferredSize(new Dimension(0,height));
this.leftTopCornor.setRowHeight(height);
}

//==============innner class========================
private class RowHeadTable extends JTable{
public RowHeadTable(){
super();
this.setAlignmentX(SwingConstants.CENTER);
this.setSelectionBackground(Color.white);
DefaultTableModel model = new RowHeadTableModel(table.getRowCount(),1);
this.setModel(model);
this.getColumnModel().getColumn(0).setPreferredWidth(16);
this.setPreferredScrollableViewportSize(new Dimension(16,0));
}

private void clearSelected(){
for(int i=0;i<this.getRowCount();i++){
this.setValueAt(Boolean.FALSE, i, 0);
}
}
}


private class LeftTopCornor extends JTable{
public LeftTopCornor(){
super();
this.setToolTipText("全选");
this.setAlignmentX(SwingConstants.CENTER);
this.setSelectionBackground(Color.white);
DefaultTableModel model = new RowHeadTableModel(1,1);
this.setModel(model);
this.setRowHeight(table.getTableHeader().getPreferredSize().height);
}
}


private class RowHeadTableModel extends DefaultTableModel{
public RowHeadTableModel(int row,int col){
super(row,col);
}
@Override
public boolean isCellEditable(int row,int col){
return true;
}
@Override
public Class<?> getColumnClass(int col){
return Boolean.class;
}
}

class TableSelectionListener implements ListSelectionListener{

@Override
public void valueChanged(ListSelectionEvent e) {
if(e.getValueIsAdjusting()){
return ;
}
// int[] selectedRows = table.getRealRows();
int[] selectedRows = table.getSelectedRows();
table.setSelected(selectedRows);
}
}

class TableMouseListener extends MouseAdapter{
@Override
public void mouseReleased(MouseEvent e){
if(e.getSource() instanceof RowHeadTable){
int row = rowHead.rowAtPoint(new Point(e.getX(),e.getY()));
if(row==-1){
return ;
}
if((Boolean)rowHead.getValueAt(row, 0)){
table.addRowSelectionInterval(row,row);
}else{
table.removeRowSelectionInterval(row, row);
leftTopCornor.setValueAt(Boolean.FALSE, 0, 0);
leftTopCornor.clearSelection();
}
}
else if(e.getSource() instanceof LeftTopCornor){
if((Boolean)leftTopCornor.getValueAt(0, 0)){//select all
table.selectAll();
}else{
table.clearSelection();
leftTopCornor.clearSelection();
rowHead.clearSelection();
}
}
}

}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值