在 Java + Swing 中更新 PropertyChangeListener 的调用者

问题描述 投票:0回答:1

我正在使用 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 组件。

java swing propertychangelistener
1个回答
0
投票

我需要一个功能更强大的演示/测试应用程序以确保这能够正常工作,但根据您的描述,您可以尝试以下操作:

    @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();
            }
            ...
        }
    }

如果主题更改是由一系列稍后调用样式的事件通知触发的,这可能不起作用,但值得一试。

© www.soinside.com 2019 - 2024. All rights reserved.