2012-03-02 2 views
4

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

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

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

Вы можете подклассифицировать 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)); 
     } 

    }); 
    } 
} 

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

+0

Если возможно, ознакомьтесь с моими изменениями. – sajad

+0

Вам понадобится DictionaryManager, если хотите, имея информацию о сокращенном словаре и доступном, если хотите. Он также должен обеспечивать поддержку слушателя, которая позволяет уведомлять зарегистрированные метки, кнопки и т. Д. О изменениях словаря. – stryba

+0

Немного сложная, но хорошая идея. Спасибо за внимание и помощь! – sajad

Смежные вопросы