2012-03-02 3 views
4

私は自分のJavaアプリケーションにいくつかのGUIフォームを持っています。すべての書式にテキストがあります。辞書と呼ばれる共有オブジェクトからコンポーネントにテキストを設定しました。自分のプログラムで機能が必要です。ユーザーが望むように言語を切り替える。すべての書式のすべてのテキストが別の言語に置き換えられるようにします。私は共有された辞書オブジェクトにすべてのテキストを持っています。クリーンな方法で言語を変更するためのクリーンな方法はありますか? 私はnetbeansの国際化ツールについて知っていますが、別の方法を使いたいと思います。JavaでJLabelsにテキストをバインドする方法は?

編集:例えば:

label1.setText(Dictionary.Hello)。

とDictionaryクラスは、次のように定義されます

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

と他の言語のために:

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

私は、このようなことをjLabel1をするために、フィールドにDictionary.helloをバインドする方法の方法を見つけたいですこの変数値が変更されると、jlabel1テキストに反映されます。

答えて

1

例えば、JLabelをサブクラス化することができます。いくつかのIDを使用して辞書から直接テキストを設定します。テキストまたは言語の変更に対するリスナーとして機能し、それに応じて表示されるテキストを自動的に変更することもできます。説明の便宜上

は切り取らいくつかのコード私が言ったように、単にいくつかの例が切り取ら、

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

    }); 
    } 
} 

(必要であれば完全にテストされ、またないが、辞書のラベルはまたあなたの辞書がIDictionaryを実装する必要があり、異なる方法で実装することができます)私はあなたがそのアイデアを得ることを望みます。

+0

可能であれば、私の編集をご覧ください。 – sajad

+0

あなたが必要とするのは、もしあなたが望むなら、あなたが望むなら、あなたが選んだ辞書の選択についての情報を持っているDictionaryManagerです。また、登録されたラベル、ボタンなどを辞書の変更に通知するためのリスナーサポートも提供する必要があります。 – stryba

+0

少し複雑ですが良いアイデアです。あなたの注意と助けてくれてありがとう! – sajad

関連する問題