Возможно, я использую 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.
уверены, или просто реализовать ChangeListener – ControlAltDel
@user: да, до тех пор, как мы уменьшаем сцепление, я счастлив. –
На самом деле, мой плохой, если расширение JComponent, нет необходимости создавать мое собственное дополнение или удаление PCL, поскольку оно поставляется с супер. Я так привык к продлению по композиции, когда это необходимо. –