您的位置:首页 > 其它

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

2006-09-28 00:26 597 查看
我们来看一个简单的小例子
有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");

这样子就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐