2012-04-26 2 views
2

У меня есть пользовательский компонент, который расширяет JComponent. Когда вы нажимаете на нее, она ловит событие с помощью MouseListener. В зависимости от состояния компонента и щелчка, данные, хранящиеся в нем, обновляются.Передача события из пользовательского компонента в родительский

Как я могу уведомить родительский контейнер, когда это происходит, сохраняя его полностью автономным?

ответ

3

Возможно, я использую PropertyChangeSupport, который поставляется вместе с JComponent, а затем запускает ваш метод уведомления всякий раз, когда изменяется состояние программы.

Например:

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+ для пользователя129 ... но мне нравится в PCL, так что я могу указать имена свойств, чтобы прослушать, чтобы я мог прослушивать изменения нескольких разных состояний, и таким образом можно создать полный вид из проекта MVC, который полностью отделен от Контроля. Поэтому моя рекомендация: если вы слушаете только одно состояние, то, во всяком случае, используйте ChangeListener, но если вы слушаете несколько состояний, используйте PCL.

+2

уверены, или просто реализовать ChangeListener – ControlAltDel

+0

@user: да, до тех пор, как мы уменьшаем сцепление, я счастлив. –

+0

На самом деле, мой плохой, если расширение JComponent, нет необходимости создавать мое собственное дополнение или удаление PCL, поскольку оно поставляется с супер. Я так привык к продлению по композиции, когда это необходимо. –

2

Вы можете использовать ChangeListener он должен работать для вас

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