我正在使用 Swing 和 PropertyChangeListener 来管理应用程序中的主题更改。当 ThemeManager 类中的主题属性发生更改时,侦听器会收到通知。但是,我需要一种机制来确保 ThemeChangeListener 的所有调用者在主题更改时适当更新其行为。
例如,如果我有 2 个 ButtonGroup 可以更改主题,但它们不同步。
// ... existing code for ThemeManager, ThemeManagerFrame, and ThemeChangeListener ...
public class ThemeManagerFrame extends JFrame implements PropertyChangeListener {
// ... existing code ...
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("theme".equals(evt.getPropertyName())) {
String newTheme = (String) evt.getNewValue();
// Need to identify the specific component that triggered the change (e.g., settingsLightThemeRadioButton)
System.out.println("Theme changed by: (Unable to determine specific component)");
// ... existing code to update UI ...
}
}
}
在侦听器的 propertyChange 方法中,我希望能够识别触发主题更改通知的特定 Swing 组件。
我需要一个功能更强大的演示/测试应用程序以确保这能够正常工作,但根据您的描述,您可以尝试以下操作:
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("theme".equals(evt.getPropertyName())) {
AWTEvent awtEvent = EventQueue.getCurrentEvent();
Component trigger = null;
if (awtEvent instanceof InputEvent inputEvent) {
trigger = inputEvent.getComponent();
}
...
}
}
如果主题更改是由一系列稍后调用样式的事件通知触发的,这可能不起作用,但值得一试。