系统:Win10
JDK:1.8.0_333
IDEA:2020.3.4
1.需求描述
在写一个 Swing 项目的时候,写到 JTabbedPane 时,需要实现点击 TabComponent 的 x 关闭当前选项卡的功能,就像浏览器的标签页的 x 一样,点击就关闭的功能
2.代码实现
public class JTabbedPaneClose {
public static int sequence = 1; // 序号
public static void main(String[] args) {
try {
// 设置 JTabbedPane 的 tab 标签的内衬
UIManager.put("TabbedPane.tabInsets"
, new javax.swing.plaf.InsetsUIResource(3, 4, 2, 0));
} catch (Exception e) {
e.printstacktrace();
}
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addTab(" 对象 ", new JPanel());
tabbedPane.addTab(" + ", new JPanel());
String filename = JTabbedPaneClose.class.getResource("/").getPath() + "images/close.png";
ImageIcon icon = new ImageIcon(filename);
icon.setimage(icon.getimage().getScaledInstance(20, 20, Image.SCALE_DEFAULT));
// 添加监听
tabbedPane.getModel().addchangelistener(new changelistener() {
private boolean ignore = false; // 防止切换新选项卡引起的死循环
@Override
public void stateChanged(ChangeEvent e) {
if (!ignore) {
ignore = true;
try {
int selected = tabbedPane.getSelectedindex();
String title = tabbedPane.getTitleAt(selected);
if (" + ".equals(title)) {
JPanel panel = new JPanel();
String newTitle = "选项卡@" + sequence + " ";
sequence++;
int index = tabbedPane.getTabCount() - 1;
tabbedPane.insertTab(newTitle, null, panel, null, index);
// 设置选项卡的标题组件
JPanel tabComponent = new JPanel();
tabComponent.setopaque(false);
tabComponent.setLayout(new BorderLayout());
JLabel titleLabel = new JLabel(newTitle);
tabComponent.add(titleLabel, BorderLayout.WEST);
JLabel iconLabel = new JLabel();
iconLabel.setIcon(icon);
tabComponent.add(iconLabel, BorderLayout.EAST);
tabbedPane.setTabComponentAt(index, tabComponent);
// 删除图片添加鼠标监听操作
iconLabel.addMouseListener(new MouseAdapter() {
@Override
public void mousepressed(MouseEvent e) {
if (e.getModifiers() == MouseEvent.BUTTON1_MASK) {
JLabel source = (JLabel) e.getSource();
Component parent = source.getParent();
int index = tabbedPane.indexOfTabComponent(parent);
tabbedPane.removeTabAt(index);
if (index == tabbedPane.getSelectedindex() && index == tabbedPane.getTabCount() - 1)
tabbedPane.setSelectedindex(index - 1);
}
}
});
tabbedPane.setSelectedComponent(panel);
}
} finally {
ignore = false;
}
}
}
});
JFrame frame = new JFrame();
frame.setTitle("点击x关闭选项卡");
frame.setSize(600, 480); // 设置大小
frame.add(tabbedPane); // 添加组件
frame.setLocationRelativeto(null); // 居中
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭默认操作
frame.setVisible(true); // 设置可见
}
}
3.效果演示
原文地址:https://www.jb51.cc/wenti/3288160.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。