Как привязать текст к JLabels в Java? - PullRequest
4 голосов
/ 03 марта 2012

У меня есть несколько форм GUI в моем Java-приложении. Все формы имеют тексты. Я установил текст для своих компонентов из общего объекта под названием словарь. Мне нужна функция в моей программе; переключать язык по желанию пользователя; так, чтобы все тексты во всех формах были заменены на другой язык. У меня есть все тексты в общем объекте Dictionary. Есть ли чистый способ изменить язык в чистом виде? Я знаю об инструменте интернационализации netbeans, но хочу использовать другой метод.

Редактировать: например:

label1.setText (Dictionary.Hello);

и словарь класса определяется как:

 public class Dictionary {
     public static String Hello = "hello"; 
}

и для другого языка:

  public class DictionaryPersian extends Dictionary {
      public DictionaryPersian(){
          Hello = "درود"; 
       }
  }

Я хочу найти способ связать поле Dictionary.hello с jlabel1, чтобы при изменении значения этой переменной оно отражалось на тексте jlabel1.

1 Ответ

1 голос
/ 03 марта 2012

Например, вы можете создать подкласс JLabel, устанавливая текст прямо из словаря, используя некоторый идентификатор. Он также может действовать как слушатель текстовых или языковых изменений для автоматического изменения отображаемого текста соответствующим образом.

Для пояснения некоторые фрагменты кода (не проверенные и не полные, метка словаря может быть реализована по-разному, если хотите, также ваши словари должны реализовывать IDictionary)

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

    });
  }
}

Как я уже сказал, приведен только один пример, надеюсь, вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...