2005年11月30日
#
自己实在是个懒人,blog难得更新一次,更新也是一些鸡毛蒜皮的小东西。不过还是希望能对其他朋友或自己将来遇到类似问题能有个解答。最新在做一个swing项目,客户要求能把JInternalFrame的Title bar去掉,同时还能加回来。由于网上搜一下没有找到解决办法,只能自己研究一下并改了下JInternalFrame,先记录如下:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.event.ComponentEvent;
import java.awt.peer.ComponentPeer;
import java.beans.PropertyVetoException;
import javax.swing.ActionMap;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.UIManager;
import javax.swing.plaf.InternalFrameUI;
import javax.swing.plaf.basic.BasicInternalFrameUI;
public class MCOCInternalFrame extends JInternalFrame {
//private String lookAndFeel = null;
BasicInternalFrameUI orgUi = null;
BasicInternalFrameUI newUi = null;
JComponent northPanel = null;
private boolean isHidden = false;
public MCOCInternalFrame() {
super();
northPanel = ((javax.swing.plaf.basic.BasicInternalFrameUI) this.getUI()).getNorthPane();
orgUi = ((javax.swing.plaf.basic.BasicInternalFrameUI) this.getUI());
newUi = new BasicInternalFrameUI(this);
}
public void showNorthPanel() {
this.setUI(orgUi);
this.putClientProperty("JInternalFrame.isPalette", Boolean.FALSE);
isHidden = false;
}
public void hideNorthPanel() {
this.setUI(newUi);
((javax.swing.plaf.basic.BasicInternalFrameUI) this.getUI()).setNorthPane(null);
this.putClientProperty("JInternalFrame.isPalette", Boolean.TRUE);
isHidden = true;
}
public void updateUI() {
super.updateUI();
if (isHidden) {
hideNorthPanel();
}
}
}
创建该InternalFrame对象后,通过showNorthPanel(), hideNorthPanel()来显示或隐藏title bar,另外updateUI()重写是因为界面被动态改变lookandfeel时,保证title bar上多的一小个bar出现。
MailSender.java
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.apache.log4j.Logger;
public class MailSender {
public static Logger logger = Logger.getLogger(MailSender.class);
public static boolean send(Mail mail) throws Exception {
try {
Properties props = new Properties();
props.put("mail.smtp.host", "localhost");
Session session = Session.getDefaultInstance(props, null);
MimeMessage mimemessage = new MimeMessage(session);
mimemessage.setFrom(new InternetAddress(mail.getFrom()));
mimemessage.setSentDate(mail.getDate());
// set SUBJECT
mimemessage.setSubject(mail.getSubject());
// set TO address
String mailto = mail.getTo();
String ccmailid = mail.getCcusers();
String strResult = "";
try {
mimemessage.setRecipients(javax.mail.Message.RecipientType.TO,
mailto);
} catch (Exception exception1) {
throw exception1;
}
// set message BODY
MimeBodyPart mimebodypart = new MimeBodyPart();
mimebodypart.setText(mail.getContent());
// attach message BODY
MimeMultipart mimemultipart = new MimeMultipart();
mimemultipart.addBodyPart(mimebodypart);
// attach FILE
ArrayList attachedFileList = mail.getAttachedFileList();
if (attachedFileList != null) {
DataSource ds = null;;
for (Iterator e = attachedFileList.iterator(); e.hasNext();) {
ds = (DataSource) e.next();
mimebodypart = new MimeBodyPart();
try {
mimebodypart.setDataHandler(new DataHandler(
ds));
} catch (Exception exception3) {
throw exception3;
}
mimebodypart.setFileName(ds.getName()); // set FILENAME
mimemultipart.addBodyPart(mimebodypart);
}
}// end if
mimemessage.setContent(mimemultipart);
// set CC MAIL and SEND the mail
if (!mailto.equals("")) {
// set CC MAIL
if (ccmailid != null && (!ccmailid.equals("")))
mimemessage.setRecipients(
javax.mail.Message.RecipientType.CC, ccmailid);
try {
// send MAIL
Transport.send(mimemessage);
logger.info(mailto + " Sent Successfully..........");
} catch (Exception exception4) {
throw exception4;
}
} else {
logger.info(mailto + " Mail operation Failed..........");
}
} catch (Exception e) {
throw e;
}
return true;
}
}
Mail.java
import java.util.ArrayList;
import java.util.Date;
import java.util.StringTokenizer;
public class Mail {
private String from = null;
private String to = null;
private String subject = null;
private String content = null;
private String ccusers = null;
private ArrayList attachedFileList = null;
private Date date = null;
public Mail() {
// TODO Auto-generated constructor stub
}
public ArrayList getAttachedFileList() {
return attachedFileList;
}
public void setAttachedFileList(ArrayList attachedFileList) {
this.attachedFileList = attachedFileList;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getCcusers() {
return ccusers;
}
public void setCcusers(String ccusers) {
this.ccusers = ccusers;
}
}
很长时间没有更新自己的blog了,最近忙一个基于alfreco的项目开发,赶快把用到的一些东西记录一下,谁让自己记性不好呢。这里是password的加解密:
PasswordUtil.java
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class PasswordUtil {
public final static int ITERATION_NUMBER = 1000;
public static final String algorithm = "Blowfish";// we can use DES,DESede,Blowfish
/**
*
* @param password
* @return
* @throws Exception
*/
public static PasswordBean encry(String password) throws Exception {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
try {
KeyGenerator keygen = KeyGenerator.getInstance(algorithm);
SecretKey deskey = keygen.generateKey();
Cipher c1 = Cipher.getInstance(algorithm);
c1.init(Cipher.ENCRYPT_MODE, deskey);
byte[] cipherByte = c1.doFinal(password.getBytes());
String saltKey = PasswordUtil.byteToBase64(deskey.getEncoded());
String pass = PasswordUtil.byteToBase64(cipherByte);
return new PasswordBean(saltKey, pass);
//System.out.println("After encry:" + key + "====" + password);
} catch (Exception e) {
throw e;
}
}
/**
*
* @param bean
* @return
* @throws Exception
*/
public static String decry(PasswordBean bean) throws Exception {
return decry(bean.getSaltKey(), bean.getPassword());
}
/**
*
* @param saltKey
* @param pass
* @return
* @throws Exception
*/
public static String decry(String saltKey, String pass) throws Exception {
//Security.addProvider(new com.sun.crypto.provider.SunJCE());
try {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
byte[] keyser = PasswordUtil.base64ToByte(saltKey);
javax.crypto.spec.SecretKeySpec destmp = new javax.crypto.spec.SecretKeySpec(keyser, algorithm);
SecretKey mydeskey = destmp;
Cipher c1 = Cipher.getInstance(algorithm);
c1.init(Cipher.DECRYPT_MODE, mydeskey);
byte[] clearByte = c1.doFinal(PasswordUtil.base64ToByte(pass));
return new String(clearByte);
} catch (Exception e) {
//e.printStackTrace();
System.out.println("saltKey:" + saltKey + " pass:" + pass) ;
throw e;
}
}
/**
* From a password, a number of iterations and a salt, returns the
* corresponding digest
*
* @param iterationNb
* int The number of iterations of the algorithm
* @param password
* String The password to encrypt
* @param salt
* byte[] The salt
* @return byte[] The digested password
* @throws NoSuchAlgorithmException
* If the algorithm doesn't exist
*/
public static byte[] getHash(int iterationNb, String password, byte[] salt)
throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.reset();
digest.update(salt);
byte[] input = digest.digest(password.getBytes());
for (int i = 0; i < iterationNb; i++) {
digest.reset();
input = digest.digest(input);
}
return input;
}
/**
* From a base 64 representation, returns the corresponding byte[]
*
* @param data
* String The base64 representation
* @return byte[]
* @throws IOException
*/
public static byte[] base64ToByte(String data) throws IOException {
BASE64Decoder decoder = new BASE64Decoder();
return decoder.decodeBuffer(data);
}
/**
* From a byte[] returns a base 64 representation
*
* @param data
* byte[]
* @return String
* @throws IOException
*/
public static String byteToBase64(byte[] data) {
BASE64Encoder endecoder = new BASE64Encoder();
return endecoder.encode(data);
}
}
PasswordBean.java
public class PasswordBean {
private String saltKey = null;
private String password = null;
public PasswordBean(String key, String pass) {
this.saltKey = key;
this.password = pass;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSaltKey() {
return saltKey;
}
public void setSaltKey(String saltKey) {
this.saltKey = saltKey;
}
}
使用的时候可以是:
String password = PasswordUtil.decry(salt, encodePassword);
PasswordBean passwordBean = PasswordUtil.encry(password);
常用到System.getProperty(), 而参数老不记得,这里贴一下,省得下次麻烦.
java.version | Java Runtime Environment version |
java.vendor | Java Runtime Environment vendor |
java.vendor.url | Java vendor URL |
java.home | Java installation directory |
java.vm.specification.version | Java Virtual Machine specification version |
java.vm.specification.vendor | Java Virtual Machine specification vendor |
java.vm.specification.name | Java Virtual Machine specification name |
java.vm.version | Java Virtual Machine implementation version |
java.vm.vendor | Java Virtual Machine implementation vendor |
java.vm.name | Java Virtual Machine implementation name |
java.specification.version | Java Runtime Environment specification version |
java.specification.vendor | Java Runtime Environment specification vendor |
java.specification.name | Java Runtime Environment specification name |
java.class.version | Java class format version number |
java.class.path | Java class path |
java.library.path | List of paths to search when loading libraries |
java.io.tmpdir | Default temp file path |
java.compiler | Name of JIT compiler to use |
java.ext.dirs | Path of extension directory or directories |
os.name | Operating system name |
os.arch | Operating system architecture |
os.version | Operating system version |
file.separator | File separator ("/" on UNIX) |
path.separator | Path separator (":" on UNIX) |
line.separator | Line separator ("\n" on UNIX) |
user.name | User's account name |
user.home | User's home directory |
user.dir | User's current working directory |
说实话,一直不想在这里写一些不是关于技术方面的东西.但是今天,我实在想写一点什么:今天舒马赫宣布退役了!
令我自己也想不通,为什么是今天.而不是米卡.哈基宁退出F1的那一天,也不是Montoya退出的那一天.因为我一直是他们两个的车迷!自98年开始看F1以来,一直是一个不向着舒马赫的车迷(倒和维纶纽夫差不多,不过我可没那本事和舒米对着干!呵呵).
刚开始,一直喜欢哈基宁,因为只有他才能从舒马赫手中夺取年度冠军,而且不止一次!但是随着Ferrari的强盛一时,麦克拉伦没落了,我心中的英雄也暗然退去.然后,激情四射的哥伦比亚人Montoya来了,他也一度给舒米制造了不少麻烦,而且看他开车我也会充满激情.而且最喜欢他跑今天的蒙扎赛道.在Williams时就在蒙扎取的过冠军,去年也是,可是今年呢?昔日的蒙扎英雄何在?
哈基宁的退出令人伤心,长期的压抑作为他的车迷也可以感受到他的心情.Montoya的退出实在是太突然了,突然的我都不会说话了.
今天舒米也退了,作为车迷还是很伤心,毕竟我的偶像们都曾是他的手下败将!他的技术却实高人一等,虽然不少时候他也做法卑鄙,毕竟是人嘛!也可以理解.
所以今天写点胡话,纪念一下舒米,同时也为追忆(当然不恰当的说法拉)一下我的两位偶像!
数据库方面一直喜欢用postgresql,最近重装了debian.安装的时候发现可以用apt-get
方法安装postgresql了,就安装了一个.结果装完发现居然没有启动,仔细一看初始化也没做,debian这一点做的有点不应该阿!!于是自己重新
做了一下.现在记下来,不要下次忘了.HOHO!记性不好.
用postgres登录,切换到目录/usr/lib/postgresql/8.1/bin(是系统安装的目录,居然没有设置成Path汗).运行./
initdb -D /usr/local/pgsql/data(当然,后面的目录也没有,自己建先),成功运行以后就可以启动了. ./postmaster -D /usr/local/pgsql/data
不知道debian安装默认允许非本机用户登录伐,我先看看...
在网上可以看到很多判断判断url是否合法的regular expressions.但是经常是要么缺少protocol,要么缺少port的判断,这里自己写一个:
public static boolean isValidURL(String value) {
Pattern pattern = Pattern.compile("(.*://)?([\\w-]+\\.)+[\\w-]+(:\\d+)?(/[^/.]*)*(/[^/]+\\.[^/\\?]+)(\\?&*([^&=]+=[^&=]*)&*(&[^&=]+=[^&=]*)*&*)");
Matcher m = pattern.matcher(value);
if (m.matches())
return true;
return false;
}
判断url中data是否符合规则:
&*([^&=]+=[^&=]*)&*(&[^&=]+=[^&=]*)*&*
在RCP程序中最小化窗口到系统托盘并不像SWT程序那样直接。在网上找了一段代码,自己试验通过了,现在贴出来大家分享。
在RCP中继承WorkbenchAdvisor的子类中添加下面代码就可以了。
public void postStartup() {
super.postStartup();
final Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
shell.addShellListener(new ShellAdapter() {
public void shellIconified(ShellEvent e) {
shell.setVisible(false);
}
});
createSystemTray();
}
private void createSystemTray() {
Tray tray = Display.getDefault().getSystemTray();
TrayItem item = new TrayItem(tray, SWT.NONE);
item.setText("JDishNetwork");
item.setToolTipText("JDishNetwork");
Image image = new Image(Display.getDefault(), 16, 16);
item.setImage(image);
this.trayManager = new TrayItemManager();
item.addSelectionListener(this.trayManager);
item.addListener(SWT.MenuDetect, this.trayManager);
}
private class TrayItemManager implements SelectionListener, Listener {
// TODO: Convert to one class
private final class WindowStateListener extends SelectionAdapter {
public void widgetSelected(SelectionEvent e) {
minimizeWindow();
}
}
private final class RestoreWindowListener extends SelectionAdapter {
public void widgetSelected(SelectionEvent e) {
restoreWindow();
}
}
private boolean minimized = false;
private Menu menu;
private MenuItem[] menuItems = new MenuItem[0];
private RestoreWindowListener restoreWindowListener;
private WindowStateListener minimizeWindowListener;
public TrayItemManager() {
this.menu = new Menu(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.POP_UP);
this.restoreWindowListener = new RestoreWindowListener();
this.minimizeWindowListener = new WindowStateListener();
}
protected void closeApplication() {
PlatformUI.getWorkbench().close();
}
public void widgetSelected(SelectionEvent e) {
//
}
public void widgetDefaultSelected(SelectionEvent e) {
if (this.minimized) {
restoreWindow();
} else {
minimizeWindow();
}
}
protected void minimizeWindow() {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell().setMinimized(true);
this.minimized = true;
}
protected void restoreWindow() {
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
shell.open();
shell.setMinimized(false);
shell.forceActive();
shell.forceFocus();
this.minimized = false;
}
public void showMenu() {
clearItems();
MenuItem mi;
MenuItem closeItem;
mi = new MenuItem(this.menu, SWT.PUSH);
closeItem = new MenuItem(this.menu, SWT.NONE);
closeItem.setText("Close");
closeItem.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
closeApplication();
}
});
this.menuItems = new MenuItem[] { mi, closeItem };
if (this.minimized) {
mi.setText("Maximize");
mi.addSelectionListener(this.restoreWindowListener);
} else {
mi.setText("Minimize");
mi.addSelectionListener(this.minimizeWindowListener);
}
this.menu.setVisible(true);
}
private void clearItems() {
for (int i = 0; i < this.menuItems.length; i++) {
MenuItem item = this.menuItems[i];
item.removeSelectionListener(this.minimizeWindowListener);
item.removeSelectionListener(this.restoreWindowListener);
this.menuItems[i].dispose();
}
}
public void handleEvent(Event event) {
showMenu();
}
}
deb http://ftp.hk.debian.org/debian/ sid main
deb http://ftp.hk.debian.org/debian/ experimental main
#deb http://pkg-gnome.alioth.debian.org/debian/ experimental main
deb http://security.debian.org/ testing/updates main
#deb http://ftp.debian.org/debian/ testing main
摘要: 在swt提供的browser 类中间,缺少不少有用的方法。我在使用时用到两个,getText()和setUrl(String url, String post_data),分别取得当前打开页面的原代码和采用post方式打开页面。现在修改Browser类如下:/**********************************************************************...
阅读全文