Java 收听JTabbedPane中图标/标题的更改
在Swing中有没有一种方法可以让我们在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
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提供更多的见解。这对我有帮助。