如何在java中将文本绑定到JLabel?
我的java应用程序中有几个GUI表单。所有形式都有文本。我已经从一个名为dictionary的共享对象为我的组件设置了文本。我需要在我的程序中添加一个功能;根据用户需要切换语言;以其他语言替换所有形式的文本。我在共享字典对象中有所有文本。有没有干净的方法来改变语言? 我知道netbeans国际化工具,但我想使用另一种方法 编辑:例如: label1.setText(Dictionary.Hello) 字典类定义为:如何在java中将文本绑定到JLabel?,java,user-interface,binding,dictionary,Java,User Interface,Binding,Dictionary,我的java应用程序中有几个GUI表单。所有形式都有文本。我已经从一个名为dictionary的共享对象为我的组件设置了文本。我需要在我的程序中添加一个功能;根据用户需要切换语言;以其他语言替换所有形式的文本。我在共享字典对象中有所有文本。有没有干净的方法来改变语言? 我知道netbeans国际化工具,但我想使用另一种方法 编辑:例如: label1.setText(Dictionary.Hello) 字典类定义为: public class Dictionary { public
public class Dictionary {
public static String Hello = "hello";
}
对于另一种语言:
public class DictionaryPersian extends Dictionary {
public DictionaryPersian(){
Hello = "درود";
}
}
我想找到一种方法来绑定字段字典。hello to jlabel1,这样当这个变量值更改时,它会反映在jlabel1文本上。例如,您可以将JLabel子类化,使用某些id直接从字典设置文本。它还可以充当文本或语言更改的侦听器,从而自动相应地更改显示的文本 为了便于解释,有些代码被剪掉了(未测试,也不完整,如果您愿意,字典标签可以以不同的方式实现,而且您的字典应该实现
IDictionary
)
公共接口IDictionaryListener{
无效字典更改(IDictionary from,IDictionary to);
}
公共接口词典{
字符串getString(字符串forKey);
}
公共最终类字典管理器{
私有静态最终DictionaryManager实例=新DictionaryManager();
私有最终列表侦听器=新的ArrayList();
私人词典;
私有字典管理器(){};
公共静态同步void setDictionary(IDictionary dict){
IDictionary old=INSTANCE.dictionary;
dictionary=dict;
fireDictionaryChanged(旧,dict);
}
公共静态同步IDictionary getDictionary(){
返回INSTANCE.dictionary;
}
公共静态同步的void addDictionaryListener(IDictionaryListener l){
INSTANCE.listeners.add(l);
}
公共静态同步void removeDictionaryListener(IDictionaryListener l){
INSTANCE.listeners.remove(l);
}
私有静态无效fireDictionaryChanged(IDictionary-from,IDictionary-to){
for(IDictionaryListener l:INSTANCE.listeners){
l、 字典更改(从,到);
}
}
}
公共类DictionaryLabel扩展JLabel实现IDictionaryListener{
私钥;
公共字典标签(字符串dictKey){
超级();
key=dictKey;
DictionaryManager.addDictionaryListener(this);
super.setText(DictionaryManager.getDictionary().getString(key));
}
@凌驾
公共最终void setText(字符串文本){
抛出新的RuntimeException(“不受支持!此操作使用了字典!”);
}
@凌驾
公共无效字典更改(最终IDictionary from,最终IDictionary to){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
DictionaryLabel.super.setText(to.getString(key));
}
});
}
}
正如我所说的,我希望您能理解我刚才截取的一些示例。如果愿意,您需要的是一名词典管理员,提供有关所选词典的信息,如果您愿意,还可以使用。它还应该提供侦听器支持,允许在字典更改时通知已注册的标签、按钮等。这有点复杂,但很好。感谢您的关注和帮助!它可能看起来很复杂,但实际上并不复杂,它为您提供了很多关于如何实现字典和组件的自由。
public interface IDictionaryListener {
void dictionaryChanged(IDictionary from, IDictionary to);
}
public interface IDictionary {
String getString(String forKey);
}
public final class DictionaryManager {
private static final DictionaryManager INSTANCE=new DictionaryManager();
private final List<IDictionaryListener> listeners=new ArrayList<>();
private IDictionary dictionary;
private DictionaryManager() {};
public static synchronized void setDictionary(IDictionary dict) {
IDictionary old = INSTANCE.dictionary;
INSTANCE.dictionary=dict;
fireDictionaryChanged(old, dict);
}
public static synchronized IDictionary getDictionary() {
return INSTANCE.dictionary;
}
public static synchronized void addDictionaryListener(IDictionaryListener l) {
INSTANCE.listeners.add(l);
}
public static synchronized void removeDictionaryListener(IDictionaryListener l) {
INSTANCE.listeners.remove(l);
}
private static void fireDictionaryChanged(IDictionary from, IDictionary to) {
for (IDictionaryListener l:INSTANCE.listeners) {
l.dictionaryChanged(from, to);
}
}
}
public class DictionaryLabel extends JLabel implements IDictionaryListener {
private String key;
public DictionaryLabel(String dictKey) {
super();
key = dictKey;
DictionaryManager.addDictionaryListener(this);
super.setText(DictionaryManager.getDictionary().getString(key));
}
@Override
public final void setText(String text) {
throw new RuntimeException("Not supported! Dictionary is used for this!");
}
@Override
public void dictionaryChanged(final IDictionary from, final IDictionary to) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
DictionaryLabel.super.setText(to.getString(key));
}
});
}
}