Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中将文本绑定到JLabel?_Java_User Interface_Binding_Dictionary - Fatal编程技术网

如何在java中将文本绑定到JLabel?

如何在java中将文本绑定到JLabel?,java,user-interface,binding,dictionary,Java,User Interface,Binding,Dictionary,我的java应用程序中有几个GUI表单。所有形式都有文本。我已经从一个名为dictionary的共享对象为我的组件设置了文本。我需要在我的程序中添加一个功能;根据用户需要切换语言;以其他语言替换所有形式的文本。我在共享字典对象中有所有文本。有没有干净的方法来改变语言? 我知道netbeans国际化工具,但我想使用另一种方法 编辑:例如: label1.setText(Dictionary.Hello) 字典类定义为: public class Dictionary { public

我的java应用程序中有几个GUI表单。所有形式都有文本。我已经从一个名为dictionary的共享对象为我的组件设置了文本。我需要在我的程序中添加一个功能;根据用户需要切换语言;以其他语言替换所有形式的文本。我在共享字典对象中有所有文本。有没有干净的方法来改变语言? 我知道netbeans国际化工具,但我想使用另一种方法

编辑:例如:

label1.setText(Dictionary.Hello)

字典类定义为:

 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));
      }

    });
  }
}