`
saram
  • 浏览: 45697 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Swing带关闭按钮的JTabelpane效果

阅读更多

 

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
2
1
分享到:
评论
1 楼 cclsw07 2011-01-24  
再做个右键类似eclipse上右键的功能~~

相关推荐

    swing圆角矩形按钮

    根据给定的信息,本文将详细解释如何在Java Swing框架中创建具有圆角效果的自定义按钮。这将涉及Swing的基本概念、自定义组件的方法以及如何实现特定的视觉效果。 ### Swing简介 Swing是Java平台的一个图形用户...

    Java编程实现swing圆形按钮实例代码

    Java编程实现swing圆形按钮实例代码 Java编程实现swing圆形按钮实例代码主要介绍了Java编程实现swing圆形按钮实例代码,涉及两个简单的Java实现按钮的代码,其中一个具有侦测点击事件的简单功能,具有一定借鉴价值...

    swing 鼠标事件 loading效果

    在Java的Swing库中,鼠标事件(Mouse Events)是用户与GUI组件交互的重要部分,而loading效果则通常指的是在处理耗时操作时显示的一种视觉指示,以告知用户程序正在运行且尚未完成。本篇文章将深入探讨如何在Swing...

    带关闭按钮的JTabbedPane

    这个特定的项目是关于如何在`JTabbedPane`的每个选项卡上添加一个关闭按钮,使得用户能够动态地移除不需要的面板。这通常涉及到自定义`JPanel`和利用事件处理机制来实现这一功能。 首先,让我们深入了解一下`...

    java Swing panel button左右滑动效果

    java Swing panel button左右滑动效果

    Swing 按钮的使用

    在 Swing 中,按钮(Button)是用户交互的基础元素之一,常用于触发特定的操作或事件。本篇文章将深入探讨 Swing 中按钮的使用方法。 一、JButton 类的创建与设置 在 Swing 中,按钮组件是由 javax.swing.JButton ...

    Swing导航按钮——鼠标拖动按钮变换位置

    本示例主要关注如何实现一个特殊的Swing按钮功能:允许用户通过鼠标拖动来改变按钮在窗口中的位置。 首先,我们需要创建一个自定义的JButton子类,这个子类将扩展Swing的JButton类,并添加额外的拖动功能。我们可以...

    Swing 菱形水晶按钮

    Swing 菱形水晶按钮,鼠标淡入淡出效果。

    swing JToggleButton开关按钮

    在Java Swing库中,`JToggleButton`是一种特殊类型的按钮,它可以有两种或多种状态,并且用户可以通过点击来切换这些状态。这种按钮通常用于实现开关或选择的功能,就像iOS风格的开关那样,点击一次开关打开,再次...

    java swing JButton 圆角按钮 鼠标监听变色(有注释简单易懂可直接运行)

    java swing JButton 圆角按钮 带变色(有注释,简单易懂适用于初学者 程序可直接运行)

    Swing 文件选择&按钮控件&弹出窗口

    在Java的Swing库中,开发用户界面时经常会用到文件选择、按钮控件和弹出窗口等功能。这些是构建图形用户界面(GUI)的基本组件,使得用户能够与应用程序进行交互。下面我们将深入探讨这些主题。 1. **文件选择**: ...

    java swing 菜单按钮

    在Swing中,菜单按钮是创建交互式用户界面的关键元素,尤其是对于那些需要多个操作选项的应用程序。本教程将深入讲解Java Swing中的菜单按钮及其使用方法,非常适合初学者。 一、JMenuBar与JMenu 在Swing中,菜单...

    Java Swing JButton按钮的实现示例

    Java Swing JButton 按钮的实现示例 Java Swing JButton 按钮是 Java 中最常用的 GUI 组件之一,用于在用户界面中提供交互方式。JButton 按钮可以根据需要自定义外观和行为,下面将对 JButton 按钮的实现示例进行...

    Swing中JTABLE中添加JBUTTON控件

    在Java的Swing库中,`JTable`是用于创建数据网格视图的重要组件,它允许用户以表格的形式查看和操作数据。而`JButton`则是一个常用的按钮控件,通常用于触发某些动作或事件。将`JButton`添加到`JTable`中可以为用户...

    java Swing多Jpanel动态滑动切换效果

    java Swing多Jpanel仿安卓苹果桌面动态切换滑动效果

    swing重绘按钮为任意形状图案的方法

    Swing重绘按钮为任意形状图案的方法 Swing是Java语言中一个强大的图形用户界面工具包,它提供了丰富的GUI组件和布局管理器,能够帮助开发者快速构建复杂的图形用户界面。然而,Swing自带的Metal按钮风格并不是很...

    swing自定义按钮

    本篇文章将详细讲解如何利用Swing来实现自定义按钮,特别是根据不同形状的图片来绘制按钮,并赋予按钮三种状态(默认、鼠标悬停和按下)的样式。 首先,我们要了解Swing中的JButton类,它是用于创建按钮的基本组件...

    Java Swing JToggleButton开关按钮的实现

    Java Swing 中的 JToggleButton 组件是一个非常实用的开关按钮控件,它可以实现按钮的两种状态(选中和未选中),以达到开关切换的效果。在本文中,我们将详细介绍 JToggleButton 的实现,包括其构造方法、常用方法...

    swing带滚动条的多选下拉选择框(name code形式)

    标题提到的"swing带滚动条的多选下拉选择框(name code形式)"就是一个典型的例子,它允许用户在下拉菜单中选择多个项目,每个项目的显示名称(name)和对应的实际值(code)是分开定义的。 首先,我们需要理解...

Global site tag (gtag.js) - Google Analytics