• JTabbedPane 点 x 关闭选项卡


    系统: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); // 设置可见
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    3.效果演示

    在这里插入图片描述

  • 相关阅读:
    TypeScript常见面试题第十一节
    关于element-ui中,页面上有多个el-table并通过v-if、v-else等控制是否显示时,type=selection勾选框失效或不显示的问题
    Mysql的group_concat函数长度限制
    Com插件开发-CDR插件-自动化接口-IDispatch接口-原理解析
    一篇让你使用vue-cli搭建SPA项目
    Jetson nano 系列之7—jetson 通过rtp将视频发给远程host
    如何禁止WordPress主题纯英文评论教程
    jquery控制easyui中combobox、textbox显示隐藏
    YYGH-9-预约下单
    邸老师的时序分析笔记
  • 原文地址:https://blog.csdn.net/qq_35132089/article/details/126775379