日期:2014-05-20 浏览次数:20909 次
private void runOnce() {
String s = "eclipse.exe ";
try {
java.io.BufferedReader id = new java.io.BufferedReader(new java.io.
FileReader(ID_FILENAME));
String ss = id.readLine();
if (ss != null)
s = ss;
id.close();
}
catch (Exception e) {
//System.out.println(e);
}
try {
int i = 0;
java.lang.Process p = java.lang.Runtime.getRuntime().exec( "Tlist -s ");
InputStream[] inStreams =
new InputStream[] {
h.getInputStream(), h.getErrorStream()};
ConsoleTextArea cta = new
ConsoleTextArea(inStreams);
System.out.println(cta.toString());
java.io.BufferedReader in = new java.io.BufferedReader(new java.io.
InputStreamReader(p.getInputStream()));
String ss = " ";
while ( (ss = in.readLine()) != null) {
if (ss.indexOf(s) != -1) {
i++;
}
}
in.close();
if (i > 1) {
javax.swing.JOptionPane.showMessageDialog(this, "程序已经运行! ");
//这里可以写打开eclipse,通过进程调用start()应该就可以了
}
}
catch (Exception e) {
javax.swing.JOptionPane.showMessageDialog(this, "未找到Tlist程序或I/O错误! ");
}
}
------解决方案--------------------
避免重复启动,Java解决此类问题有两种通用做法:
1、启动后用写方式来锁定一个文件,这样第二次启动时因为无法锁定该文件所以就知道已经是重复启动了;
2、启动后监听一个约定的端口,同样第二个启动的程序就无法监听该端口了。
考虑到你还需要“将已经运行的改程序弹出至最前面”,所以建议你用方案二。
程序启动后:
1、尝试监听127.0.0.1的某端口,比如: 12345
2、如果监听失败,则向该端口发送“BringToTop”消息,退出;
3、如果监听成功,启动一个线程负责监听该端口,如果接收到BringToTop消息,则将激活窗口焦点。
------解决方案--------------------
http://goro.iteye.com/blog/812732
呵呵,希望对lz有帮助。
------解决方案--------------------
swing hacks里有这个技巧
------解决方案--------------------
楼主,利用中午睡觉时间整理了下,供你参考了:
http://blog.csdn.net/ldh911/article/details/8024629