2

JComponent を拡張するカスタム コンポーネントがあります。クリックすると、MouseListener でイベントをキャッチします。コンポーネントの状態とクリックした場所に応じて、そこに保存されているデータが更新されます。

親コンテナを完全に自己完結型に保ちながら、これが発生したときに親コンテナに通知するにはどうすればよいですか?

4

2 に答える 2

3

私自身、JComponent に付属の PropertyChangeSupport を使用し、プログラムの状態が変化するたびに通知メソッドを起動します。

例えば:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;

public class PropChangeEg {
   private static void createAndShowGui() {
      final JLabel counterLabel = new JLabel(" ", SwingConstants.CENTER);

      CustomComponent myCustomComponent = new CustomComponent();
      myCustomComponent.addPropertyChangeListener(new PropertyChangeListener() {

         @Override
         public void propertyChange(PropertyChangeEvent pcEvt) {
            if (pcEvt.getPropertyName().equals(CustomComponent.COUNTER)) {
               String text = "Counter: " + pcEvt.getNewValue();
               counterLabel.setText(text);
            }
         }
      });

      JFrame frame = new JFrame("PropChangeEg");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(myCustomComponent, BorderLayout.CENTER);
      frame.add(counterLabel, BorderLayout.PAGE_END);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

@SuppressWarnings("serial")
class CustomComponent extends JComponent {
   public static final String COUNTER = "counter";
   private int counter = 0;

   public CustomComponent() {
      setLayout(new FlowLayout());
      add(new JButton(new AbstractAction("Increment Counter") {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            setCounter(counter + 1);
         }
      }));
      add(new JButton(new AbstractAction("Decrement Counter") {

         @Override
         public void actionPerformed(ActionEvent arg0) {
            setCounter(counter - 1);
         }
      }));
   }

   //@Override // not needed!!
   //public void addPropertyChangeListener(PropertyChangeListener listener) {
   //   super.addPropertyChangeListener(listener);
   //}

   //@Override // not needed!!
   //public void removePropertyChangeListener(PropertyChangeListener listener) {
   //   super.removePropertyChangeListener(listener);
   //}

   public void setCounter(int counter) {
      int oldValue = this.counter;
      int newValue = counter;
      this.counter = newValue;
      firePropertyChange(COUNTER, oldValue, newValue);
   }

   public int getCounter() {
      return counter;
   }


}

コメントについて:

ChangeListener も正常に機能します。1+ から user129... しかし、私が PCL で気に入っているのは、リッスンするプロパティの名前を指定して、複数の異なる状態の変化をリッスンできることです。この方法で、MVC デザインから完全なビューを作成できます。コントロールから完全に切り離されています。したがって、私の推奨事項は次のとおりです。1 つの状態のみをリッスンしている場合は、必ず ChangeListener を使用しますが、複数の状態をリッスンしている場合は、PCL を使用してください。

于 2012-04-26T16:37:47.967 に答える
2

あなたはそれがあなたのために働くはずのChangeListenerを使うことができます

于 2012-04-26T17:13:03.033 に答える