Java 收听JTabbedPane中图标/标题的更改

Java 收听JTabbedPane中图标/标题的更改,java,swing,events,listener,jtabbedpane,Java,Swing,Events,Listener,Jtabbedpane,在Swing中有没有一种方法可以让我们在JTabbedPane中收听图标/标题更改之类的事件 编辑1: 根据建议,尝试添加propertyChangeListener,但不会通知图标更改 我尝试的代码如下: final JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addPropertyChangeListener(new PropertyChangeListener() { @Override public void pr

在Swing中有没有一种方法可以让我们在
JTabbedPane
中收听图标/标题更改之类的事件

编辑1: 根据建议,尝试添加
propertyChangeListener
,但不会通知图标更改

我尝试的代码如下:

final JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addPropertyChangeListener(new PropertyChangeListener() {
  @Override
  public void propertyChange(PropertyChangeEvent evt) {
    String property = evt.getPropertyName();
    System.out.println("property -> " + property);
  }
});

tabbedPane.insertTab("title", someIcon, null, null, 0);

final JButton changeIconBtn = new JButton("Change Icon");
changeIconBtn.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(final ActionEvent e) {
   tabbedPane.setIconAt(0, newIcon);
  }
});
如果我尝试按下更改图标按钮,则不会调用侦听器


我做错了什么吗?

正如MadProgrammer所说,您可以使用
AccessibleContext的
addPropertyChangeListener(PropertyChangeListener)
方法:

import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import javax.swing.*;

public class TabbedPaneAccessibleTest {
  public JComponent makeUI() {
    final JTabbedPane tabbedPane = new JTabbedPane();
    tabbedPane.getAccessibleContext().addPropertyChangeListener(
        new PropertyChangeListener() {
      @Override public void propertyChange(PropertyChangeEvent evt) {
        String property = evt.getPropertyName();
        System.out.println("property -> " + property);
        if (evt.getOldValue() instanceof Icon
            && evt.getNewValue() instanceof Icon) {
          System.out.println("New Icon: " + evt.getNewValue());
        }
      }
    });
    Icon someIcon = UIManager.getIcon("OptionPane.errorIcon");
    Component c = Box.createRigidArea(new Dimension(320, 240));
    tabbedPane.insertTab("title", someIcon, c, null, 0);

    JButton changeIconBtn = new JButton(new AbstractAction("Change Icon") {
      @Override public void actionPerformed(final ActionEvent e) {
        Icon newIcon = UIManager.getIcon("OptionPane.warningIcon");
        tabbedPane.setIconAt(0, newIcon);
      }
    });

    JPanel p = new JPanel(new BorderLayout());
    p.add(new JScrollPane(tabbedPane));
    p.add(changeIconBtn, BorderLayout.SOUTH);
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new TabbedPaneAccessibleTest().makeUI());
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

您是否尝试过使用PropertyChangeListenerNo,我不确定它是如何工作的。谢谢你的指针,我来看看。这有明显的设计不好的味道。请参阅@AndrewThompson,感谢您帮助我改进我的问题。我的编辑错误地重写了你的编辑,但我已经重新添加了它们。很抱歉。感谢@aterai提供更多的见解。这对我有帮助。