JTabbedPane标签面板切换

wen java案例 2

本文目录导读:

JTabbedPane标签面板切换

  1. JTabbedPane 基本使用
  2. 完整示例:带工具栏的标签管理器

我来为您详细介绍 JTabbedPane 的标签切换功能和使用方法。

JTabbedPane 基本使用

创建和添加标签页

import javax.swing.*;
import java.awt.*;
public class TabbedPaneDemo extends JFrame {
    public TabbedPaneDemo() {
        setTitle("JTabbedPane 示例");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        // 创建标签面板
        JTabbedPane tabbedPane = new JTabbedPane();
        // 创建各个标签页的内容面板
        JPanel panel1 = new JPanel();
        panel1.add(new JLabel("这是第一个标签页"));
        JPanel panel2 = new JPanel();
        panel2.add(new JButton("按钮"));
        JPanel panel3 = new JPanel();
        panel3.add(new JTextField(20));
        // 添加标签页
        tabbedPane.addTab("首页", panel1);
        tabbedPane.addTab("设置", panel2);
        tabbedPane.addTab("quot;, panel3);
        // 或者使用图标
        // ImageIcon icon = new ImageIcon("icon.png");
        // tabbedPane.addTab("标签", icon, panel, "提示信息");
        add(tabbedPane);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new TabbedPaneDemo().setVisible(true);
        });
    }
}

标签切换监听

// 添加标签切换监听器
tabbedPane.addChangeListener(e -> {
    JTabbedPane source = (JTabbedPane) e.getSource();
    int selectedIndex = source.getSelectedIndex();
    String title = source.getTitleAt(selectedIndex);
    Component component = source.getSelectedComponent();
    System.out.println("切换到标签: " + title);
    System.out.println("索引: " + selectedIndex);
});

编程式切换标签

// 通过索引切换
tabbedPane.setSelectedIndex(0);  // 切换到第一个标签
// 通过组件切换
tabbedPane.setSelectedComponent(panel2);
// 获取当前选中索引
int currentIndex = tabbedPane.getSelectedIndex();
// 获取当前选中组件
Component currentComponent = tabbedPane.getSelectedComponent();

标签位置设置

// 设置标签位置
tabbedPane.setTabPlacement(JTabbedPane.TOP);      // 顶部(默认)
tabbedPane.setTabPlacement(JTabbedPane.BOTTOM);   // 底部
tabbedPane.setTabPlacement(JTabbedPane.LEFT);     // 左侧
tabbedPane.setTabPlacement(JTabbedPane.RIGHT);    // 右侧

标签布局模式

// 滚动布局(标签太多时显示滚动箭头)
tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
// 换行布局(标签太多时自动换行)
tabbedPane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);

完整示例:带工具栏的标签管理器

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class TabbedPaneManager extends JFrame {
    private JTabbedPane tabbedPane;
    private int tabCount = 1;
    public TabbedPaneManager() {
        setTitle("标签面板管理器");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 400);
        setLocationRelativeTo(null);
        // 创建工具栏
        JToolBar toolBar = new JToolBar();
        JButton addBtn = new JButton("添加标签");
        JButton removeBtn = new JButton("删除当前标签");
        JButton prevBtn = new JButton("前一个");
        JButton nextBtn = new JButton("后一个");
        toolBar.add(addBtn);
        toolBar.add(removeBtn);
        toolBar.addSeparator();
        toolBar.add(prevBtn);
        toolBar.add(nextBtn);
        // 创建标签面板
        tabbedPane = new JTabbedPane();
        tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
        // 添加第一个标签
        addNewTab("标签 " + tabCount);
        // 添加标签事件
        addBtn.addActionListener(e -> addNewTab("标签 " + (++tabCount)));
        // 删除当前标签事件
        removeBtn.addActionListener(e -> {
            int index = tabbedPane.getSelectedIndex();
            if (index >= 0) {
                tabbedPane.removeTabAt(index);
            }
        });
        // 切换标签事件
        prevBtn.addActionListener(e -> {
            int index = tabbedPane.getSelectedIndex();
            if (index > 0) {
                tabbedPane.setSelectedIndex(index - 1);
            }
        });
        nextBtn.addActionListener(e -> {
            int index = tabbedPane.getSelectedIndex();
            if (index < tabbedPane.getTabCount() - 1) {
                tabbedPane.setSelectedIndex(index + 1);
            }
        });
        // 标签切换监听
        tabbedPane.addChangeListener(e -> {
            int index = tabbedPane.getSelectedIndex();
            if (index >= 0) {
                String title = tabbedPane.getTitleAt(index);
                setTitle("当前标签: " + title);
            }
        });
        // 添加右键菜单
        tabbedPane.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (SwingUtilities.isRightMouseButton(e)) {
                    int index = tabbedPane.indexAtLocation(e.getX(), e.getY());
                    if (index >= 0) {
                        showPopupMenu(e.getX(), e.getY(), index);
                    }
                }
            }
        });
        // 布局
        setLayout(new BorderLayout());
        add(toolBar, BorderLayout.NORTH);
        add(tabbedPane, BorderLayout.CENTER);
    }
    private void addNewTab(String title) {
        JPanel panel = new JPanel(new BorderLayout());
        JTextArea textArea = new JTextArea();
        textArea.setText("这是 " + title + " 的内容");
        panel.add(new JScrollPane(textArea), BorderLayout.CENTER);
        // 添加带关闭按钮的标签
        tabbedPane.addTab(title, panel);
        int index = tabbedPane.indexOfComponent(panel);
        // 设置标签组件(带关闭按钮)
        JPanel tabComponent = createTabComponent(title, panel);
        tabbedPane.setTabComponentAt(index, tabComponent);
        // 切换到新标签
        tabbedPane.setSelectedIndex(index);
    }
    private JPanel createTabComponent(String title, JPanel panel) {
        JPanel tabPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0));
        tabPanel.setOpaque(false);
        JLabel label = new JLabel(title);
        JButton closeBtn = new JButton("×");
        closeBtn.setPreferredSize(new Dimension(20, 20));
        closeBtn.setFont(new Font("Arial", Font.BOLD, 12));
        closeBtn.setFocusable(false);
        closeBtn.setBorderPainted(false);
        closeBtn.setContentAreaFilled(false);
        closeBtn.addActionListener(e -> {
            int index = tabbedPane.indexOfComponent(panel);
            if (index >= 0) {
                tabbedPane.removeTabAt(index);
            }
        });
        tabPanel.add(label);
        tabPanel.add(closeBtn);
        return tabPanel;
    }
    private void showPopupMenu(int x, int y, int index) {
        JPopupMenu popup = new JPopupMenu();
        JMenuItem closeItem = new JMenuItem("关闭");
        JMenuItem closeOthersItem = new JMenuItem("关闭其他");
        JMenuItem closeAllItem = new JMenuItem("关闭所有");
        JMenuItem renameItem = new JMenuItem("重命名");
        popup.add(closeItem);
        popup.add(closeOthersItem);
        popup.add(closeAllItem);
        popup.addSeparator();
        popup.add(renameItem);
        // 关闭当前标签
        closeItem.addActionListener(e -> tabbedPane.removeTabAt(index));
        // 关闭其他标签
        closeOthersItem.addActionListener(e -> {
            String title = tabbedPane.getTitleAt(index);
            tabbedPane.removeAll();
            addNewTab(title);
        });
        // 关闭所有标签
        closeAllItem.addActionListener(e -> tabbedPane.removeAll());
        // 重命名标签
        renameItem.addActionListener(e -> {
            String newName = JOptionPane.showInputDialog(
                this, "请输入新标签名:", 
                tabbedPane.getTitleAt(index));
            if (newName != null && !newName.trim().isEmpty()) {
                tabbedPane.setTitleAt(index, newName);
            }
        });
        popup.show(tabbedPane, x, y);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new TabbedPaneManager().setVisible(true);
        });
    }
}
方法 描述
addTab(title, component) 添加标签页
removeTabAt(index) 删除指定位置的标签
setSelectedIndex(index) 切换到指定标签
getSelectedIndex() 获取当前选中标签索引
getTabCount() 获取标签总数
setTitleAt(index, title) 修改标签标题
setTabPlacement(placement) 设置标签位置
setTabLayoutPolicy(policy) 设置标签布局策略

JTabbedPane 是 Java Swing 中非常实用的组件,适合用于创建多页面的界面应用,以上示例涵盖了大部分常用功能,您可以根据实际需求进行调整。

抱歉,评论功能暂时关闭!