代码实现效果如下

主界面的类如下

import java.awt.Component;

import java.awt.Dimension;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.InputEvent;

import java.awt.event.KeyEvent;

import javax.swing.JCheckBoxMenuItem;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JPanel;

import javax.swing.JTabbedPane;

import javax.swing.KeyStroke;

import javax.swing.SwingUtilities;

import test.ButtonTabComponent;

public class TabComponentsDemo extends JFrame{

private JTabbedPane pane = new JTabbedPane();

private JMenuItem scrollTabItem ;

private JMenuItem componentTabItem;

private final int numTab = 5;

public TabComponentsDemo(String title) {

//设置frame标题名

super(title);

//设置关闭方式

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//创建菜单栏

initMenu();

//将tabpane添加到frame中

add(pane);

}

//初始化tabpanel相关配置,并且用于resize的调用

public void runTest() {

//设置有关闭按键的标签

componentTabItem.setSelected(true);

//设置标签

for(int i = 0 ; i < numTab ; i++)

{

//标签名

String name = "tab "+i;

//创建标签

pane.add(name,createContent(name));

//初始化标签上的文字和Button

initTabComponent(i);

}

//设置frame的大小

setSize(new Dimension(500,500));

//将frame放到屏幕的正中央

setLocationRelativeTo(null);

//显示frame

setVisible(true);

}

//创建标签内容部分

private Component createContent(String name) {

//创建一个panel,并设置布局为一个分块

JPanel panel = new JPanel(new GridLayout(1,1));

//创建一个label

JLabel label = new JLabel(name);

//设置label的文本格式

label.setHorizontalAlignment(JLabel.CENTER);

//将label放入panel中

panel.add(label);

return panel;

}

//初始化带有关闭按钮的标签头部

private void initTabComponent(int i) {

//用这个函数可以初始化标签的头部

pane.setTabComponentAt(i, new ButtonTabComponent(pane));

}

//创建菜单栏

private void initMenu() {

//创建一个菜单条

JMenuBar mb = new JMenuBar();

//创建重叠tab选项

scrollTabItem = new JCheckBoxMenuItem("重叠tab");

//设置快捷键

scrollTabItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));

//设置监听事件

scrollTabItem.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent arg0) {

if(pane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT)

pane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);

else

pane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);

}

});

//设置可关闭的标签的菜单

componentTabItem = new JCheckBoxMenuItem("设置可关闭的tab");

componentTabItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));

componentTabItem.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

for(int i = 0 ; i < numTab ; i++)

{

if(componentTabItem.isSelected())

initTabComponent(i);

else

pane.setTabComponentAt(i, null);

}

}

});

//设置重置标签

JMenuItem reSetItem = new JMenuItem("重置");

reSetItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,InputEvent.CTRL_MASK));

reSetItem.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

runTest();

}

});

//创建菜单

JMenu menu = new JMenu("选项");

//添加菜单项

menu.add(componentTabItem);

menu.add(scrollTabItem);

menu.add(reSetItem);

//添加菜单

mb.add(menu);

//添加菜单条(注意一个frame只能有一个菜单条,所以用set)

setJMenuBar(mb);

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

@Override

public void run() {

new TabComponentsDemo("可关闭的tab测试").runTest();

}

});

}

}

会用到的另一个类如下:

package test;

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Component;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import javax.swing.AbstractButton;

import javax.swing.BorderFactory;

import javax.swing.JButton;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTabbedPane;

import javax.swing.plaf.basic.BasicButtonUI;

public class ButtonTabComponent extends JPanel{

private final JTabbedPane pane;

public ButtonTabComponent(final JTabbedPane pane) {

//设置标签头要水平的,从左向右的排列组件,并且组件的间距为0(横向和纵向)

super(new FlowLayout(FlowLayout.LEFT, 0, 0));

if(pane == null)

throw new NullPointerException("pane can not be null");

this.pane = pane;

//不画出panel的边界

setOpaque(false);

//创建标签头的文字内容

JLabel label = new JLabel(){

//重写方法,返回pane指定位置的名字,这里有点绕,可以好好理解理解

//为什么不直接设置标签的内容,而是通过重写函数来修改标签内容

//可能是希望业务逻辑尽量不要散落在外部

@Override

public String getText() {

//可以获得当前panel在tab中的位置

int i = pane.indexOfTabComponent(ButtonTabComponent.this);

if(i != -1)

//得到当前panel的名字(实际是tab的名字)

return pane.getTitleAt(i);

return null;

}

};

label.setBorder(BorderFactory.createEmptyBorder(0,0,0,5));

add(label);

//创建关闭按钮(就是那个差按键)

JButton button = new TabButton();

add(button);

setBorder(BorderFactory.createEmptyBorder(2,0,0,0));

}

private class TabButton extends JButton implements ActionListener{

public TabButton() {

//设置按键的大小

final int size = 17;

setPreferredSize(new Dimension(size,size));

//设置按键的提示信息

setToolTipText("关闭窗口");

//设置按键的绘制于普通按键相同

setUI(new BasicButtonUI());

//不对Button进行填充,就是按键是透明的

setContentAreaFilled(false);

//按键不能获得焦点

setFocusable(false);

//设置按键的边框为雕刻样式

setBorder(BorderFactory.createEtchedBorder());

//系统不自动绘制按键边界(这个边界在鼠标放上去之后才绘制)

setBorderPainted(false);

//添加按键点击事件

addActionListener(TabButton.this);

//添加鼠标事件(主要是mouseover 和 mouse exit)

addMouseListener(mouseListener);

}

//重写Button的绘制函数

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

//创建一个graphics2D,因为需要在Button上画差

Graphics2D g2 = (Graphics2D) g.create();

//设置画笔,宽度为2

g2.setStroke(new BasicStroke(2));

//设置画笔颜色

g2.setColor(Color.BLACK);

//当鼠标移动到Button上时,画笔为紫色

if(getModel().isRollover())

g2.setColor(Color.PINK);

//绘制差

int delta = 6;

g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);

g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);

//释放画笔资源

g2.dispose();

}

@Override

public void actionPerformed(ActionEvent arg0) {

//当按键被点击,关闭当前标签页

int i = pane.indexOfTabComponent(ButtonTabComponent.this);

if(i != -1)

pane.remove(i);

}

private final MouseListener mouseListener = new MouseAdapter() {

@Override

public void mouseEntered(MouseEvent event) {

//鼠标移入按键,绘制按键边界

Component c = event.getComponent();

if(c instanceof AbstractButton)

((AbstractButton)c).setBorderPainted(true);

}

@Override

public void mouseExited(MouseEvent event) {

//鼠标移出按键,不绘制按键边界

Component c = event.getComponent();

if(c instanceof AbstractButton)

((AbstractButton)c).setBorderPainted(false);

}

};

}

}

java tabpanel_java cs tab点击切换标签的实现 panel相关推荐

  1. 【java毕业设计】基于java+swing+CS的图书销售管理系统GUI设计与实现(毕业论文+程序源码)——图书销售管理系统

    基于java+swing+CS的图书销售管理系统GUI设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+CS的图书销售管理系统GUI设计与实现,文章末尾附有本毕业设计的 ...

  2. Java实现键盘按键点击效果

    最近一个项目中实现java项目中模拟点击键盘效果,在此记录一下 使用rebot可以实现 // 创建Robot对象 Robot robot = null; try {robot = new Robot( ...

  3. 小程序 和 uni-app 实现tab点击自动居中屏幕显示

    小程序 和 uni-app 实现tab点击自动居中显示 效果 <scroll-view scroll-x class="scrollContent" :scroll-left ...

  4. 2023-02-24 Android app java 模拟控件点击事件,使用performClick方法去实现

    一.Android app java 模拟控件点击事件,使用performClick方法去实现. 二.实际使用 private TextView m_bt_connect ;m_bt_connect ...

  5. java+ADB—循环模拟点击屏幕,解放双手

    /*** @author 周伟强* @Description TODO* @date 2023/2/21 12:03* @Copyright All rights reserved.* desc:ja ...

  6. applet java_Java Applet攻击以北约为目标,Java开发人员对点击诱饵感到愤怒

    applet java 安全公司趋势科技发现了Java 8中的Java applet漏洞,该漏洞已被用来攻击北约和美国国防组织的成员. 该公司报告说 ,这是自2013年以来的首次"针对Jav ...

  7. android tab 点击,TabLayout.Tab点击事件

    1,大家都知道 android.support.design.widget.TabLayout 中的TabLayout并没有点击事件 只有addOnTabSelectedListener这个选中监听, ...

  8. python selenium使用JS新建标签(new tab)与切换标签

    以下是通用操作,不建议用快捷键的方式新开tab,因为js是通用的: from selenium import webdriverdriver = webdriver.Chrome() # 新建窗口 d ...

  9. java怎么实现tab切换_[Java教程]用javascript实现tab切换

    [Java教程]用javascript实现tab切换 0 2016-09-12 14:00:10 html代码: 111111 222222 333333 css代码:.active{ backgro ...

最新文章

  1. linux下抓包代码阿里云,10.10 linux下抓包
  2. coreldraw的线条怎么变成圆头_别再穿到处撞的小白鞋了,这五款春夏小皮鞋,不管怎么搭配都好看...
  3. 【Python实现网络爬虫】Scrapy爬取网易新闻(仅供学习交流使用!)
  4. DEBUG org.springframework.web.servlet.DispatcherServlet - Error rendering view [org.thymeleaf.spring
  5. 2018年蓝桥杯B组题E题+快排
  6. 启动FastDFS服务,使用python客户端对接fastdfs完成上传测试
  7. Unity动画系统详解5:BlendTree混合树是什么?
  8. python写小猪佩奇_【python】使用python自动画一只小猪佩奇(源码)-Go语言中文社区...
  9. 带新手玩转MVC——不讲道理就是干(下)
  10. UVALive - 3641 Leonardo's Notebook(polya计数)
  11. Kibana 自定义索引模式 Index patterns
  12. 脚本文件和函数文件的区别
  13. Apache,mysql,PHP,lanp环境
  14. ps快捷键 拿走不谢*小Lemon送你们的
  15. navigator 导航标签
  16. iPhone/iPad/Android UI尺寸规范
  17. 重装服务器系统只装C盘,如何只重装C盘的系统?
  18. 商业模式分析——3W2H分析法
  19. Android异步加载图像(含线程池,缓存方法)
  20. 基于HMM的语音合成理论知识

热门文章

  1. android查看控件的xml属性,006 Android XML 控件属性设置技巧汇总
  2. android系统的测试方法,运行测试  |  Android 开源项目  |  Android Open Source Project...
  3. BAD PASSWORD 解决方法
  4. 人工智能可落地项目总结
  5. python等差分解一个数
  6. 使用 vscode 调试前端代码
  7. 字符转换指令tr,col,expand
  8. python安装easy_install和pip
  9. Framework启动过程浅析
  10. Kotlin, Android的Swift