Tag Archives: java

JGraph中的deselect状态判断

JGraph是基于Java swing、Java 2D开发的纯Java图形库,很像Eclipse的EMF、JMF,可以很方便地帮助开发人员在Swing框架中实现组件的呈现、布局、拖拽、group等图形化操作。JGraph也是基于MVC模式实现,将整个框架分为cell(M层)、cell view(C层)和renderer(V层)。有一些设计思想很有趣,比如它的GraphConstants,将所有属性存在传入的map里,通过方法签名实现属性的意义化和类型限制,很有趣的思想 下面进入正题,如何判断一个cell view被deselect。JGraph现在已半商业化,文档很稀少,JavaDoc更是不堪入目,最好的研究方法还是读源代码,比如前两天为了正确设置cell view的虚线边框颜色就看了一晚上源代码 JGraph的事件监听写得很诡异,在cell view中需要通过以下方法添加监听器: class MyCellView extends VertexView {     public CellHandle getHandle(GraphContext context) {         return new CellHandle(){             void paint(Graphics g);               void overlay(Graphics g);               void read more »

小心Derby的ResultSet陷阱

Derby作为一个纯Java实现的嵌入式DB一直很受Java社区的欢迎,在我们的项目中也用到了。但昨天晚上遇到的一个问题让我对Derby相当失望——Derby实现的ResultSet会将列名中的表名抹掉 具体代码: SQL: SELECT staff.staffid FROM staff WHERE … JDBC: ResultSet rs = stmt.executeQuery(…); if(rs.next()){     String id = rs.getString("staff.id"); } ResultSet rs = stmt.executeQuery(…); if(rs.next()){ String id = rs.getString(“staff.id”); } 运行时抛出异常: Caused by: java.sql.SQLException: 列“staff.staffid”未找到。     at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)     at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)     at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)     at read more »

如何使用反射调用静态方法

其实很简单,真的,将invoke(Object o, Object… params)的第一个参数传入null即可

如何cancel一个swingworker

最近在项目里一直在用jdesktop的swingworker(已经合入JDK 6),是个不错的swing线程库。今天需要在界面里cancel一个swingworker。研究了一下午,结合swingworker的文档、源代码和自己的代码实验,以下是两种安全cancel一个swingworker的方法 方法一,使用isCancelled: protected Object doInBackground() throws Exception {     while (!isCancelled()) {        …     }       return null; } protected Object doInBackground() throws Exception { while (!isCancelled()) { … } return null; } 需要cencel时调用swingworker.cancel(false),不中断线程,只置cancel标记。 方法二,使用sleep: protected Object doInBackground() throws Exception {     while (running) {   read more »

JScrollBar的unitIncrement和blockIncrement

这两天在写swing的时候遇到一个问题,JScrollPane在相应鼠标滚轮的时候很慢,滚了一大段才移了一点点,给人的感觉就是鼠标很“硬”。刚才查了一下javadoc,看到JScrollbar有个方法:setUnitIncrement(int) 和 setBlockIncrement(int)。前一个是设置点击上下箭头的移动距离(也包括滚轮滚动),后一个是单击滚动条上空白处的移动距离,单位为像素。输出了一下unitIncrement的默认值,竟然是1 -_-|||。手动设为10,感觉鼠标终于灵活了……具体代码: jScrollPane.getVerticalScrollBar().setUnitIncrement(10); jScrollPane.getVerticalScrollBar().setUnitIncrement(10); 如果遇到和我相同问题的可以用上面的方法试一下。有点不爽的就是没有一个类似UIManager的全局变量可以设置,只能在各个JScrollBar上单独设置,有点麻烦。

如何在Java的enum中使用annotation

刚才在写一个方法的时候试图在enum上使用annotation: public enum DataKey {     @Incremental     @FromProbe     @Transient(replacePolicy = ReplacePlolicy.REPLACE_IF_LATER_THAN)     VISIT_COUNT } public enum DataKey { @Incremental @FromProbe @Transient(replacePolicy = ReplacePlolicy.REPLACE_IF_LATER_THAN) VISIT_COUNT } 然后在merge的时候使用annotation: if (key.getClass().isAnnotationPresent(Transient.class)) {     … } if (key.getClass().isAnnotationPresent(Transient.class)) { … } 结果不进if,debug时发现key(DataKey的对象)的类型是DataKey(其实也挺顺理成章的),于是使用如下代码: if (DataKey.class.getField(key.name()).isAnnotationPresent(Transient.class)) {     … } if (DataKey.class.getField(key.name()).isAnnotationPresent(Transient.class)) { read more »

Deskzilla Cracked

最近破解上瘾了,昨天干到3点多,今天又花了一中午把deskzilla,一个bugzilla的桌面客户端)破解了。 这次破解花了很长时间,一是因为代码编译后被混淆了,找关键代码的时候着实花了不少时间。另一方面这个软件的license验证不是使用常见的布尔判断,而是用异常。这意味着必须仔细研究方法的调用栈,于是这次用了一个比较偷巧的方法:在代码中抛出并捕捉异常。在Java中,无论在代码何处抛出异常,JVM都会生成一个从程序入口到抛出异常方法的调用栈,这个机制在需要调用关系的场合非常有用,比如log4j,就是使用这种机制记录log的方法、行数、类名等等信息的。但是,这种机制是非常消耗资源的,因为调用栈里的每一个element都记录着方法、类、甚至行数(如果编译时打开“debug”开关)等信息,而这些信息都是通过反射机制从class文件里直接获得的。 通过对一堆类似huv、dww、dtg、gjt的混淆后的类的分析,终于找出了几个关键类: package z; public class dza extends hwn { // … static { l = epv.a(“Application.License.FULL”, “Single-user license”); m = epv.a(“Application.License.EVAL”, “Evaluation license”); n = epv.a(“Application.License.EAP”, “EAP license”); o = epv.a(“Application.License.OS”, “License for open-source projects”); p = epv.a(“Application.License.INVALID”, “License is INVALID”); r = epv.a(“Application.License.FLOATING”, “Floating license”); s = epv.a(“Application.License.PERSONAL”, “Personal license”); t = read more »

Synthetica破解

话说前段时间提到把Synthetica给破了,而网上关于破解的文章很少,所以今天就详细说说我是怎么破的。 准备知识 Synthetica是一套很漂亮的Java的look & feel,大家可以去主页上跑一下demo(JWS的,需要安装JRE) 。可惜是commercial的,虽然有评估版下载,但是恶心的是,在评估版界面的最下方会有一块多余的区域(下图) 那这次破解的目的就是把这块区域给去了。 就我这几次破解来看,破解主要分以下几个步骤: 1. 反编译 2. 找关键代码(比如序列号校验算法) 3. 修改源代码 4. 编译打包 其中第1步是前提,在这点上Java的byte code的反编译是比较容易的了,因为毕竟是中间码,而且编译期采取的优化手段不多,反编译过来的基本就是源码。这里推荐DJ Compiler,一个相当老牌的Java反编译器。值得注意的是并不是所有的byte code都能顺利反编译,有些Java程序会使用所谓的“混淆”技术对编译后的代码就行破坏,混淆器一般采用以下方法破坏代码: 1. 不可反编译。这点其实基本不可能 2. 反编译后代码不可读。这点相当恶心,混淆器会把类名、方法名、字段名替换成没有意义的名字,当你打开编辑器放眼望去全是“class A”,“int _fld00043”,“void _mhd2314”的时候你就知道该有多痛苦了 3. 插入不可编译代码。这一点也比较恶心,说穿了就是直接修改byte code中的指令,使用合法的,但不可能从源代码编译到的指令替代原有的指令(比较拗口),比如使用“goto”替代循环。这样你的代码即使可以反编译成源代码但只能看不能改,除非你把goto再替换回去 这次Syn并没有使用混淆,所以用DJ很轻易地就反编了,接下来的活就是怎么找关键代码。一开始我以为评估版输入序列号校验成功后就升级成商业版,于是在那儿找了半天序列号的校验方法,没找到。后来凯子提供一条线索,Syn的商业版是要重新下的,于是猜测评估版和商业版不是一个版本(有时候破解也是要点推理的:-)),估计不会校验注册码。于是改变方向找加那一行字的代码,最后找到了: public void paintBorder(Component component, Graphics g, int j, int k, int l, int i1){     …     g.setColor(UIManager.getColor("Panel.background"));     g.fillRect(j, i1, read more »

思路有点乱,只想说

五年前,我是混进大学生队伍的痞子,在北京四年的摸爬滚打充分发掘出了我血液里山东人的那一份血气。一年前,我成了混入IT界的痞子,从此以code表达我的立场。那天强子开玩笑说如果当年方圆、老四他们软工挂科是在拍惊悚片的话,我们现在拍的就是毛片,别人看着很爽,coding的时候自己知道,委曲求全在心里。如果可以用Java我绝不会去用C++,如果可以用Swing我绝对不会选SWT,有netbeans这么好的IDE摆在那儿为什么还要用Eclipse这么一个操蛋玩意儿,有SVN了为什么还要用CVS,有Firefox为什么还要用IE,有thunder bird为什么还要用outlook,有搜狗为什么还要用微软拼音…… Eclipse代码看得越多越想骂街,才发现原来IBM里也有傻逼。累了,睡,明天还要上班。

相当随的笔

1. 今天一天基本没干其它事,一共面了5个人,虚脱了。要是技术强点的我还能忍受,妈的来了几个一问三不知的,他妈来面试干嘛啊! 2. SWT是傻逼,JFace是傻逼,Eclipse的RCP是傻逼,IBM是傻逼。写出来的东西文档巨少,没有OO概念,一堆整数常量(有时候还得对整数做逻辑与操作),一堆全局变量(虽然用方法调用封装),我现在一看ResourcePlugin.getWorkspace().getActiveWorkspaceWindow().getActivePage().getShell()就想抽丫挺的。还有就是一个IResource接口(和子接口)定义了二三十个方法,要自己实现基本没戏,然后还很贱地给了一堆实现类,像File(实现IFile),Project(实现IProject),却把实现类放在internal包下面(Eclipse的inernal包不推荐二次开发人员使用)。更贱的是一些方法的参数直接要实现类,拿到接口还得做向下转型。妈的IBM那帮人脑子进水了啊,你不会用类继承啊,不懂OO就别他妈在那儿装逼,回去写你的C去吧,别在这儿糟贱Java! 3. 北京的司机开车就他妈不知道谦让啊,今天晚上9点多打车到五道口,王庄路那个十字路口都堵上了四面八方的车还往里拥,你们他妈都急着投胎啊,幸亏的哥不错,让我下车,要不我现在还在车上呢! 4. Bootcamp 1.3 beta 发布了,正在下,不知道改进了什么,估计又是升级Windows下的驱动,玩Mac的朋友可以更新一下。Bootcamp一次比一次大,这次已经到280M了。Leopard快出来啊,iPhone快出来啊。 5. 上周末韬子回北京,跟丫爽了一把,喝完啤酒还去Pepper干了半瓶伏特加,虽然期间吐了几次,第二天胃也烧得慌,但难得一次,相当尽兴。强子的胃彻底废了,前车之鉴啊,要限酒了。

无觅相关文章插件,快速提升流量