使用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");
这样子就可以了。
有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");
这样子就可以了。
相关文章推荐
- struts中使用DispatchAction可能会遇到的一个问题
- 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq
- 使用 TestNG 创建一个数据驱动测试过程中遇到的问题
- ######crm01_最快速:搭建纯注解ssh整合环境(只用一个Spring配置)素材提供jar包,只有两步工作:①写Spring配置②写ssh注解+简单逻辑=遇到action创建失败问题
- 创建ID3D11Device可能会遇到的问题,不能使用具体的IDXGIAdapter
- 这是我学习COM遇到的几个基本问题其解决 黄森堂(vcmfc)著 1.我用ATL生成一个组件对象,我在COM中使用IDD_IEncrypt,这个在哪里写义,是啥?GUID? 答:IDD_IEncry
- 使用css expression遇到的一个问题
- 经常遇到的一个问题是 MFC中开启多线程后 在非主线程中使用updata函数出现崩溃的情况。
- 关于用c生成的dll在使用其他供应商的工具创建可执行模块时遇到的一些问题
- Qt5中创建及使用自定义插件遇到的一些问题
- vs2010 将某一个类添加到一个名字空间中 vs2010创建名字空间及其使用
- 解决slidingmenu+actionbarsherlock结合使用时遇到的问题
- iOS微信支持遇到的问题:只显示一个确定按钮、onResp不回调、闪回
- 设置subversion遇到的一个意想不到的小问题
- java工程项目里,在一个包里面,不能出现同名的类名,这问题是刚接触java才会遇到的,特别是新手一般都没有建立包,而是使用默认的,易出现同名的类名,导致eclipse提示错误
- 使用access时遇到的一个问题
- Extjs--点击一个按钮,打开一个新的窗体window重复创建的问题
- 使用CXF遇到的一个问题
- EasyUI - tree 使用拖拽时可能会遇到的一个错误
- 使用移动端页面iScroll插件遇到的一个checkbox选择的问题