Swing中有JTabelPane也签面板可以使用,但是面板不带有关闭按钮,为了模仿eclipse里面打开代码窗口关闭的效果,需要在JTabelpane上面也加一个关闭的"X"效果。由于自己Swing水平还比较有限,于是到网上找了一个开源的,开源Swing控件的名称为OpenSwing.OpenSwing对Swing常用的一些Swing空间做了封装,使用起来还是比较方便的。如果您对Swing有兴趣也可以参考OpenSwing的实现自己做几个方便自己用。OpenSwing自带的JCloseableTabbedPane带的关闭按钮带有立体效果。我略作了修改将立体效果去掉了。
1、没修改前效果
2、Nimbus样式效果,还是Nimbus样式好看
3、第二个页签"X"显示和其他不一样
这里的效果是有代码中的
tab.setIconDrawCenter(1, false);
这句话设置的,如果想和其他效果一样,注释掉该行代码即可。
4、最后效果样式
5、代码如下:
package gui;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
/**
* <p>Title: OpenSwing</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: </p>
* @author <a href="mailto:sunkingxie@hotmail.com">SunKing</a>
* @version 1.0
*/
public class JCloseableTabbedPane extends JTabbedPane implements Serializable{
public static final String ON_TAB_CLOSE = "ON_TAB_CLOSE";
public static final String ON_TAB_DOUBLECLICK = "ON_TAB_DOUBLECLICK";
private JPopupMenu popup = null;
public JCloseableTabbedPane(){
super();
init();
}
public JCloseableTabbedPane(int tabPlacement){
super(tabPlacement);
init();
}
public JCloseableTabbedPane(int tabPlacement, int tabLayoutPolicy){
super(tabPlacement, tabLayoutPolicy);
init();
}
protected void init(){
addMouseListener(new DefaultMouseAdapter());
}
public void setPopup(JPopupMenu popup){
this.popup = popup;
}
public void setIconDrawCenter(int index, boolean drawCenter){
((CloseIcon)getIconAt(index)).setDrawCenter(drawCenter);
repaint();
}
public JPopupMenu getPopup(){
return popup;
}
public boolean isDrawCenter(int index){
return((CloseIcon)getIconAt(index)).isDrawCenter();
}
protected EventListenerList closeListenerList = new EventListenerList();
public void addCloseListener(ActionListener l){
closeListenerList.add(ActionListener.class, l);
}
public void removeCloseListener(ActionListener l){
closeListenerList.remove(ActionListener.class, l);
}
protected void fireClosed(ActionEvent e){
Object[] listeners = closeListenerList.getListenerList();
for(int i = listeners.length - 2; i >= 0; i -= 2){
if(listeners[i] == ActionListener.class){
((ActionListener)listeners[i + 1]).actionPerformed(e);
}
}
}
class DefaultMouseAdapter extends MouseAdapter{
CloseIcon icon;
public void mousePressed(MouseEvent e){
int index = indexAtLocation(e.getX(), e.getY());
if(index != -1){
icon = (CloseIcon)getIconAt(index);
if(icon.getBounds().contains(e.getPoint())){
icon.setPressed(true);
fireClosed(new ActionEvent(
e.getComponent(),
ActionEvent.ACTION_PERFORMED,
ON_TAB_CLOSE));
} else if(e.getClickCount() == 2){
fireClosed(new ActionEvent(
e.getComponent(),
ActionEvent.ACTION_PERFORMED,
ON_TAB_DOUBLECLICK));
}
}
}
@Override
public void mouseEntered(MouseEvent e) {
int index = indexAtLocation(e.getX(), e.getY());
if(index != -1){
icon = (CloseIcon)getIconAt(index);
if(icon.getBounds().contains(e.getPoint())){
}
}
}
public void mouseReleased(MouseEvent e){
if(icon != null){
icon.setPressed(false);
icon = null;
repaint();
}
if(popup != null){
if(!SwingUtilities.isRightMouseButton(e)){
return;
}
if(indexAtLocation(e.getX(), e.getY()) != -1){
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
}
public Icon getIconAt(int index){
Icon icon = super.getIconAt(index);
if(icon == null || !(icon instanceof CloseIcon)){
super.setIconAt(index, new CloseIcon());
}
return super.getIconAt(index);
}
class CloseIcon implements Icon{
Rectangle rec = new Rectangle(0, 0, 15, 16);
private boolean pressed = false;
private boolean drawCenter = true;
public synchronized void paintIcon(
Component c, Graphics g, int x1, int y1){
int x = x1+5, y = y1;
if(pressed){
x++;
y++;
}
rec.x = x;
rec.y = y;
Color oldColor =Color.WHITE;
//去掉按钮立体形状
/* g.setColor(UIManager.getColor("TabbedPane.highlight"));
g.drawLine(x, y, x, y + rec.height);
g.drawLine(x, y, x + rec.width, y);
g.setColor(UIManager.getColor("TabbedPane.shadow"));
g.drawLine(x, y + rec.height, x + rec.width, y + rec.height);
g.drawLine(x + rec.width, y, x + rec.width, y + rec.height);
g.setColor(UIManager.getColor("TabbedPane.foreground"));*/
//draw X
//left top
g.drawRect(x + 4, y + 4, 1, 1);
g.drawRect(x + 5, y + 5, 1, 1);
g.drawRect(x + 5, y + 9, 1, 1);
g.drawRect(x + 4, y + 10, 1, 1);
//center
if(drawCenter){
g.drawRect(x + 6, y + 6, 1, 1);
g.drawRect(x + 8, y + 6, 1, 1);
g.drawRect(x + 6, y + 8, 1, 1);
g.drawRect(x + 8, y + 8, 1, 1);
}
//right top
g.drawRect(x + 10, y + 4, 1, 1);
g.drawRect(x + 9, y + 5, 1, 1);
//right bottom
g.drawRect(x + 9, y + 9, 1, 1);
g.drawRect(x + 10, y + 10, 1, 1);
g.setColor(oldColor);
}
private void drawRec(Graphics g, int x, int y){
g.drawRect(x, y, 1, 1);
}
public Rectangle getBounds(){
return rec;
}
public void setBounds(Rectangle rec){
this.rec = rec;
}
public int getIconWidth(){
return rec.width;
}
public int getIconHeight(){
return rec.height;
}
public void setPressed(boolean pressed){
this.pressed = pressed;
}
public void setDrawCenter(boolean drawCenter){
this.drawCenter = drawCenter;
}
public boolean isPressed(){
return pressed;
}
public boolean isDrawCenter(){
return drawCenter;
}
};
/**
* 测试
* @param args String[]
*/
public static void main(String[] args){
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
}
catch (Exception e) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("JCloseableTabbedPane Demo");
frame.getContentPane().setLayout(new BorderLayout());
final JCloseableTabbedPane tab = new JCloseableTabbedPane();
tab.add(new JPanel(), "TabbedPane");
tab.add(new JPanel(), "Has");
tab.add(new JPanel(), "Popup");
tab.add(new JPanel(), "PopupMenu");
// tab.setIconDrawCenter(1, false);
//添加关闭按钮事件
tab.addCloseListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(e.getActionCommand().equals(tab.ON_TAB_CLOSE)){
tab.removeTabAt(tab.getSelectedIndex());
}
}
});
//设置弹出菜单
JPopupMenu menu = new JPopupMenu();
for(int i = 0; i < 10; i++){
menu.add(new JMenuItem("item "+i));
}
tab.setPopup(menu);
frame.getContentPane().add(tab, BorderLayout.CENTER);
frame.setSize(400, 320);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation((d.width - frame.getSize().width) / 2,
(d.height - frame.getSize().height) / 2);
frame.setVisible(true);
}
}
慢慢研究Swing还是很强大的,很多电信级别的网管软件就都是Swing做出来的。
同时发布在其他Blog。
- 大小: 4.2 KB
- 大小: 5.4 KB
- 大小: 5.5 KB
分享到:
相关推荐
根据给定的信息,本文将详细解释如何在Java Swing框架中创建具有圆角效果的自定义按钮。这将涉及Swing的基本概念、自定义组件的方法以及如何实现特定的视觉效果。 ### Swing简介 Swing是Java平台的一个图形用户...
Java编程实现swing圆形按钮实例代码 Java编程实现swing圆形按钮实例代码主要介绍了Java编程实现swing圆形按钮实例代码,涉及两个简单的Java实现按钮的代码,其中一个具有侦测点击事件的简单功能,具有一定借鉴价值...
在Java的Swing库中,鼠标事件(Mouse Events)是用户与GUI组件交互的重要部分,而loading效果则通常指的是在处理耗时操作时显示的一种视觉指示,以告知用户程序正在运行且尚未完成。本篇文章将深入探讨如何在Swing...
这个特定的项目是关于如何在`JTabbedPane`的每个选项卡上添加一个关闭按钮,使得用户能够动态地移除不需要的面板。这通常涉及到自定义`JPanel`和利用事件处理机制来实现这一功能。 首先,让我们深入了解一下`...
java Swing panel button左右滑动效果
在 Swing 中,按钮(Button)是用户交互的基础元素之一,常用于触发特定的操作或事件。本篇文章将深入探讨 Swing 中按钮的使用方法。 一、JButton 类的创建与设置 在 Swing 中,按钮组件是由 javax.swing.JButton ...
本示例主要关注如何实现一个特殊的Swing按钮功能:允许用户通过鼠标拖动来改变按钮在窗口中的位置。 首先,我们需要创建一个自定义的JButton子类,这个子类将扩展Swing的JButton类,并添加额外的拖动功能。我们可以...
Swing 菱形水晶按钮,鼠标淡入淡出效果。
在Java Swing库中,`JToggleButton`是一种特殊类型的按钮,它可以有两种或多种状态,并且用户可以通过点击来切换这些状态。这种按钮通常用于实现开关或选择的功能,就像iOS风格的开关那样,点击一次开关打开,再次...
java swing JButton 圆角按钮 带变色(有注释,简单易懂适用于初学者 程序可直接运行)
在Java的Swing库中,开发用户界面时经常会用到文件选择、按钮控件和弹出窗口等功能。这些是构建图形用户界面(GUI)的基本组件,使得用户能够与应用程序进行交互。下面我们将深入探讨这些主题。 1. **文件选择**: ...
在Swing中,菜单按钮是创建交互式用户界面的关键元素,尤其是对于那些需要多个操作选项的应用程序。本教程将深入讲解Java Swing中的菜单按钮及其使用方法,非常适合初学者。 一、JMenuBar与JMenu 在Swing中,菜单...
Java Swing JButton 按钮的实现示例 Java Swing JButton 按钮是 Java 中最常用的 GUI 组件之一,用于在用户界面中提供交互方式。JButton 按钮可以根据需要自定义外观和行为,下面将对 JButton 按钮的实现示例进行...
在Java的Swing库中,`JTable`是用于创建数据网格视图的重要组件,它允许用户以表格的形式查看和操作数据。而`JButton`则是一个常用的按钮控件,通常用于触发某些动作或事件。将`JButton`添加到`JTable`中可以为用户...
java Swing多Jpanel仿安卓苹果桌面动态切换滑动效果
Swing重绘按钮为任意形状图案的方法 Swing是Java语言中一个强大的图形用户界面工具包,它提供了丰富的GUI组件和布局管理器,能够帮助开发者快速构建复杂的图形用户界面。然而,Swing自带的Metal按钮风格并不是很...
本篇文章将详细讲解如何利用Swing来实现自定义按钮,特别是根据不同形状的图片来绘制按钮,并赋予按钮三种状态(默认、鼠标悬停和按下)的样式。 首先,我们要了解Swing中的JButton类,它是用于创建按钮的基本组件...
Java Swing 中的 JToggleButton 组件是一个非常实用的开关按钮控件,它可以实现按钮的两种状态(选中和未选中),以达到开关切换的效果。在本文中,我们将详细介绍 JToggleButton 的实现,包括其构造方法、常用方法...
标题提到的"swing带滚动条的多选下拉选择框(name code形式)"就是一个典型的例子,它允许用户在下拉菜单中选择多个项目,每个项目的显示名称(name)和对应的实际值(code)是分开定义的。 首先,我们需要理解...