import java.awt.Font;
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import java.util.ArrayList;
import java.util.Enumeration;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JComboBox;
import javax.swing.UIManager;
import javax.swing.JSplitPane;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.DefaultComboBoxModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
/*********************************************************************
*
*
* TableChooser.java
*
* Last modified: 2005-04-26
*
* Author: NeedJava
*
* E-Mail:
needjava@126.com
*
* Address: HeFei-AnHui-China
*
* Bug: 如果选中行头拖动,会发现表体不会跟着拖动,除非你拖动表体
*
* If you fixed this bug, please let us know, Thanks a lot.
*
*
*********************************************************************/
class TableChooser extends JFrame
{
private final boolean horizontal;
private String[] tableTitle;
private ArrayList primaryBody;
private ArrayList prepareBody;
private ArrayList selectBody;
private ShowTableModel prepareModel;
private ShowTableModel selectModel;
private final RowHeaderModel prepareRowHeaderModel;
private final RowHeaderModel selectRowHeaderModel;
private final JTable prepareTable;
private final JTable selectTable;
private final JTable prepareRowHeaderTable;
private final JTable selectRowHeaderTable;
private final static int rowHeight=18;
private final JScrollPane prepareTableJSP;
private final JScrollPane selectTableJSP;
private final JPanel prepareTablePanel;
private final JPanel selectTablePanel;
private final JSplitPane splitPane;
/**
*
* 构造函数
*
*/
public TableChooser( boolean horizontal )
{
this.horizontal=horizontal;
//设置程序标题栏
this.setTitle( "选择框" );
//不给最大化
//this.setResizable( false );
//设置程序界面大小
this.setSize( new Dimension( 500, 400 ) );
//将程序居中放置(方法1)
Dimension paneSize=this.getSize();
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation( ( screenSize.width-paneSize.width )/2, ( screenSize.height-paneSize.height )/2 );
//将程序居中放置(方法2)
//this.setLocationRelativeTo( null );
//设置程序关闭的类型,防止关闭
this.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
//设置关闭程序
this.addWindowListener( new WindowAdapter()
{
public void windowClosing( WindowEvent e )
{
closeApplication();
}
} );
//////////////////////////////
prepareTable=new JTable();
selectTable=new JTable();
//为待选、已选表格设置预设的绘制器
ShowTableRenderer ShowTableRenderer=new ShowTableRenderer();
prepareTable.setDefaultRenderer( Object.class, ShowTableRenderer );
selectTable.setDefaultRenderer( Object.class, ShowTableRenderer );
//设置是否可以拖动表头
prepareTable.getTableHeader().setReorderingAllowed( false );
selectTable.getTableHeader().setReorderingAllowed( false );
//设置行高
prepareTable.setRowHeight( rowHeight );
selectTable.setRowHeight( rowHeight );
//////////////////////////////
prepareRowHeaderModel=new RowHeaderModel( 0, 1 );
selectRowHeaderModel=new RowHeaderModel( 0, 1 );
prepareRowHeaderTable=new JTable( prepareRowHeaderModel );
selectRowHeaderTable=new JTable( selectRowHeaderModel );
//为rowHeaderTable设置预设的绘制器
prepareRowHeaderTable.setDefaultRenderer( Object.class, new RowHeaderRenderer( prepareTable ) );
selectRowHeaderTable.setDefaultRenderer( Object.class, new RowHeaderRenderer( selectTable ) );
//将rowHeaderTable固定宽度
prepareRowHeaderTable.setPreferredScrollableViewportSize( new Dimension( 50, 0 ) );
selectRowHeaderTable.setPreferredScrollableViewportSize( new Dimension( 50, 0 ) );
//设置行高
prepareRowHeaderTable.setRowHeight( rowHeight );
selectRowHeaderTable.setRowHeight( rowHeight );
//防止单元格有缝隙
prepareRowHeaderTable.setIntercellSpacing( new Dimension( 0, 0 ) );
selectRowHeaderTable.setIntercellSpacing( new Dimension( 0, 0 ) );
//共用同一个ListSelectionModel,使两边的某行同时选中
prepareRowHeaderTable.setSelectionModel( prepareTable.getSelectionModel() );
selectRowHeaderTable.setSelectionModel( selectTable.getSelectionModel() );
//////////////////////////////
prepareTableJSP=new JScrollPane( prepareTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
selectTableJSP=new JScrollPane( selectTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED );
//将rowHeaderTable作为row header加入JScrollPane的RowHeaderView区域
prepareTableJSP.setRowHeaderView( prepareRowHeaderTable );
selectTableJSP.setRowHeaderView( selectRowHeaderTable );
//左上角修饰
prepareTableJSP.setCorner( JScrollPane.UPPER_LEFT_CORNER, new RowHeaderCorner( prepareTable, "全选" ) );
selectTableJSP.setCorner( JScrollPane.UPPER_LEFT_CORNER, new RowHeaderCorner( selectTable, "全选" ) );
//////////////////////////////
prepareTablePanel=new JPanel();
selectTablePanel=new JPanel();
prepareTablePanel.setLayout( new BorderLayout() );
selectTablePanel.setLayout( new BorderLayout() );
prepareTablePanel.add( prepareTableJSP, BorderLayout.CENTER );
selectTablePanel.add( selectTableJSP, BorderLayout.CENTER );
prepareTablePanel.setBorder( new TitledBorder( new EtchedBorder( EtchedBorder.LOWERED ), "待选人员" ) );
selectTablePanel.setBorder( new TitledBorder( new EtchedBorder( EtchedBorder.LOWERED ), "已选人员" ) );
//至少显示6行
prepareTablePanel.setMinimumSize( new Dimension( 200, 150 ) );
selectTablePanel.setMinimumSize( new Dimension( 200, 150 ) );
//////////////////////////////
if( horizontal )
{
splitPane=new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, prepareTablePanel, selectTablePanel );
}
else{ splitPane=new JSplitPane( JSplitPane.VERTICAL_SPLIT, prepareTablePanel, selectTablePanel );
}
//拖动时显示窗口,否则只显示拖动的边框
splitPane.setContinuousLayout( true );
//可以点三角形图标只显示一个区域
splitPane.setOneTouchExpandable( true );
splitPane.setDividerLocation( 210 );
//放好主要面板
this.getContentPane().add( splitPane, BorderLayout.CENTER );
getTableModel();
}
/**
*
* 得到原始的TableModel
*
*/
private final void getTableModel()
{
tableTitle=new String[]{ "是否选择", "标号" };
primaryBody=new ArrayList();
prepareBody=new ArrayList();
selectBody=new ArrayList();
for( int i=1; i<21; i++ )
{
Object[] row=new Object[2];
row[0]=Boolean.FALSE; //第一列为判断用的布尔值,也可new Boolean( false )
row[1]=new Double( i );
primaryBody.add( row ); //一行搞好后,增加进ArrayList中
prepareBody.add( row ); //将待选内容初始为原始表格
}
////////////////////////////////////////////////////////////////////////
//
// 将数据根据需求切分
//
////////////////////////////////////////////////////////////////////////
prepareModel=new ShowTableModel( prepareBody, tableTitle )
{
public void setValueAt( Object value, int row, int col )
{
super.setValueAt( value, row, col ); //需要让父来赋值
Object rowObj = prepareBody.get( row ); //得到主表的那行内容
int whichRow = selectBody.indexOf( rowObj ); //查找次表有没有相同的那行记录
if( this.getValueAt( row, col ).equals( Boolean.TRUE ) ) //如果此行记录的首列内容为选择
{
if( whichRow<0 ) //防止次表多次增加那行内容
{
selectBody.add( rowObj );
}
}
else{ if( whichRow>=0 )
{
selectBody.remove( whichRow ); //如果首列为取消选择,那么次表删除那行记录
}
}
this.fireTableDataChanged(); //通告主表结构变化
selectModel.fireTableDataChanged(); //通告次表结构变化
selectRowHeaderModel.setRowCount( selectBody.size() ); //让次表行头跟着次表行数变化
}
};
prepareTable.setModel( prepareModel );
selectModel=new ShowTableModel( selectBody, tableTitle )
{
public void setValueAt( Object value, int row, int col )
{
super.setValueAt( value, row, col ); //需要让父来赋值
if( this.getValueAt( row, col ).equals( Boolean.FALSE ) )
{
selectBody.remove( row );
}
prepareModel.fireTableDataChanged(); //通告主表结构变化
this.fireTableDataChanged(); //通告次表结构变化
selectRowHeaderModel.setRowCount( selectBody.size() ); //让次表行头跟着次表行数变化
}
};
selectTable.setModel( selectModel );
prepareRowHeaderModel.setRowCount( prepareBody.size() );
selectRowHeaderModel.setRowCount( selectBody.size() );
}
/**
*
* 取消所有选择的人员
*
*/
private final void deselectAll()
{
for( int i=0; i<selectBody.size(); i++ )
{
( (Object[])selectBody.get( i ) )[0]=Boolean.FALSE; //将所有选择的行的第一列设为false
}
selectBody.clear(); //删除已经选择的内容
prepareModel.fireTableDataChanged(); //通告主表结构变化
selectModel.fireTableDataChanged(); //通告次表结构变化
selectRowHeaderModel.setRowCount( selectBody.size() ); //让次表行头跟着次表行数变化
}
/**
*
* 关闭程序
*
*
*/
private void closeApplication()
{
Toolkit.getDefaultToolkit().beep();
int answer=JOptionPane.showConfirmDialog( TableChooser.this, "您真的要退出此系统?", "退出程序", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null );
if( answer==JOptionPane.YES_OPTION ) //选择“是”
{
System.exit( 0 );
}
else if( answer==JOptionPane.NO_OPTION ) //选择“否”
{
return;
}
}
/**
*
* 入口主程序
*
*/
//*/////////////////////////////////////////////////////////////////////////////
public static void main( String args[] )
{
//改变GUI字体
Font font=new Font( "宋体", Font.PLAIN, 12 );
Enumeration keys=UIManager.getLookAndFeelDefaults().keys();
while( keys.hasMoreElements() )
{
Object key=keys.nextElement();
if( UIManager.get( key ) instanceof Font )
{
UIManager.put( key, font );
}
}
//改变ComboBox背景色
UIManager.put( "ComboBox.foreground", Color.black );
UIManager.put( "ComboBox.background", Color.white );
UIManager.put( "ComboBox.disabledForeground", Color.gray );
UIManager.put( "ComboBox.disabledBackground", Color.white );
UIManager.put( "Viewport.background", Color.white );
//new TableChooser( true ).setVisible( true );
new TableChooser( false ).setVisible( true );
}
//*/////////////////////////////////////////////////////////////////////////////
}
/***********************************************************
*
* 待选、已选表格行头用的渲染器Renderer
*
**********************************************************/
class RowHeaderRenderer extends JLabel implements TableCellRenderer
{
private JTable refTable;
private JTableHeader header;
private Color headerForeground;
private Color headerBackground;
private Font headerFont;
public RowHeaderRenderer( JTable refTable )
{
this.refTable=refTable;
this.header=refTable.getTableHeader();
this.headerForeground=header.getForeground();
this.headerBackground=header.getBackground();
this.headerFont=header.getFont();
}
public Component getTableCellRendererComponent( JTable table,
Object obj,
boolean isSelected,
boolean hasFocus,
int row,
int col )
{
this.setOpaque( true );
//设为TableHeader的边框类型
this.setBorder( UIManager.getBorder( "TableHeader.cellBorder" ) );
//居中显示文字
this.setHorizontalAlignment( CENTER );
//设置背景色为TableHeader的背景色
this.setBackground( headerBackground );
if( isSelected )
{
//当选取单元格时,在row header上设置成选取颜色
this.setForeground( Color.white );
this.setBackground( UIManager.getColor( "ScrollBar.thumbShadow" ) );
this.setFont( headerFont );
this.setText( String.valueOf( row+1 )+"*" ); //显示行数
}
else{ this.setForeground( headerForeground );
this.setFont( headerFont );
this.setText( String.valueOf( row+1 ) ); //显示行数
}
return this;
}
}
/***********************************************************
*
* 待选、已选表格行头用的Model
*
**********************************************************/
class RowHeaderModel extends DefaultTableModel
{
RowHeaderModel( int row, int col )
{
super( row, col );
}
public boolean isCellEditable( int row, int col )
{
return false; //整个行头不给编辑
}
}
/***********************************************************
*
* 待选、已选表格左上角Corner
*
**********************************************************/
class RowHeaderCorner extends JLabel
{
private JTable table;
RowHeaderCorner( JTable table, String title )
{
super( title, JLabel.CENTER );
this.table=table;
this.addMouseListener( new MouseAdapter()
{
public void mousePressed( MouseEvent e )
{
tableSelectAll();
}
} );
this.setBorder( UIManager.getBorder( "TableHeader.cellBorder" ) );
}
private void tableSelectAll()
{
table.selectAll();
}
}
/***********************************************************
*
* 待选、已选表格用的渲染器Renderer
*
**********************************************************/
class ShowTableRenderer extends DefaultTableCellRenderer
{
public Component getTableCellRendererComponent( JTable table,
Object obj,
boolean isSelected,
boolean hasFocus,
int row,
int col )
{
super.getTableCellRendererComponent( table,
obj,
isSelected,
hasFocus,
row,
col );
this.setHorizontalAlignment( JLabel.CENTER ); //居中显示文字
return this;
}
}
/***********************************************************
*
* 待选、已选表格用的Model
*
**********************************************************/
class ShowTableModel extends AbstractTableModel
{
private ArrayList tableBody;
private String[] tableTitle;
ShowTableModel( ArrayList body, String[] title )
{
this.tableBody = body;
this.tableTitle = title;
}
public Object getValueAt( int row, int col )
{
if( row>=0&&row<tableBody.size()&&col>=0&&col<tableTitle.length ) //控制很严
{
return ( (Object[])tableBody.get( row ) )[col];
}
else{ return null;
}
}
public void setValueAt( Object value, int row, int col )
{
( (Object[])tableBody.get( row ) )[col]=value;
}
public int getColumnCount()
{
return tableTitle.length;
}
public String getColumnName( int col )
{
if( col>=0&&col<tableTitle.length )
{
return tableTitle[col];
}
else{ return "";
}
}
public Class getColumnClass( int col )
{
if( col==0 ) //第一列为选择框
{
return Boolean.class;
}
return Object.class;
}
public int getRowCount()
{
return tableBody.size();
}
public boolean isCellEditable( int row, int col )
{
return ( col==0 ); //如果是第一列给编辑,其他不给
}
}
posted on 2007-07-08 22:03
NeedJava 阅读(943)
评论(0) 编辑 收藏 所属分类:
Java