JTabbedPane的选项卡自定义位置

转自:http://hi.baidu.com/newjavaee/item/77a13e4981472a0fc01613b8


找遍中国的网站几乎没有一个弄出来的,最终在一个小日本网站上找到了。

代码如下:

package com.test;
//-*- mode:java; encoding:utf8n; coding:utf-8 -*-
// vim:set fileencoding=utf-8:
//http://terai.xrea.jp/Swing/TabbedPaneWithButton.html
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.plaf.synth.*;
class NewClass2 extends JPanel {
    private final JTabbedPane tabs;
    public NewClass2() {
        super(new BorderLayout());
        //famfamfam.com: Mini Icons>http://www.famfamfam.com/lab/icons/mini/
        ImageIcon icon = new ImageIcon(getClass().getResource("page_new.gif"));
        JButton b = new ToolBarButton(icon);
        b.addActionListener(new ActionListener() {
            @Override public void actionPerformed(ActionEvent e) {
                tabs.addTab("qwerqwer", new JLabel("yetyet"));
            }
        });
        b.setBorder(BorderFactory.createEmptyBorder(3,3,3,3));
        UIManager.put("TabbedPane.tabAreaInsets", getButtonPaddingTabAreaInsets(b));
        tabs = new ClippedTitleTabbedPane();
        tabs.addTab("asdfasd", new JLabel("456746"));
        tabs.addTab("1234123", new JScrollPane(new JTree()));
        tabs.addTab("6780969", new JLabel("zxcvzxc"));
        final JPanel p = new JPanel();
        p.setLayout(new OverlayLayout(p));
        b.setAlignmentX(0.0f);
        b.setAlignmentY(0.0f);
        tabs.setAlignmentX(0.0f);
        tabs.setAlignmentY(0.0f);
        p.add(b);
        p.add(tabs);
        JMenuBar menubar = new JMenuBar();
        JMenu m1 = new JMenu("Tab");
        m1.add(new AbstractAction("removeAll") {
            @Override public void actionPerformed(ActionEvent e) {
                tabs.removeAll();
            }
        });
        menubar.add(m1);
        menubar.add(new JMenu("Dummy1"));
        menubar.add(new JMenu("Dummy2"));
        add(menubar, BorderLayout.NORTH);
        add(p);
        setPreferredSize(new Dimension(320, 180));
    }
    public Insets getButtonPaddingTabAreaInsets(JButton b) {
        Insets ti = getTabInsets();
        Insets ai = getTabAreaInsets();
        FontMetrics fm = b.getFontMetrics(b.getFont());
        int tih = b.getPreferredSize().height-fm.getHeight()-ti.top-ti.bottom-ai.bottom;
        return new Insets(Math.max(ai.top, tih), b.getPreferredSize().width+ai.left, ai.bottom, ai.right);
    }
    private static Insets getTabInsets() {
        Insets i = UIManager.getInsets("TabbedPane.tabInsets");
        if(i!=null) {
            return i;
        }else{
            JTabbedPane tabbedPane = new JTabbedPane();
            SynthStyle style = SynthLookAndFeel.getStyle(tabbedPane, Region.TABBED_PANE_TAB);
            SynthContext context = new SynthContext(tabbedPane, Region.TABBED_PANE_TAB, style, SynthConstants.ENABLED);
            return style.getInsets(context, null);
        }
    }
    private static Insets getTabAreaInsets() {
        Insets i = UIManager.getInsets("TabbedPane.tabAreaInsets");
        if(i!=null) {
            return i;
        }else{
            JTabbedPane tabbedPane = new JTabbedPane();
            SynthStyle style = SynthLookAndFeel.getStyle(tabbedPane, Region.TABBED_PANE_TAB_AREA);
            SynthContext context = new SynthContext(tabbedPane, Region.TABBED_PANE_TAB_AREA, style, SynthConstants.ENABLED);
            return style.getInsets(context, null);
        }
    }
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override public void run() {
                createAndShowGUI();
            }
        });
    }
    public static void createAndShowGUI() {
        try{
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        }catch(Exception e) {
            e.printStackTrace();
        }
        JFrame frame = new JFrame("TabbedPaneWithButton");
        frame.setMinimumSize(new Dimension(256, 80));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.getContentPane().add(new NewClass2());
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}
class ToolBarButton extends JButton {
    public ToolBarButton(ImageIcon icon) {
        super(icon);
        setFocusable(false);
        setContentAreaFilled(false);
        setFocusPainted(false);
        addMouseListener(new MouseAdapter() {
            @Override public void mouseEntered(MouseEvent me) {
                setContentAreaFilled(true);
            }
            @Override public void mouseExited(MouseEvent me) {
                setContentAreaFilled(false);
            }
        });
    }
}
class ClippedTitleTabbedPane extends JTabbedPane {
    public ClippedTitleTabbedPane() {
        super();
    }
    public ClippedTitleTabbedPane(int tabPlacement) {
        super(tabPlacement);
    }
    private Insets getTabInsets() {
        Insets i = UIManager.getInsets("TabbedPane.tabInsets");
        if(i!=null) {
            return i;
        }else{
            SynthStyle style = SynthLookAndFeel.getStyle(this, Region.TABBED_PANE_TAB);
            SynthContext context = new SynthContext(this, Region.TABBED_PANE_TAB, style, SynthConstants.ENABLED);
            return style.getInsets(context, null);
        }
    }
    private Insets getTabAreaInsets() {
        Insets i = UIManager.getInsets("TabbedPane.tabAreaInsets");
        if(i!=null) {
            return i;
        }else{
            SynthStyle style = SynthLookAndFeel.getStyle(this, Region.TABBED_PANE_TAB_AREA);
            SynthContext context = new SynthContext(this, Region.TABBED_PANE_TAB_AREA, style, SynthConstants.ENABLED);
            return style.getInsets(context, null);
        }
    }
    @Override public void doLayout() {
        int tabCount  = getTabCount();
        if(tabCount==0) return;
        Insets tabInsets     = getTabInsets();
        Insets tabAreaInsets = getTabAreaInsets();
        Insets insets = getInsets();
        int areaWidth = getWidth() - tabAreaInsets.left - tabAreaInsets.right - insets.left - insets.right;
        int tabWidth  = 0; // = tabInsets.left + tabInsets.right + 3;
        int gap       = 0;
        switch(getTabPlacement()) {
          case LEFT: case RIGHT:
            tabWidth = areaWidth / 4;
            gap = 0;
            break;
          case BOTTOM: case TOP: default:
            tabWidth = areaWidth / tabCount;
            gap = areaWidth - (tabWidth * tabCount);
        }
        if(tabWidth>80) {
            tabWidth = 80;
            gap = 0;
        }
        // "3" is magic number @see BasicTabbedPaneUI#calculateTabWidth
        tabWidth = tabWidth - tabInsets.left - tabInsets.right - 3;
        for(int i=0;i<tabCount;i++) {
            JComponent l = (JComponent)getTabComponentAt(i);
            if(l==null) break;
            l.setPreferredSize(new Dimension(tabWidth+(i<gap?1:0), l.getPreferredSize().height));
        }
        super.doLayout();
    }
    @Override public void insertTab(String title, Icon icon, Component component, String tip, int index) {
        super.insertTab(title, icon, component, tip==null?title:tip, index);
        JLabel label = new JLabel(title, JLabel.CENTER);
        //Dimension dim = label.getPreferredSize();
        //Insets tabInsets = getTabInsets();
        //label.setPreferredSize(new Dimension(0, dim.height+tabInsets.top+tabInsets.bottom));
        setTabComponentAt(index, label);
    }
}


运行效果图如下:




  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值