![](/img/trans.png)
[英]JTabbedPane - addTab(title, icon, component) + setTabComponentAt(index, component)
[英]Listen to icon/title changes in JTabbedPane
Swing中有什么方法可以监听JTabbedPane
的图标/标题更改之类的事件?
正如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所说,可以使用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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.