2011-12-21 12 views
1

私は、キーオブジェクトに対して変更が行われた後に、オブジェクトセットの変更をトリガする効果的なメソッドを探しています。私がしたいことはこれです: 変更された場合、他のオブジェクトのメソッドを実行するオブジェクトが1つあります。イベントに関するオブジェクトへの通知

私はこれを達成するためにPropertyChangeListenerを使用しようとしていた。

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class BoundSample { 
    public static void main(String args[]) { 
     JFrame frame = new JFrame("PropertyChangeListener Sample"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final JButton button1 = new JButton("Open"); 
     final JButton button2 = new JButton("Cancel"); 

     final String[] languages = { "English", "Spanish" }; 

     final JComboBox combo = new JComboBox(languages); 

     final JPanel panel = new JPanel(); 


     ActionListener actionListener = new ActionListener() { 
      public void actionPerformed(ActionEvent actionEvent) { 
       JComboBox comboTmp = (JComboBox) actionEvent.getSource(); 

       if (combo.getSelectedItem().equals("English") || combo.getSelectedItem().equals("Ingles")) { 
        String[] langs = { "English", "Spanish" }; 
        comboTmp.setModel(new JComboBox(langs).getModel()); 
       } 
       else if (combo.getSelectedItem().equals("Spanish") || combo.getSelectedItem().equals("Espanol")) { 
        String[] langs = { "Ingles", "Espanol" }; 
        comboTmp.setModel(new JComboBox(langs).getModel()); 
       } 
      } 
     }; 

     PropertyChangeListener propertyChangeListener = new PropertyChangeListener() { 
      public void propertyChange(PropertyChangeEvent propertyChangeEvent) { 
       String property = propertyChangeEvent.getPropertyName(); 

       JComboBox comboTmp = (JComboBox) propertyChangeEvent.getSource(); 
       String language = (String) comboTmp.getItemAt(0); 

       System.out.println(language); 

       if ("model".equals(property)) { 
        if (language.equals("English")) { 
         button1.setLabel("Open"); 
         button2.setLabel("Cancel"); 
        } else if (language.equals("Ingles")) { 
         button1.setLabel("Abierto"); 
         button2.setLabel("Cancelar"); 
        } 

       } 
      } 
     }; 

     combo.addPropertyChangeListener(propertyChangeListener); 
     combo.addActionListener(actionListener); 

     Container contentPane = frame.getContentPane(); 
     panel.add(button1, BorderLayout.CENTER); 
     panel.add(button2, BorderLayout.SOUTH); 

     contentPane.add(combo, BorderLayout.NORTH); 
     contentPane.add(panel, BorderLayout.SOUTH); 

     frame.setSize(300, 100); 
     frame.setVisible(true); 
    } 
} 

このアプローチの問題点は、オブジェクトの増加とのpropertyChange()メソッドを消費し、それは管理が困難になるということです。さらに、新しいJComponentを追加するには、propertyChange()を変更する必要があります。

キーオブジェクトの変更をオブジェクトに「見せる」ようにして、キーのPropertyChangeListenerでアクションを実行する代わりに、キーオブジェクトの変更を見て、それに応じて動作させる方法がありますオブジェクト?またはこれを行うための多分他のきちんとした方法?

+0

ボイラプレートの配線を引き継ぐバインディングフレームワークがあります。fi BetterBeansBindingまたはJGoodiesバインディング – kleopatra

答えて

2

あなたはobserver patternを知っていますか?それはあなたが望むことを行います。オブジェクトは何かが起こったときに通知を受けるためにオブジェクトに登録します。

observer pattern

3

まず第一に、勧告 - 常にあなたの翻訳を行うためのネイティブスピーカーを取得します。特定のタイプのエラーを回避するのに役立ちます。たとえば、あなたが 'open'の代わりに選択した単語は、通常、動詞ではなく形容詞として使用されます( 'open window'のように)。また、アクセント記号が付いていないため、一部の読者にとっては混乱することがあります(アクセント記号のためにいくつかの単語が異なるだけです...)。

次に、言語の選択や使用をハードコードしないでください。彼らは.propertiesファイルまたはそれに類するものからロードする必要があります。これにより、特に、,の言語を追加すると、メンテナンスが簡単になります。オブザーバーパターンの使用に関する@Mortの答えは正しいです。つまり、アップデートの処理方法です。ここでは、言語の側面にどのように対処するか(実際にはおおよそ)です:
まず、.propertiesファイルが必要です。

spanishButtonNames.properties 
================================== 
openButton=Abrir 
cancelButton=Cancelar 

englishButtonNames.properties 
================================== 
opernButton=Open 
cancelButton=Cancel 

あなたは言語がを求めた(そしておそらくリソースを割り当て解除)され、背後のリソースファイルをロードすることに対処するだろうPropertyManagerのいくつかの並べ替え、これらをラップすることをお勧めします。

次に、あなたのボタンを作成し、それらに名前を付ける:

JButton openButton = new JButton(); 
openButton.setName("openButton"); 
// And add them to a list 
buttonList.add(openButton); 
// More buttons.... 

ボタンリストのオフボタンの更新は、自明です。あなただけのbuttonListがために聞く(とpropogate)アップデート持つことができます

for(JButton button : buttonList) { 
    button.setText(languagePropertyManager.getProperty(button.getName())); 
} 

は(いくつかの巧妙なコーディングで、それはテキストファイルからも、GUIのレイアウトをロードすることは可能だが、私はそれを試したことがないことに注意してください。しかし、それを処理するフレームワークがあると信じています)。

関連する問題