java tabpanel_java cs tab点击切换标签的实现 panel
代码实现效果如下
主界面的类如下
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相关推荐
- 【java毕业设计】基于java+swing+CS的图书销售管理系统GUI设计与实现(毕业论文+程序源码)——图书销售管理系统
基于java+swing+CS的图书销售管理系统GUI设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+CS的图书销售管理系统GUI设计与实现,文章末尾附有本毕业设计的 ...
- Java实现键盘按键点击效果
最近一个项目中实现java项目中模拟点击键盘效果,在此记录一下 使用rebot可以实现 // 创建Robot对象 Robot robot = null; try {robot = new Robot( ...
- 小程序 和 uni-app 实现tab点击自动居中屏幕显示
小程序 和 uni-app 实现tab点击自动居中显示 效果 <scroll-view scroll-x class="scrollContent" :scroll-left ...
- 2023-02-24 Android app java 模拟控件点击事件,使用performClick方法去实现
一.Android app java 模拟控件点击事件,使用performClick方法去实现. 二.实际使用 private TextView m_bt_connect ;m_bt_connect ...
- java+ADB—循环模拟点击屏幕,解放双手
/*** @author 周伟强* @Description TODO* @date 2023/2/21 12:03* @Copyright All rights reserved.* desc:ja ...
- applet java_Java Applet攻击以北约为目标,Java开发人员对点击诱饵感到愤怒
applet java 安全公司趋势科技发现了Java 8中的Java applet漏洞,该漏洞已被用来攻击北约和美国国防组织的成员. 该公司报告说 ,这是自2013年以来的首次"针对Jav ...
- android tab 点击,TabLayout.Tab点击事件
1,大家都知道 android.support.design.widget.TabLayout 中的TabLayout并没有点击事件 只有addOnTabSelectedListener这个选中监听, ...
- python selenium使用JS新建标签(new tab)与切换标签
以下是通用操作,不建议用快捷键的方式新开tab,因为js是通用的: from selenium import webdriverdriver = webdriver.Chrome() # 新建窗口 d ...
- java怎么实现tab切换_[Java教程]用javascript实现tab切换
[Java教程]用javascript实现tab切换 0 2016-09-12 14:00:10 html代码: 111111 222222 333333 css代码:.active{ backgro ...
最新文章
- linux下抓包代码阿里云,10.10 linux下抓包
- coreldraw的线条怎么变成圆头_别再穿到处撞的小白鞋了,这五款春夏小皮鞋,不管怎么搭配都好看...
- 【Python实现网络爬虫】Scrapy爬取网易新闻(仅供学习交流使用!)
- DEBUG org.springframework.web.servlet.DispatcherServlet - Error rendering view [org.thymeleaf.spring
- 2018年蓝桥杯B组题E题+快排
- 启动FastDFS服务,使用python客户端对接fastdfs完成上传测试
- Unity动画系统详解5:BlendTree混合树是什么?
- python写小猪佩奇_【python】使用python自动画一只小猪佩奇(源码)-Go语言中文社区...
- 带新手玩转MVC——不讲道理就是干(下)
- UVALive - 3641 Leonardo's Notebook(polya计数)
- Kibana 自定义索引模式 Index patterns
- 脚本文件和函数文件的区别
- Apache,mysql,PHP,lanp环境
- ps快捷键 拿走不谢*小Lemon送你们的
- navigator 导航标签
- iPhone/iPad/Android UI尺寸规范
- 重装服务器系统只装C盘,如何只重装C盘的系统?
- 商业模式分析——3W2H分析法
- Android异步加载图像(含线程池,缓存方法)
- 基于HMM的语音合成理论知识
热门文章
- android查看控件的xml属性,006 Android XML 控件属性设置技巧汇总
- android系统的测试方法,运行测试 | Android 开源项目 | Android Open Source Project...
- BAD PASSWORD 解决方法
- 人工智能可落地项目总结
- python等差分解一个数
- 使用 vscode 调试前端代码
- 字符转换指令tr,col,expand
- python安装easy_install和pip
- Framework启动过程浅析
- Kotlin, Android的Swift