??xml version="1.0" encoding="utf-8" standalone="yes"?>
import java.awt.Dimension;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
/*******************************************************************************
*
* 关闭前提?br /> *
* Author: NeedJava
*
* Modofied: 2005.04.02
*
******************************************************************************/
class AlarmBeforeClosed extends JFrame
{
public AlarmBeforeClosed( String title )
{
//讄E序标题?br /> this.setTitle( title );
//不给最大化
this.setResizable( false );
//讄E序界面大小
this.setSize( new Dimension( 500, 400 ) );
//程序居中放|(Ҏ1Q?br /> Dimension paneSize=this.getSize();
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation( ( screenSize.width-paneSize.width )/2, ( screenSize.height-paneSize.height )/2 );
//程序居中放|(Ҏ2Q?br /> //this.setLocationRelativeTo( null );
//讄E序关闭的类型,防止关闭
this.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
//讄关闭E序
this.addWindowListener( new WindowAdapter()
{
public void windowClosing( WindowEvent e )
{
closeApplication();
}
} );
}
/*****************************************************************************
*
* 关闭E序
*
****************************************************************************/
private void closeApplication()
{
Toolkit.getDefaultToolkit().beep();
int answer=JOptionPane.showConfirmDialog( AlarmBeforeClosed.this,
"您真的要退出此pȝQ?,
"退出程?,
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null );
if( answer==JOptionPane.YES_OPTION ) //选择“是?br /> {
System.exit( 0 );
}
else if( answer==JOptionPane.NO_OPTION ) //选择“否?br /> {
return;
}
}
/*****************************************************************************
*
* 入口ȝ?br /> *
****************************************************************************/
public static void main( String[] args )
{
new AlarmBeforeClosed( "关闭前提? ).setVisible( true );
}
}
long temp=0L;
long begin=0L;
////////////////////////////////////////////////////////////////////////////
//
// dividend/1024{效于dividend>>10
//
////////////////////////////////////////////////////////////////////////////
begin=System.currentTimeMillis();
for( int i=0; i<10000000; i++ )
{
temp=dividend/1024;
}
System.out.println( temp+" d耗时Q?+( System.currentTimeMillis()-begin )+"毫秒" );
begin=System.currentTimeMillis();
for( int i=0; i<10000000; i++ )
{
temp=dividend>>10;
}
System.out.println( temp+" d耗时Q?+( System.currentTimeMillis()-begin )+"毫秒\r\n" );
////////////////////////////////////////////////////////////////////////////
//
// dividend*1024{效于dividend<<10
//
////////////////////////////////////////////////////////////////////////////
begin=System.currentTimeMillis();
for( int i=0; i<10000000; i++ )
{
temp=dividend*1024;
}
System.out.println( temp+" d耗时Q?+( System.currentTimeMillis()-begin )+"毫秒" );
begin=System.currentTimeMillis();
for( int i=0; i<10000000; i++ )
{
temp=dividend<<10;
}
System.out.println( temp+" d耗时Q?+( System.currentTimeMillis()-begin )+"毫秒\r\n" );
////////////////////////////////////////////////////////////////////////////
//
// dividend%1024{效于dividend-( dividend>>10<<10 )
//
////////////////////////////////////////////////////////////////////////////
begin=System.currentTimeMillis();
for( int i=0; i<10000000; i++ )
{
temp=dividend%1024;
}
System.out.println( temp+" d耗时Q?+( System.currentTimeMillis()-begin )+"毫秒" );
begin=System.currentTimeMillis();
for( int i=0; i<10000000; i++ )
{
temp=dividend-( dividend>>10<<10 );
}
System.out.println( temp+" d耗时Q?+( System.currentTimeMillis()-begin )+"毫秒\r\n" );
}
}
long start=0L;
String temp=null;
/*/
start=System.currentTimeMillis();
temp=null;
for( int i=0; i<times; i++ )
{
temp=times+"";
}
System.out.println( temp+" "+( System.currentTimeMillis()-start ) );
/*/
start=System.currentTimeMillis();
temp=null;
for( int i=0; i<times; i++ )
{
temp=Long.toString( times );
}
System.out.println( temp+" "+( System.currentTimeMillis()-start ) );
//*/
}
}
/*******************************************************************************
*
*
* Author: NeedJava
*
* Modified: 2007.08.26
*
******************************************************************************/
public final class ReadFaster
{
/*****************************************************************************
*
* 构造函敎ͼ默认使用当前路径
*
****************************************************************************/
public ReadFaster()
{
this( "." );
}
public ReadFaster( String fileName )
{
this.listPictures( null, fileName );
}
/*****************************************************************************
*
* 列出当前目录下的文g列表Q包括文件和文g?br /> *
****************************************************************************/
private final void listPictures( File path, String fileName )
{
File file=new File( path, fileName );
if( file.isDirectory() )
{
//得到当前目录下的文g列表Q包括文件和文g?br /> String[] children=file.list();
//如果子集为空Q就攑ּ后面的操?br /> if( children==null )
{
return;
}
//排序
//java.util.Arrays.sort( children );
//如果子集不ؓI,则显C?br /> for( int i=0; i<children.length; i++ )
{
listPictures( file, children[i] );
}
}
else if( file.isFile() )
{
if( isPictureSuffix( file.getPath() ) )
{
readPicture( file );
}
}
}
/*****************************************************************************
*
* Ҏ后缀名判断是否是有效的图片,q且q回写的后~?br /> *
****************************************************************************/
private final boolean isPictureSuffix( String fileName )
{
if( fileName==null )
{
return false;
}
int length=fileName.length();
//可能存在?jpg”这L文gQ即4个字W?br /> if( length>=4 )
{
char c=fileName.charAt( length-4 );
if( c=='.' )
{
c=fileName.charAt( length-3 );
if( c=='j'||c=='J' )
{
c=fileName.charAt( length-2 );
if( c=='p'||c=='P' )
{
c=fileName.charAt( length-1 );
if( c=='g'||c=='G' )
{
return true;
}
else if( c=='e'||c=='E' )
{
return true;
}
}
}
else if( c=='t'||c=='T' )
{
c=fileName.charAt( length-2 );
if( c=='i'||c=='I' )
{
c=fileName.charAt( length-1 );
if( c=='f'||c=='F' )
{
return true;
}
}
}
}
else if( c=='j'||c=='J' )
{
c=fileName.charAt( length-3 );
if( c=='p'||c=='P' )
{
c=fileName.charAt( length-2 );
if( c=='e'||c=='E' )
{
c=fileName.charAt( length-1 );
if( c=='g'||c=='G' )
{
return true;
}
}
}
else if( c=='f'||c=='F' )
{
c=fileName.charAt( length-2 );
if( c=='i'||c=='I' )
{
c=fileName.charAt( length-1 );
if( c=='f'||c=='F' )
{
return true;
}
}
}
}
else if( c=='t'||c=='T' )
{
c=fileName.charAt( length-3 );
if( c=='i'||c=='I' )
{
c=fileName.charAt( length-2 );
if( c=='f'||c=='F' )
{
c=fileName.charAt( length-1 );
if( c=='f'||c=='F' )
{
return true;
}
}
}
}
}
return false;
}
/*****************************************************************************
*
* 大于10240的,每次?024?048
*
* 于10240的,?0240一ơ即?br /> *
****************************************************************************/
private final String readPicture( File file )
{
try{ FileInputStream fis=new FileInputStream( file );
//于10K的忽?br /> if( fis.available()<10240 )
{
return "";
}
long num=0L;
//Buffered的默认有2048?192
//*/ No.1
byte[] buffer=new byte[10240];
if( fis.read( buffer )==10240 )
{
for( int i=0; i<10240; i++ )
{
num++;
}
}
//*/
/*/ No.3
byte[] buffer=new byte[5120];
for( int j=0; j<2; j++ )
{
if( fis.read( buffer )==5120 )
{
for( int i=0; i<5120; i++ )
{
num++;
}
}
}
//*/
/*/ No.2
byte[] buffer=new byte[2048];
for( int j=0; j<5; j++ )
{
if( fis.read( buffer )==2048 )
{
for( int i=0; i<2048; i++ )
{
num++;
}
}
}
//*/
/*/ No.4
byte[] buffer=new byte[1024];
for( int j=0; j<10; j++ )
{
if( fis.read( buffer )==1024 )
{
for( int i=0; i<1024; i++ )
{
num++;
}
}
}
//*/
fis.close();
}
catch( FileNotFoundException fnfe )
{
fnfe.printStackTrace();
}
catch( IOException ioe )
{
ioe.printStackTrace();
}
catch( Exception e )
{
e.printStackTrace();
}
return "";
}
/*****************************************************************************
*
* d数入?br /> *
****************************************************************************/
public static void main( String[] args )
{
try{ long begin=System.currentTimeMillis();
ReadFaster rf=new ReadFaster();
System.out.println( "d耗时Q?+( System.currentTimeMillis()-begin )+"毫秒\r\n" );
}
catch( Exception e )
{
e.printStackTrace();
}
}
}
int length=12;
String temp="12345678901234567890"
+"12345678901234567890"
+"12345678901234567890"
+"12345678901234567890"
+"12345678901234567890"
+"黑客帝国忍者神龟变形金?
+"12345678901234567890"
+"12345678901234567890"
+"12345678901234567890"
+"12345678901234567890"
+"12345678901234567890";
int times=10000000; //千万
/*/
int begin=100;
int length=120;
String temp="12345678901234567890"
+"12345678901234567890"
+"12345678901234567890"
+"12345678901234567890"
+"12345678901234567890"
+"黑客帝国忍者神龟变形金?
+"黑客帝国忍者神龟变形金?
+"黑客帝国忍者神龟变形金?
+"黑客帝国忍者神龟变形金?
+"黑客帝国忍者神龟变形金?
+"黑客帝国忍者神龟变形金?
+"黑客帝国忍者神龟变形金?
+"黑客帝国忍者神龟变形金?
+"黑客帝国忍者神龟变形金?
+"黑客帝国忍者神龟变形金?
+"12345678901234567890"
+"12345678901234567890"
+"12345678901234567890"
+"12345678901234567890"
+"12345678901234567890";
int times=1000000; //百万
//*/
char[] oldArray=temp.toCharArray();
char[] newArray=null;
long start=0L;
////////////////////////////////////////////////////////////////////////////
//
// 单纯赋?br /> //
////////////////////////////////////////////////////////////////////////////
newArray=new char[length];
start=System.currentTimeMillis();
for( int i=0; i<times; i++ )
{
for( int j=0; j<length; j++ )
{
newArray[j]=oldArray[begin+j];
}
}
System.out.println( new String( newArray )+" "+( System.currentTimeMillis()-start ) );
////////////////////////////////////////////////////////////////////////////
//
// System.arraycopy
//
////////////////////////////////////////////////////////////////////////////
newArray=new char[length];
start=System.currentTimeMillis();
for( int i=0; i<times; i++ )
{
System.arraycopy( oldArray, begin, newArray, 0, length );
}
System.out.println( new String( newArray )+" "+( System.currentTimeMillis()-start ) );
}
}
/*******************************************************************************
*
* Ҏ字或文g名排?br /> *
* 没有考虑汉字昄时占两个位置的情况,卛_文g名处理不太好
*
* Author: NeedJava
*
* Modified: 2007.09.09
*
******************************************************************************/
public final class DotAlign
{
private DotAlign(){}
private static final String align( String string,
char prefix,
char suffix,
int prefixLength,
int suffixLength,
boolean isNumber )
{
if( string==null||string.equals( "" )||string.equals( "." )||prefixLength<0||suffixLength<0 )
{
return string;
}
//如果没有数Q那么按照常理,数点也应该省略
char[] buffer=new char[( suffixLength>0 ? prefixLength+1+suffixLength : prefixLength )];
int stringLength=string.length();
int dot=stringLength-1;
//扑ֈ数点位|,可以用lastIndexOf()代替
while( dot>-1 )
{
if( string.charAt( dot-- )=='.' )
{
dot++;
break;
}
}
//System.out.print( Integer.toString( dot )+"\t" );
//★整数部分,从小数点左位向左U?br /> int pointer=( dot>-1 ? dot-1 : stringLength-1 );
for( int i=prefixLength-1; i>-1; i-- )
{
if( pointer>-1 )
{
buffer[i]=string.charAt( pointer-- );
}
else{ buffer[i]=prefix;
}
}
//如果没有数部分Q那么按照常理,数点应该省?br /> if( suffixLength>0 )
{
//★小数点
buffer[prefixLength]=( dot>-1||isNumber ? '.' : suffix );
//★小数部分,从小数点右位向右U?br /> pointer=( dot>-1 ? dot+1 : stringLength );
for( int i=prefixLength+1; i<buffer.length; i++ )
{
if( pointer<stringLength )
{
buffer[i]=string.charAt( pointer++ );
}
else{ buffer[i]=suffix;
}
}
}
return new String( buffer );
}
public final static void main( String[] args )
{
System.out.println( "\r\n-------------------------------------------\r\n" );
String[] number={ "",
".",
".5",
".56",
".567",
".5678",
"1234",
"1234.",
"1234.5",
"1234.56",
"1234.567",
"1234.5678" };
for( int i=0; i<number.length; i++ )
{
System.out.println( "["+DotAlign.align( number[i], ' ', '0', 7, 2, true )+"] ["+number[i]+"]" );
}
System.out.println( "\r\n-------------------------------------------\r\n" );
String[] file={ "",
".",
".j",
".jp",
".jpe",
".jpeg",
"1234",
"1234.",
"1234.j",
"1234.jp",
"1234.jpe",
"1234.jpeg" };
for( int i=0; i<file.length; i++ )
{
System.out.println( "["+DotAlign.align( file[i], ' ', ' ', 7, 5, false )+"] ["+file[i]+"]" );
}
System.out.println( "\r\n-------------------------------------------\r\n" );
}
}
Ҏ RSSOwlLoader.java 中的
[code]
private static void startupProcess( String[] args )
{
...
if( !System.getProperties().containsKey( PROPERTY_ALLOW_MULTI_INSTANCES )&&StartupManager.isRSSOwlRunning( feedArgument ) )
...
}
[/code]
q踪?StartupManager.java 见下Q?/font>
q踪?StartupManager.isRSSOwlRunning( String message ) 用途ؓ建立ServerSocketQ监听本?794端口
[code]
static ServerSocket applLockSocket;
public static boolean isRSSOwlRunning( String message )
{
try{ applLockSocket=new ServerSocket( 8794, 50, InetAddress.getByName( "127.0.0.1" ) ); //1987q??日出生?
handleSocketUnBound(); //
return false;
}
catch( java.net.BindException e ) //Another instance already running
{
...
handleSocketBound( message ); //
return true;
}
catch( IOException e ) //Other Error
{
...
return false;
}
}
[/code]
q踪?StartupManager.handleSocketUnBound() ?StartupManager.handleSocketBound( String message )
[code]
private static void handleSocketBound( String message )
{
Socket socket;
try{ socket=new Socket( InetAddress.getByName( "127.0.0.1" ), 8794 );
PrintWriter writer=new PrintWriter( new OutputStreamWriter( socket.getOutputStream() ) );
writer.println( ( message!=null&&message.length()>0 ) ? message : DEFAULT_MESSAGE );
writer.flush();
}
catch( UnknownHostException e )
{
...
}
catch( IOException e )
{
...
}
}
[/code]
[code]
/**
* Server not yet running. Start it and listen for incoming messages.
*/
private static void handleSocketUnBound()
{
listen(); //转向Qؓ了对U好看?q是Z兼容Q?br />}
/**
* Listen for incoming messages.看看接受的连接发送了什么内?br /> */
private static void listen()
{
//Run the Server inside a Thread
server=new ExtendedThread() //extends from Thread
{
public void run()
{
while( !isStopped()&&!isInterrupted() )
{
BufferedReader buffReader=null;
try{ //Read a single line from the Socket
Socket socket=applLockSocket.accept();
buffReader=new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
final String message=buffReader.readLine();
socket.close();
//Check the received message
if( ( message!=null&&message.length()>0 )&&GUI.display!=null&&!GUI.display.isDisposed() ) //ȀzL个GUI的代码在此,我们q去看看
{
GUI.display.asyncExec( new Runnable()
{
public void run()
{
//Restore the RSSOwl Window and handle Message
if( GUI.isAlive() )
{
GUI.rssOwlGui.restoreWindow(); //扑ֈ了,转到GUI.java
//Handle the message as Link if valid argument
if( RSSOwlLoader.isValidArgument( message ) )
{
GUI.rssOwlGui.getEventManager().actionHandleSuppliedLink( message );
}
}
}
} );
}
}
catch( IOException e )
{
...
}
finally{ //关闭?br /> }
}
}
};
server.setDaemon( true );
server.setName( "Startup Manager Thread" );
server.start();
}
[/code]
q踪?GUI.java 见下Q?/font>
q踪到GUI.restoreWindow()
[code]
/**
* Restore the application window either from taskbar or the tray.
*/
public void restoreWindow()
{
//RSSOwl is minimized to Tray
if( GlobalSettings.useSystemTray()&&rssOwlSystray!=null&&rssOwlSystray.isMinimizedToTray() )
{
rssOwlSystray.restoreWindow();
}
else{ //RSSOwl is not active
shell.forceActive(); //是它了
shell.setMinimized( false );
}
}
[/code]
原理如下Q?
在本?794端口建立服务监听Qƈ且一直监听此端口Q试图接受此端口其它实例Q其它程序?Q发送的输入
如果d数据Q好像没有判断数据的合法性,仅仅判断数据不ؓI)Qƈ且自׃是“激zZ状态,“激zZ自己;
如果建立服务监听不成功,说明已经有实例(其它E序Q)占用此端口了Q向此端口发送数据唤醒前一个实例,停几U以便前一个实例接受,然后退出?
E序用的是SWTQ激zL法用的是shell.forceActive()Qbut it's not good for core java.
以上分析如有不对Q恳h正?/font>
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
import javax.swing.JFrame;
/*******************************************************************************
*
* 只运行一个实?br /> *
* Just single instance
*
*
* Author: NeedJava
*
* Modified: 2007.08.29
*
*
* 你可以用此E序于Q何地方,但请保留E序作者及注释的完整。如果你改进了程序,
*
* 请在原作者后d姓名Q如QAuthor: NeedJava/Jack/MikeQ版本及修改旉同理?br /> *
******************************************************************************/
public final class SingleInstance
{
/*****************************************************************************
*
* 构造函?br /> *
****************************************************************************/
private SingleInstance()
{
this( "vab", ".vab", "vab" );
}
public SingleInstance( String filePrefixName, String fileSuffixName, String directoryName )
{
this.init( filePrefixName, fileSuffixName, directoryName );
}
/*****************************************************************************
*
* 原理Q?br /> *
* 用重定向标准错误输出流定向C个日志文Ӟ占用它,使其不能被删?br /> *
* 以后的实例试囑ְ存在的此日志文g改名q且另存为某个文件夹?br /> *
* 如果成功Q说明没有程序占用它Q不排除你在用它Q缺PQ,正好保存日志
*
* 如果不成功,退出、renameTo命o有一双雕的作用
*
****************************************************************************/
private final void init( String filePrefixName, String fileSuffixName, String directoryName )
{
if( filePrefixName==null||fileSuffixName==null||directoryName==null )
{
exitWithWarning( "Error: Invalid file name.", 10 );
}
//We need check the fileSuffixName here? From the tail?
String fileName=filePrefixName+fileSuffixName;
try{ File error=new File( fileName );
if( error.exists() )
{
File directory=new File( directoryName );
String newFileName=directoryName+File.separator+convertMillisecond2DateTime( error.lastModified() )+fileSuffixName;
//System.out.println( newFileName );
if( directory.exists() )
{
if( directory.isDirectory() )
{
//renameTo也是好东东,既可以改名,q可以移文g
if( !error.renameTo( new File( newFileName ) ) )
{
exitWithWarning( "Error: The instance already exists, I will exit.", 11 );
}
}
else{ exitWithWarning( "Error: The \'"+directoryName+"\' is not a valid directory.", 21 );
}
}
else{ if( directory.mkdirs() )
{
//renameTo也是好东东,既可以改名,q可以移文g
if( !error.renameTo( new File( newFileName ) ) )
{
exitWithWarning( "Error: The instance already exists, I will exit.", 11 );
}
}
else{ exitWithWarning( "Error: Failed to create the \'"+directoryName+"\' directory.", 22 );
}
}
}
//重定向标准错误输出流Q所有功能全靠它。来Q啵一?br /> System.setErr( new PrintStream( new FileOutputStream( fileName ) ) );
}
catch( FileNotFoundException fnfe )
{
//fnfe.printStackTrace();
exitWithWarning( fnfe.toString(), 23 );
}
catch( IOException ioe )
{
//ioe.printStackTrace();
exitWithWarning( ioe.toString(), 29 );
}
catch( Exception e )
{
//e.printStackTrace();
exitWithWarning( e.toString(), 99 );
}
}
/*****************************************************************************
*
* You can change the milliseconds to the date and time string here
*
* I just return the original
*
* Don't get the same string :)
*
****************************************************************************/
private final String convertMillisecond2DateTime( long millisecond )
{
return ""+millisecond;
}
/*****************************************************************************
*
* Return the warning and the exit code, then exit the application
*
****************************************************************************/
private final void exitWithWarning( String warning, int code )
{
System.out.println( warning==null ? "" : warning );
System.exit( code );
}
/*****************************************************************************
*
* d数入?br /> *
****************************************************************************/
public final static void main( String[] args )
{
SingleInstance si=new SingleInstance( "error", ".txt", "error" );
final JFrame frame=new JFrame( "Just single instance. By NeedJava. 2007.08.29" );
//I stay here, to make some friends happy.
frame.addWindowListener( new WindowAdapter()
{
public void windowClosing( WindowEvent we )
{
frame.dispose();
System.exit( 0 );
}
} );
frame.setBounds( 200, 200, 700, 70 );
frame.setVisible( true );
}
}
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: 如果选中行头拖动Q会发现表体不会跟着拖动Q除非你拖动表体
*
* 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;
/**
*
* 构造函?br /> *
*/
public TableChooser( boolean horizontal )
{
this.horizontal=horizontal;
//讄E序标题?br /> this.setTitle( "选择? );
//不给最大化
//this.setResizable( false );
//讄E序界面大小
this.setSize( new Dimension( 500, 400 ) );
//程序居中放|(Ҏ1Q?br /> Dimension paneSize=this.getSize();
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation( ( screenSize.width-paneSize.width )/2, ( screenSize.height-paneSize.height )/2 );
//程序居中放|(Ҏ2Q?br /> //this.setLocationRelativeTo( null );
//讄E序关闭的类型,防止关闭
this.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
//讄关闭E序
this.addWindowListener( new WindowAdapter()
{
public void windowClosing( WindowEvent e )
{
closeApplication();
}
} );
//////////////////////////////
prepareTable=new JTable();
selectTable=new JTable();
//为待选、已选表D|预讄l制?br /> 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 ) );
//q同一个ListSelectionModelQ两边的某行同旉中
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 );
//左上角修?br /> 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 ), "待选h? ) );
selectTablePanel.setBorder( new TitledBorder( new EtchedBorder( EtchedBorder.LOWERED ), "已选h? ) );
//臛_昄6?br /> 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 );
}
//拖动时显C窗口,否则只显C拖动的Ҏ
splitPane.setContinuousLayout( true );
//可以点三角Ş图标只显CZ个区?br /> 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; //W一列ؓ判断用的布尔|也可new Boolean( false )
row[1]=new Double( i );
primaryBody.add( row ); //一行搞好后Q增加进ArrayList?br /> prepareBody.add( row ); //待选内容初始ؓ原始表格
}
////////////////////////////////////////////////////////////////////////
//
// 数据根据需求切?br /> //
////////////////////////////////////////////////////////////////////////
prepareModel=new ShowTableModel( prepareBody, tableTitle )
{
public void setValueAt( Object value, int row, int col )
{
super.setValueAt( value, row, col ); //需要让父来赋?/font>
Object rowObj = prepareBody.get( row ); //得到主表的那行内?br /> 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 ); //如果首列为取消选择Q那么次表删除那行记?br /> }
}
this.fireTableDataChanged(); //通告主表l构变化
selectModel.fireTableDataChanged(); //通告ơ表l构变化
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 ); //需要让父来赋?/font>
if( this.getValueAt( row, col ).equals( Boolean.FALSE ) )
{
selectBody.remove( row );
}
prepareModel.fireTableDataChanged(); //通告主表l构变化
this.fireTableDataChanged(); //通告ơ表l构变化
selectRowHeaderModel.setRowCount( selectBody.size() ); //让次表行头跟着ơ表行数变化
}
};
selectTable.setModel( selectModel );
prepareRowHeaderModel.setRowCount( prepareBody.size() );
selectRowHeaderModel.setRowCount( selectBody.size() );
}
/**
*
* 取消所有选择的h?br /> *
*/
private final void deselectAll()
{
for( int i=0; i<selectBody.size(); i++ )
{
( (Object[])selectBody.get( i ) )[0]=Boolean.FALSE; //所有选择的行的第一列设为false
}
selectBody.clear(); //删除已经选择的内?/font>
prepareModel.fireTableDataChanged(); //通告主表l构变化
selectModel.fireTableDataChanged(); //通告ơ表l构变化
selectRowHeaderModel.setRowCount( selectBody.size() ); //让次表行头跟着ơ表行数变化
}
/**
*
* 关闭E序
*
*
*/
private void closeApplication()
{
Toolkit.getDefaultToolkit().beep();
int answer=JOptionPane.showConfirmDialog( TableChooser.this, "您真的要退出此pȝQ?, "退出程?, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null );
if( answer==JOptionPane.YES_OPTION ) //选择“是?br /> {
System.exit( 0 );
}
else if( answer==JOptionPane.NO_OPTION ) //选择“否?br /> {
return;
}
}
/**
*
* 入口ȝ?br /> *
*/
//*/////////////////////////////////////////////////////////////////////////////
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背景?br /> 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 );
}
//*/////////////////////////////////////////////////////////////////////////////
}
/***********************************************************
*
* 待选、已选表D头用的渲染器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的边框类?br /> 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;
}
}
/***********************************************************
*
* 待选、已选表D头用的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 ) //W一列ؓ选择?br /> {
return Boolean.class;
}
return Object.class;
}
public int getRowCount()
{
return tableBody.size();
}
public boolean isCellEditable( int row, int col )
{
return ( col==0 ); //如果是第一列给~辑Q其他不l?br /> }
}
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.DefaultCellEditor;
import javax.swing.event.ChangeEvent;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
public class WhoFirstTest
{
public static void main( String[]args )
{
final Object[][] data=new Object[][]{ { "11", new Integer( 1 ) }, { "22", new Integer( 2 ) } };
final String[] header=new String[]{ "表头1", "表头2" };
Table table=new Table( new BaseModel( data, header ) );
JTextField editor=new JTextField();
editor.setBorder( null );
table.setDefaultEditor( Object.class, new BaseEditor( editor ) );
table.setDefaultRenderer( Object.class, new BaseRenderer() );
table.getModel().addTableModelListener( new TableModelListener()
{
public void tableChanged( TableModelEvent e )
{
System.out.println( "tableChanged called" );
/*/
System.out.println( "FirstRow="+e.getFirstRow() );
System.out.println( "LastRow="+e.getLastRow() );
System.out.println( "Column="+e.getColumn() );
System.out.println( "Type="+( ( e.getType()==TableModelEvent.INSERT ) ? "Insert" : ( e.getType()==TableModelEvent.UPDATE ) ? "Update" : ( e.getType()==TableModelEvent.DELETE ) ? "Delete" : "Unknow" ) );
/*/
//Do CRUD for DB ...
//*/
}
} );
JFrame frame=new JFrame( "看看l单元格赋值的序" );
frame.setContentPane( new JScrollPane( table ) );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.pack();
frame.setVisible( true );
}
}
class Table extends JTable
{
public Table( TableModel model )
{
super( model );
}
public void editingStopped( ChangeEvent e )
{
System.out.println( "editingStopped called" );
super.editingStopped( e );
}
public Component prepareRenderer( TableCellRenderer renderer, int row, int column )
{
System.out.println( "prepareRenderer called" );
return super.prepareRenderer( renderer, row, column );
}
}
class BaseModel extends AbstractTableModel
{
Object[][] data = null;
Object[] header = null;
public BaseModel( Object[][] data, Object[] header )
{
this.data = data;
this.header = header;
}
public String getColumnName( int column )
{
return header[column].toString();
}
public int getRowCount()
{
return data.length;
}
public int getColumnCount()
{
return header.length;
}
public Object getValueAt( int row, int col )
{
return data[row][col];
}
public boolean isCellEditable( int row, int column )
{
return true;
}
public void setValueAt( Object value, int row, int col )
{
System.out.println( "setValueAt called" );
data[row][col]=value;
fireTableCellUpdated( row, col );
}
public void fireTableCellUpdated( int row, int column )
{
super.fireTableCellUpdated( row, column );
System.out.println( "fireTableCellUpdated called" );
}
public void fireTableChanged( TableModelEvent e )
{
super.fireTableChanged( e );
System.out.println( "fireTableChanged called" );
}
}
class BaseRenderer extends DefaultTableCellRenderer
{
public BaseRenderer()
{
super();
}
public Component getTableCellRendererComponent( JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column )
{
System.out.println( "BaseRenderer called" );
setText( ( value==null ) ? "" : value.toString() );
return this;
}
}
class BaseEditor extends DefaultCellEditor
{
public BaseEditor( JTextField editor )
{
super( editor );
}
public boolean stopCellEditing()
{
System.out.println( "stopCellEditing called" );
String value=(String)getCellEditorValue();
try{ Integer.parseInt( value );
}
catch( NumberFormatException e )
{
this.editorComponent.requestFocus();
return false;
}
return super.stopCellEditing();
}
}
import java.awt.Toolkit;
import java.sql.Types;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.DriverManager;
import java.sql.ResultSetMetaData;
import javax.swing.JOptionPane;
final class GetSQLServerType
{
private Connection connection;
private Statement statement;
private ResultSet resultSet;
private ResultSetMetaData metaData;
public GetSQLServerType()
{
try{ //实例化MSSQL2000的驱?br /> Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );
//q接数据?br /> connection=DriverManager.getConnection( "jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Northwind", "sa", "" );
//创徏Statement接口对象
statement=connection.createStatement();
resultSet=statement.executeQuery( " SELECT * FROM SQLServerType " );
metaData=resultSet.getMetaData();
int columnCount=metaData.getColumnCount();
FileWriter fw=new FileWriter( "SQLServerType.htm" );
BufferedWriter bfw=new BufferedWriter( fw );
bfw.write( "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=GBK\">" ); bfw.newLine();
bfw.write( "<title>SQL Server数据cd对应Javacd</title>" ); bfw.newLine();
//x样式?/////////////////////////////////////////
bfw.write( "<style type=text/css>" ); bfw.newLine();
bfw.write( "td{ color: #000000;" ); bfw.newLine();
bfw.write( " background: #FFFFFF;" ); bfw.newLine();
bfw.write( " height: 20px;" ); bfw.newLine();
bfw.write( " font-size: 10pt;" ); bfw.newLine();
bfw.write( " font-weight: normal;" ); bfw.newLine();
bfw.write( " font-family: 宋体;" ); bfw.newLine();
bfw.write( " text-align: right;" ); bfw.newLine();
bfw.write( " vertical-align: middle;" ); bfw.newLine();
bfw.write( " table-layout: fixed;" ); bfw.newLine();
bfw.write( " padding-top: 2;" ); bfw.newLine();
bfw.write( " padding-bottom: 2;" ); bfw.newLine();
bfw.write( " padding-left: 2;" ); bfw.newLine();
bfw.write( " padding-right: 2;" ); bfw.newLine();
bfw.write( " }" ); bfw.newLine();
bfw.write( "td.left{ text-align: left; }" ); bfw.newLine();
bfw.write( "td.center{ text-align: center; }" ); bfw.newLine();
bfw.write( "</style>" ); bfw.newLine();
bfw.write( "<body>" ); bfw.newLine();
bfw.write( "<table border=1 bordercolor=#000000 cellspacing=0 style=\"border-collapse:collapse\">" );bfw.newLine();
bfw.write( " <tr>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getColumnClassName( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getColumnLabel( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getCatalogName( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getColumnCount()</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getColumnDisplaySize( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getColumnName( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getColumnType( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getColumnTypeName( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getPrecision( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getScale( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getSchemaName( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.getTableName( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.isAutoIncrement( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.isCaseSensitive( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.isCurrency( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.isDefinitelyWritable( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.isNullable( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.isReadOnly( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.isSearchable( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.isSigned( column )</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>metaData.isWritable( column )</td>" );bfw.newLine();
bfw.write( " </tr>" );bfw.newLine();
for( int column=0; column<columnCount; column++ )
{
/*/
//metaData的所有方?br /> bfw.write( "metaData.getColumnCount() " + metaData.getColumnCount() );bfw.newLine();
bfw.write( "metaData.isAutoIncrement( "+( column+1 )+" ) " + metaData.isAutoIncrement( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.isCaseSensitive( "+( column+1 )+" ) " + metaData.isCaseSensitive( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.isSearchable( "+( column+1 )+" ) " + metaData.isSearchable( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.isCurrency( "+( column+1 )+" ) " + metaData.isCurrency( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.isNullable( "+( column+1 )+" ) " + metaData.isNullable( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.isSigned( "+( column+1 )+" ) " + metaData.isSigned( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.getColumnDisplaySize( "+( column+1 )+" ) " + metaData.getColumnDisplaySize( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.getColumnLabel( "+( column+1 )+" ) " + metaData.getColumnLabel( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.getColumnName( "+( column+1 )+" ) " + metaData.getColumnName( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.getSchemaName( "+( column+1 )+" ) " + metaData.getSchemaName( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.getPrecision( "+( column+1 )+" ) " + metaData.getPrecision( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.getScale( "+( column+1 )+" ) " + metaData.getScale( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.getTableName( "+( column+1 )+" ) " + metaData.getTableName( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.getCatalogName( "+( column+1 )+" ) " + metaData.getCatalogName( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.getColumnType( "+( column+1 )+" ) " + metaData.getColumnType( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.getColumnTypeName( "+( column+1 )+" ) " + metaData.getColumnTypeName( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.isReadOnly( "+( column+1 )+" ) " + metaData.isReadOnly( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.isWritable( "+( column+1 )+" ) " + metaData.isWritable( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.isDefinitelyWritable( "+( column+1 )+" ) " + metaData.isDefinitelyWritable( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.getColumnClassName( "+( column+1 )+" ) " + metaData.getColumnClassName( ( column+1 ) ) );bfw.newLine();
bfw.write( "metaData.isSigned( "+( column+1 )+" ) " + metaData.isSigned( ( column+1 ) ) );bfw.newLine();
bfw.write( "--------------------------------------------------------------------------------" );bfw.newLine();
//*/
bfw.write( " <tr>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getColumnClassName( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getColumnLabel( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getCatalogName( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getColumnCount() +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getColumnDisplaySize( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getColumnName( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getColumnType( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getColumnTypeName( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getPrecision( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getScale( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getSchemaName( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.getTableName( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.isAutoIncrement( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.isCaseSensitive( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.isCurrency( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.isDefinitelyWritable( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.isNullable( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.isReadOnly( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.isSearchable( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.isSigned( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " <td noWrap class=center>"+metaData.isWritable( column+1 ) +"</td>" );bfw.newLine();
bfw.write( " </tr>" );bfw.newLine();
}
bfw.write( "</table>" );bfw.newLine();
bfw.write( "</body>" ); bfw.newLine();
bfw.flush();
fw.close();
}
catch( IOException ioe )
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog( null, "创徏文gp|Q?, "创徏文g错误", JOptionPane.WARNING_MESSAGE );
System.out.println( ioe );
}
catch( ClassNotFoundException cnfe )
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog( null, "找不到数据库驱动文gQ?, "数据库错?, JOptionPane.WARNING_MESSAGE );
System.out.println( cnfe );
}
catch( SQLException se )
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog( null, "q接数据库失败!h查数据库是否q行?, "数据库错?, JOptionPane.WARNING_MESSAGE );
System.out.println( se );
}
finally{ try{ if( resultSet!=null )
{
resultSet.close(); //关闭ResultSet接口实例
}
if( statement!=null )
{
statement.close(); //关闭Statement接口实例
}
if( connection!=null )
{
connection.close(); //关闭Connection接口实例
}
}
catch( SQLException se )
{
System.out.println( se );
}
}
}
public static void main( String[] arg )
{
GetSQLServerType g=new GetSQLServerType();
}
}
/*******************************************************************************
*
* 使用 net view /domain 得到工作l列?br /> *
* 使用 net view /domain:workgroup 得到指定工作l的机器列表
*
* Author: NeedJava
*
* Modified: 2006.09.11
*
* Version: 1.0
*
******************************************************************************/
public class Neighborhood
{
private static String getNeighborhood( String command, String domain )
{
String line="";
boolean begin=false;
StringBuffer sb=new StringBuffer();
try{ Process process=Runtime.getRuntime().exec( command );
BufferedReader br=new BufferedReader( new InputStreamReader( process.getInputStream() ) );
while( ( line=br.readLine() )!=null )
{
line=line.trim();
//你的工作l千万不要命名ؓ“命令成功完成。”或者是“The command completed successfully.?br /> if( line.endsWith( "命o成功完成? )||line.equalsIgnoreCase( "The command completed successfully." ) )
{
begin=false;
break;
}
if( begin )
{
if( domain.length()>0 )
{
sb.append( " " ).append( line ).append( "\r\n" );
//System.out.println( "得到 "+line );
}
else{ sb.append( line ).append( "\r\n" );
//System.out.println( "得到 "+line );
sb.append( getNeighborhood( "net view /domain:"+line, line ) );
}
}
if( line.endsWith( "-" ) )
{
begin=true;
}
}
br.close();
process.waitFor();
}
catch( IOException ioe )
{
System.out.println( ioe );
}
catch( Exception e )
{
System.out.println( e );
}
return sb.toString();
}
public static void main( String[] args )
{
System.out.println( Neighborhood.getNeighborhood( "net view /domain", "" ) );
}
}