读书人

求好手点拨一个“打开网址”的Java功能

发布时间: 2014-01-14 23:14:00 作者: rapoo

求高手点拨一个“打开网址”的Java功能源代码的“一个功能调用打开两个页面”的原因...
高手,您好:
我在写一个Java程序,其中用到了“打开URL地址”的功能,我调用了下面的“打开网址”的类型:

package c_port_packageBJUser;
/////////////////////////////////////////////////////////
//Bare Bones Browser Launch //
//Version 1.5 (December 10, 2005) //
//By Dem Pilafian //
//支持: Mac OS X, GNU/Linux, Unix, Windows XP//
//可免费使用 //
/////////////////////////////////////////////////////////

/**
* @author Dem Pilafian
* @author John Kristian
*/
import java.lang.reflect.Method;

public class BareBonesBrowserLaunch {

public static void openURL(String url) {
try {
browse(url);
} catch (Exception e) {
}
}

private static void browse(String url) throws Exception {
//获取操作系统的名字
String osName = System.getProperty("os.name", "");
if (osName.startsWith("Mac OS")) {
//苹果的打开方式
Class fileMgr = Class.forName("com.apple.eio.FileManager");
Method openURL = fileMgr.getDeclaredMethod("openURL", new Class[] { String.class });
openURL.invoke(null, new Object[] { url });
} else if (osName.startsWith("Windows")) {
//windows的打开方式。
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);
} else {
// Unix or Linux的打开方式
String[] browsers = { "firefox", "opera", "konqueror", "epiphany", "mozilla", "netscape" };
String browser = null;
for (int count = 0; count < browsers.length && browser == null; count++)
//执行代码,在brower有值后跳出,
//这里是如果进程创建成功了,==0是表示正常结束。
if (Runtime.getRuntime().exec(new String[] { "which", browsers[count] }).waitFor() == 0)
browser = browsers[count];
if (browser == null)
throw new Exception("Could not find web browser");
else
//这个值在上面已经成功的得到了一个进程。


Runtime.getRuntime().exec(new String[] { browser, url });
}
}
}


弟我调用上述类型的代码现场如下:
package c_port_packageBJUser;

import java.awt.Dialog;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;


//创建ChatClient类作为聊天窗口;
public class Complete_ChatForeUIUserClient extends JFrame implements WindowListener,KeyListener,ItemListener, ActionListener
{
int lennum = 0;
private static final long serialVersionUID = 1L;
static Integer ChatPartnerSerialMark = 200;
Integer ChatFriNum = 200;
JScrollPane jspanel0 = null;
JScrollPane jspanel1 = null;
static DataOutputStream dops3 = null;
JPanel jp = new JPanel();
static DataInputStream dips3 = null;
boolean started = false;
InetAddress addr = null;
String title = "获取好友资料";
String chatword = null;
Dialog ordernum = new Dialog(this,title,started);
String str;
int T =0;
public static String UIDLocal = null;
static String roleLocal = null;
static String iPAddressLocal = null;
String Local_User_facia = null;
Integer MyLocalSysNum = -1;
static String MyChatObjrolE = null;
JPanel jp1 = new JPanel();
JTextArea Jta2 = new JTextArea();
String UserFuct = null;
JTextArea Jta1 = new JTextArea();
String[] s = {"查看好友信誉","输入用户编号获取用户资料","截图","发送文件","接收文件","投诉好友","音频通信","视频通信","查看好友详细","打开好友列表","打开聊天记录","获取客户所在地IP","转存本用户聊天记录"};
JComboBox<String> combo1 = null;
MyJButtonPayformyfuct jb1 = null;
OutputStream outputstream = null;

//CaptureScreen capScreen = new CaptureScreen();

public Complete_ChatForeUIUserClient(String UID,Integer MySysPriNum,String User_facia,Integer ChatObjectNum,String ChatObjrolE,String MyIP){
System.out.println("C端Complete_ChatForeUIUserClient");
this.setBounds(new Rectangle(419,92,590,550));
UIDLocal = UID;
MyLocalSysNum = MySysPriNum;
roleLocal = "User";
str = User_facia;
this.setTitle(str);
ChatPartnerSerialMark = ChatObjectNum;
MyChatObjrolE = ChatObjrolE;
iPAddressLocal = MyIP;
combo1 = new JComboBox<String>(s);
jb1 = new MyJButtonPayformyfuct("购买服务",String.valueOf(ChatObjectNum),ChatObjrolE,this);
//TODO:
Jta2.addKeyListener(this);
combo1.addItemListener(this);
Jta1.setLineWrap(true); //如果加上这一句,那么水平方向的滚动条永远不会出现。
Jta1.setEditable(false);
combo1.setBounds(new Rectangle(28,240,200,20));
jspanel0=new JScrollPane(Jta1);
jspanel1 = new JScrollPane(Jta2);
jspanel0.setBounds (new Rectangle (10,10,500,220));
jspanel1.setBounds (new Rectangle (10,280,500,220));
jspanel0.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
jspanel0.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
jspanel1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
jspanel1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
jp1.setLayout(null);
Jta1.setLineWrap(true);//激活自动换行功能
Jta2.setLineWrap(true);
Jta2.setWrapStyleWord(true);//激活断行不断字功能
Jta1.setWrapStyleWord(true);//激活断行不断字功能
jb1.setBounds(new Rectangle(353,240,100,20));
jb1.addActionListener(this);
jp1.setBounds(new Rectangle(10,10,590,550));
jp1.add(jb1);
jp1.add(combo1);
jp1.add(jspanel0);
jp1.add(jspanel1);
setVisible(true);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);


}

public void start() {
this.add(jspanel0);
this.add(jspanel1);
this.add(jp1);
jp1.setVisible(true);
this.setVisible(true);
}

@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub


}

@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub

SocketClient so2 = new SocketClient(Recv.D_PORT_SERVER,9999);
synchronized(so2){
so2.writeStr("1818"+"User"+""+RelayNo1.LocalMyWorkNum+""+"User"+""+RelayNo1.LocalMyWorkNum+""+ChatPartnerSerialMark+""+"User"+""+"BeiJing"+""+"C"+""+"BeiJing","Complete_ChatForeUIUserClient");
so2.getMyResourceBack();
}
}

@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
SocketClient so3 = new SocketClient(Recv.S_PORT_SERVER,8811);
String content = "8IcloseOneFrameCUser"+NoteUserLoginFrame.MyworkNum;
so3.writeStr(content, "Complete_ChatForeUIUserClient");
so3.getMyResourceBack();
}

@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}

@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub

}

public static void main(String[] args){
new Complete_ChatForeUIUserClient("测试账户0",0,"CJCO!!加油!!",2,"User","222.196.1.8").start();

}


@Override
public void windowOpened(WindowEvent e)
{
// TODO Auto-generated method stub

}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub

}

@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
if(e.isControlDown()&&e.getKeyCode()==KeyEvent.VK_ENTER){
String Chatword = Jta2.getText().trim();
Jta1.append(Chatword+"\r\n");
Jta1.setCaretPosition(Jta1.getText().length());
Jta2.setCaretPosition(Jta2.getText().length());
Jta2.setText("");
Integer MySysserNum = Integer.parseInt("1");
String str = "1"+MySysserNum+""+"User"+""+ChatPartnerSerialMark+""+MyChatObjrolE+""+iPAddressLocal+""+GetTheSysData.getTheLocalData()+"`"+Chatword+""+"C"+""+"User"+MySysserNum;
SocketClient so3 = new SocketClient(Recv.S_PORT_SERVER,8811);
synchronized(so3){
so3.writeStr(str,"Complete_ChatForeUIUserClient");
}
so3.getMyResourceBack();
}

}

@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}

@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub

}

@Override
public void itemStateChanged(ItemEvent e) {
// TODO Auto-generated method stub
UserFuct = (String)combo1.getSelectedItem();
if(UserFuct.equals("输入用户编号获取用户资料")){
new Code_Customer_OrderNum();
}else if(UserFuct.equals("查看好友信誉")){
String url = "www.baidu.com";
BareBonesBrowserLaunch.openURL(url);
}
}

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}

}


高手,弟我在进行了上述的代码第209行代码的BareBonesBrowserLaunch类的openURL()方法的调用后,得到的效果为:
打开了两个百度的首页.
希望高手能够指导:
为什么?
怎样修改...?
希望得到高手的相助!!
一百分奉上!!

[解决办法]
不应该吧。代码应该只是打开了一次。
有没有这种可能:
你的浏览器默认首页是baidu.com。然后你的代码是打开baidu.com
所以代码运行后就看到两个baidu.com了
[解决办法]
itemStateChanged 方法会调用两次,分别是ItemEvent.SELECTED和ItemEvent.DESELECTED。
而且即使选项框没动,也会被调用事件,所以加判断。
 if(e.getStateChange() == ItemEvent.SELECTED)
就不会执行两次了。

读书人网 >J2SE开发

热点推荐