swing多线程编程归纳

Swing本身的界面绘制单线程的。也就是只有一个事件分派线程负责处理事件处理方法,保证了Swing本身的线程安全。但是如果存在一个很复杂耗时的任务,这样的处理方法就会造成界面的无响应甚至crash。所以Swing提供了SwingUtilities类的两个方法:invokeLater/invokeAndWait。
invokeLater:异步提交执行代码给事件派发线程,代码立即返回,不会等待代码执行完毕。
invokeAndWait:同步提交执行代码给事件派发线程,等到代码执行完再返回
(SWT中也有类似的机制对应的是:asyncExec和syncExec)

SwingWorker类用来实现后台线程操作,和上面的不同,SwingWorker在创建时会使用一个独立的线程(而不是在事件派发线程)执行相应的代码,然后可以通过get()方法获得执行结果。如果启动worker后马上要求结果的话,Swing同样会阻塞直到得到处理结果为止。

参考:
Swing单线程开发引起的问题
编写多线程Java应用程序常见问题
线程与Swing(英文)
SWT中处理多线程

Swing和SWT的Calendar组件

推荐swing上的calendar组件 – toedter

推荐swt上的calendar组件 – swtcalendar

Thinlet 二三事

XUL – xml user interface language, mozilla推出的,firefox就是基于此. flex,zk都是这个意思
http://www.mozilla.org/projects/xul/

Thinlet – 开源XUL引擎,通过XUL分离业务逻辑和界面,基于AWT
ThinG – 用来编写thinklet的XUL的工具,thing.sourceforge.net.通过ThinG配合thinlet使用可以很快速方便的开发awt界面.Theodore – 同上,但是是收费的
genesis – 开发框架,用于企业应用开发的,但是没有体会到有多好,测试sample里的thinlet时AspectWerkz出错,保持关注
swiXML – 类似thinlet但是是用于swing的
jdnc – Sun力推的XUL解决方案,没看出有什么动向,保持关注

MoBarbr – 记账

这个是前一阵子有空的时候用swing写的一个简单的记账软件。很简单的功能,无非就是记账,添加顾客,充值,修改,报表。用Spring来管理swing ui组件之间的依赖,发现也很方便,而且看起来更清晰,不像以前那种panel,frame,dialog的引用传来传去。本来还准备用thinlet重写一遍,后来因为thinlet只支持awt而没做。同时还试了一些方法来发布这个桌面应用,见Java桌面应用程序发布 截图: 下载 源代码

如何实现改变JTable中的曾选中过的cell的背景

 

2006/5/14

扩展一个JTable,增加一个List记录每次点击选择的cell,将其index记录.然后用一个Renderer,如果cell被选择过,则修改背景颜色为红色.使用时候先实例化一个MyTable,在setCellRenderer.

public class MyTable extends JTable {

private ArrayList selected;

public MyTable() {
super();
selected = new ArrayList();

}
//将选中的cell列,行数记录
public void addSelected(Point p){
if(selected.contains(p)){
selected.remove(p);
}else{
selected.add(p);
}
}

//某个cell是否被记录过

public boolean hasSelected(int row, int column) {
return selected.contains(new Point(row,column));
}

}
实现一个renderer,当cell的index在记录历史中,则修改其背景

public class MyRenderer extends DefaultTableCellRenderer{
public MyRenderer(){
super();
setHorizontalAlignment(SwingConstants.CENTER);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
MyTable mt = (MyTable)table;
if(isSelected){
mt.addSelected(new Point(row,column));
}
if(mt.hasSelected(row,column)){
this.setBackground(Color.RED);
}else{
this.setBackground(Color.WHITE);
}
return this;
}
}

alloy破解[转贴]

alloy的许可证分成四个部分,每个部分之间用#号分隔,第一部分是许可证过期时间,第二部分是用户名,第三和第四部分是两个36进制的整数,其中第三部分是校验码,第四部分是一个随机数(我是这么认为的,第四部分写死成一个常量也没有什么关系)。
好了,了解了许可证的构造之后,我们来了解一下alloy检验许可证是否合法和过期的过程。
一:分离许可证的各个部分。
二:判断日期部分的长度,如果长度大于1,就构造一个过期时间,否则过期时间为null。(这下子我们就可以通过使日期部分的长度不超过1来让alloy永不过期了^-^)。
三:调用Long.parseLong(String, int)方法解析出第三和第四部分两个36进制整数的10进制的值。
四:使用java.util.zip.CRC32来计算校验值,计算的过程是把从第四部分得到的10进值整数对127取模,然后加上第一、二两个部分(包括中间的#号),这样就构造出一个字符串,然后调用CRC32.update()方法计算这个字符串的校验值。
五:使用getValue()方法从CRC32中取得校验值,然后将这个校验值与从第三部分获得的10进制数值比较,如果相等,则校验成功。随后就是判断当前日期是否过期的操作了。
这大致就是alloy验证许可证的过程,我们反过来做一遍,就可以得到我们自己的许可证了。下面就是我写的构造许可证的方法,供大家参考。

public String generate(String user)
{
String exp = “x”;
String rand = “torresg”;
long l = Long.parseLong(rand, 36);
CRC32 crc32 = new CRC32();
crc32.update((l % 127L + exp + “#” + user).getBytes());
String checksum = Long.toString(crc32.getValue(), 36);
return exp + “#” + user + “#” + checksum + “#” + rand;
}

另外就是过期时间不能为空,因为alloy中另外某个地方要对这个时间进行处理。为空的话也会验证失败。所以过期时间要使用一个长度为1的字符串。

com.incors.plaf.alloy.AlloyLookAndFeel.setProperty(“alloy.licenseCode”,
“v#ej_technologies#uwbjzx#e6pck8”);
try {
javax.swing.LookAndFeel alloyLnF = new com.incors.plaf.alloy.AlloyLookAndFeel (); javax.swing.UIManager.setLookAndFeel(alloyLnF);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
// You may handle the exception here
ex.printStackTrace();
}