华丽的痘痘

努力成为一个有价值的程序员

王亚楠ID:andycpp
45454次访问,排名2388(-1)好友17人,关注者31
做一名合格地java教师
andycpp的文章
原创 42 篇
翻译 1 篇
转载 16 篇
评论 15 篇
最近评论
zjcone:很明确,谢谢!
czdvcc:wow power leveling
hukaibao2007:不错
wjjdlove:貌似不错呢
wjjdlove:thanks
文章分类
收藏
相册
我的相册
高手专栏
Web高手buaawhl的专栏(RSS)
阿朱的博客(RSS)
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 使用Action创建一个JButton后,改变该按钮的名字可能会遇到意想不到的问题收藏

新一篇: 在Eclipse中使用JUnit4进行单元测试(初级篇) | 旧一篇: Minotaur——人身牛头怪的传说

        我们来看一个简单的小例子
        有2个按钮a和b,单击a会改变b的名字,单击b再把自己的名字改回来。下面是我写的代码:
public class ATestPanel extends JPanel {

    
public ATestPanel() {
        changeHisName 
= new JButton("把他的名字改为Jack");
        changeHisName.addActionListener(
new ActionListener() {
            
public void actionPerformed(ActionEvent e) {
                
// 把另一个按钮的名字改为“Tom”
                tom.setText("Jack");
            }
    
        }
);
        
        tom 
= new JButton(new AbstractAction() {

            
public void actionPerformed(ActionEvent e) {
                
// 把自己的名字改回为“Tom”
                putValue(Action.NAME, "Tom");
            }

            
{
                putValue(Action.NAME, 
"Tom");
                putValue(Action.SHORT_DESCRIPTION, 
"我原来叫Tom");
            }

        }
);

        add(changeHisName);
        add(tom);
    }

    
    JButton changeHisName, tom;
}

        把上面的JPanel放到一个JFrame中运行一下,初始效果如下:


        当点击了左边的按钮后,Tom的名字就被改了,效果如下:


        这个时候,我们再点击右面的按钮,想把名字改回“Tom”。结果可能会让你大吃一惊(至少让我迷茫了半个多小时),没有任何反应!该按钮仍然叫“Jack”,而没有变回“Tom”。再回头看上面的代码,我们明明写了:
putValue(Action.NAME, "Tom");
他咋就不起作用呢?????????

        产生这个问题的根源在于,
putValue(Action.NAME, "Tom");这个方法自身做了优化,他首先判断按钮目前的Action.NAME属性和即将改变的Action.NAME属性是否相同,如果相同就不做任何处理。当我们点击右面的按钮来改变左边按钮的名字的时候,他使用的是setText方法:
tom.setText("Jack");
而setText方法仅仅是改变按钮显示的内容,他不改变该按钮的
Action.NAME属性。因此尽管上图中的按钮显示为“Jack”,但是他的Action.NAME属性仍然是“Tom”!!所以,当你点击他想重新显示“Tom”,这个时候putValue方法就会发现你想把“Tom”改为“Tom”,前后完全一样,不予受理,维持当前显示内容!结果就导致了一直显示“Jack”~

        那么,遇到这种情况,该怎么解决呢?解决的办法就是,不要使用setText方法来改变名字,换成putValue方法就好了。具体到我们这个例子,就是
把       tom.setText("Jack");  
换成   tom.getAction().putValue
(Action.NAME, "Tom");
这样子就可以了。

发表于 @ 2006年09月28日 00:26:00|评论(loading...)|编辑

新一篇: 在Eclipse中使用JUnit4进行单元测试(初级篇) | 旧一篇: Minotaur——人身牛头怪的传说

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 华丽的痘痘