繁体   English   中英

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

[英]Listen to icon/title changes in JTabbedPane

Swing中有什么方法可以监听JTabbedPane的图标/标题更改之类的事件?

编辑1:

正如MadProgrammer建议的那样,尝试添加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所说,可以使用AccessibleContextaddPropertyChangeListener(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);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM