自定义JTabbedPane皮肤

package ui;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Paint;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.Icon;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicTabbedPaneUI;

/**
 * 
 * @Description
 * @author zhangzuoqiang
 * @Email [email protected]
 * @time 2012-3-22 上午10:36:21
 * @do
 * @Modify
 */
public class EclipseTabbedPaneUI extends BasicTabbedPaneUI {

	private static final Color SELECTED_TAB_COLOR = new Color(10, 36, 106);
	private static final int TAB_MINIMUM_SIZE = 8;

	@Override
	protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex,
			int x, int y, int w, int h, boolean isSelected) {
		g.setColor(Color.GRAY);
		if (tabPlacement == BOTTOM) {
			g.drawLine(x, y + h, x + w, y + h);
		}

		// right
		g.drawLine(x + w - 1, y, x + w - 1, y + h);

		if (tabPlacement == TOP) {
			// And a white line to the left and top
			g.setColor(Color.WHITE);
			g.drawLine(x, y, x, y + h);
			g.drawLine(x, y, x + w - 2, y);
		}

		if (tabPlacement == BOTTOM && isSelected) {
			g.setColor(Color.WHITE);
			// Top
			g.drawLine(x + 1, y + 1, x + 1, y + h);
			// Right
			g.drawLine(x + w - 2, y, x + w - 2, y + h);
			// Left
			g.drawLine(x + 1, y + 1, x + w - 2, y + 1);
			// Bottom
			g.drawLine(x + 1, y + h - 1, x + w - 2, y + h - 1);
		}
	}

	protected void paintTab(Graphics g, int tabPlacement, Rectangle[] rects,
			int tabIndex, Rectangle iconRect, Rectangle textRect) {
		super.paintTab(g, tabPlacement, rects, tabIndex, iconRect, textRect);

		Rectangle rect = rects[tabIndex];

		g.setColor(Color.black);
		// 绘制边框
		g.drawRect(rect.x + rect.width - 16, rect.y + 4, 13, 12);

		g.drawLine(rect.x + rect.width - 16, rect.y + 7, rect.x + rect.width
				- 10, rect.y + 13);
		g.drawLine(rect.x + rect.width - 10, rect.y + 7, rect.x + rect.width
				- 16, rect.y + 13);
		g.drawLine(rect.x + rect.width - 15, rect.y + 7, rect.x + rect.width
				- 9, rect.y + 13);
		g.drawLine(rect.x + rect.width - 9, rect.y + 7, rect.x + rect.width
				- 15, rect.y + 13);
	}

	/**
	 * Give selected tab blue color with a gradient!!.
	 * 
	 * FIXME: with Plastic L&F the unselected background is too dark
	 */
	@Override
	protected void paintTabBackground(Graphics g, int tabPlacement,
			int tabIndex, int x, int y, int w, int h, boolean isSelected) {
		Color color = UIManager.getColor("control");
		if (isSelected) {
			if (tabPlacement == TOP) {
				Graphics2D g2 = (Graphics2D) g;
				Paint storedPaint = g2.getPaint();
				g2.setPaint(new GradientPaint(x, y, SELECTED_TAB_COLOR, x + w,
						y + h, color));
				g2.fillRect(x, y, w, h);
				g2.setPaint(storedPaint);
			}
		} else {
			g.setColor(color);
			g.fillRect(x, y, w - 1, h);
		}
	}

	/**
	 * Do not paint a focus indicator.
	 */
	@Override
	protected void paintFocusIndicator(Graphics arg0, int arg1,
			Rectangle[] arg2, int arg3, Rectangle arg4, Rectangle arg5,
			boolean arg6) {
		// Leave it
	}

	/**
	 * We do not want the tab to "lift up" when it is selected.
	 */
	@Override
	protected void installDefaults() {
		super.installDefaults();
		tabAreaInsets = new Insets(0, 100, 0, 0);
		selectedTabPadInsets = new Insets(0, 0, 0, 0);
		contentBorderInsets = new Insets(1, 0, 0, 0);
	}

	/**
	 * Nor do we want the label to move.
	 */
	@Override
	protected int getTabLabelShiftY(int tabPlacement, int tabIndex,
			boolean isSelected) {
		return 0;
	}

	/**
	 * Increase the tab height a bit
	 */
	@Override
	protected int calculateTabHeight(int tabPlacement, int tabIndex,
			int fontHeight) {
		return fontHeight + 10;
	}

	@Override
	protected void layoutLabel(int arg0, FontMetrics arg1, int arg2,
			String arg3, Icon arg4, Rectangle arg5, Rectangle arg6,
			Rectangle arg7, boolean arg8) {
		super.layoutLabel(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
	}

	/**
	 * Selected labels have a white color.
	 */
	@Override
	protected void paintText(Graphics g, int tabPlacement, Font font,
			FontMetrics metrics, int tabIndex, String title,
			Rectangle textRect, boolean isSelected) {
		if (isSelected && tabPlacement == TOP) {
			g.setColor(Color.WHITE);
		} else {
			g.setColor(Color.BLACK);
		}
		if (title.length() > TAB_MINIMUM_SIZE) {
			title = "..."
					+ title.substring(title.length() - TAB_MINIMUM_SIZE + 3,
							title.length());
			textRect.x += 14;
		}
		// Font tabFont = new Font("微软雅黑", Font.BOLD, 11);
		// g.setFont(tabFont);
		g.drawString(title, textRect.x - 8, textRect.y + metrics.getAscent());
	}

	@Override
	protected int calculateTabWidth(int tabPlacement, int tabIndex,
			FontMetrics metrics) {
		int taille = 0;
		String title = tabPane.getTitleAt(tabIndex);

		if (title.length() > TAB_MINIMUM_SIZE) {
			taille = SwingUtilities.computeStringWidth(
					metrics,
					(title.substring(title.length() - TAB_MINIMUM_SIZE,
							title.length()))) + 3;
		} else {
			taille = super.calculateTabWidth(tabPlacement, tabIndex, metrics);
		}

		return taille;
	}

	@Override
	protected void paintContentBorderTopEdge(Graphics g, int tabPlacement,
			int selectedIndex, int x, int y, int w, int h) {
		if (selectedIndex != -1 && tabPlacement == TOP) {
			g.setColor(Color.GRAY);
			g.drawLine(x, y, x + w, y);
		}
	}

	@Override
	protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement,
			int selectedIndex, int x, int y, int w, int h) {
		g.setColor(Color.GRAY);
		g.drawLine(x, y + h, x + w, y + h);
	}

	@Override
	protected void paintContentBorderLeftEdge(Graphics g, int tabPlacement,
			int selectedIndex, int x, int y, int w, int h) {
		// do nothingx, y, x, y + h);
	}

	@Override
	protected void paintContentBorderRightEdge(Graphics g, int tabPlacement,
			int selectedIndex, int x, int y, int w, int h) {
		// do nothing
	}

	@Override
	protected MouseListener createMouseListener() {
		return new CloseHandler();
	}

	class CloseHandler extends MouseHandler {
		public CloseHandler() {
			super();
		}

		public void mouseReleased(MouseEvent e) {
			int x = e.getX();
			int y = e.getY();
			int tabIndex = -1;
			int tabCount = tabPane.getTabCount();
			for (int i = 0; i < tabCount; i++) {
				if (rects[i].contains(x, y)) {
					tabIndex = i;
					break;
				}
			}

			if (tabIndex >= 0 && !e.isPopupTrigger()) {
				Rectangle tabRect = rects[tabIndex];
				y = y - tabRect.y;
				if ((x >= tabRect.x + tabRect.width - 18)
						&& (x <= tabRect.x + tabRect.width - 8) && (y >= 5)
						&& (y <= 15)) {
					tabPane.remove(tabIndex);
				}
			}
		}
	}

}
package app;

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.Random;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.border.Border;

import ui.EclipseTabbedPaneUI;

public class Flipper extends JFrame implements ActionListener {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private final GridBagConstraints constraints;
	private final JTextField headsText, totalText, devText;
	private final Border border = BorderFactory.createLoweredBevelBorder();
	private final JButton startButton, stopButton;
	private FlipTask flipTask;
	private JPanel top;
	private JTabbedPane tabbedPane;

	private JTextField makeText() {
		JTextField t = new JTextField(20);
		t.setEditable(false);
		t.setHorizontalAlignment(JTextField.RIGHT);
		t.setBorder(border);
		top.add(t, constraints);
		return t;
	}

	private JButton makeButton(String caption) {
		JButton b = new JButton(caption);
		b.setActionCommand(caption);
		b.addActionListener(this);
		top.add(b, constraints);
		return b;
	}

	private JTabbedPane makeTabbedPane() {
		JTabbedPane tPane = new JTabbedPane();
		tPane.setTabPlacement(JTabbedPane.TOP);
		tPane.setBorder(null);
		tPane.setUI(new EclipseTabbedPaneUI());

		tPane.addTab("库存页面库存页面库存页面", new JPanel());
		tPane.addTab("库存页面库存页面", new JPanel());
		tPane.addTab("库存页面", new JPanel());
		tPane.addTab("库存页面库存页面库存页面", new JPanel());
		tPane.addTab("库存页面库存页面", new JPanel());

		return tPane;
	}

	public Flipper() {
		super("Flipper");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// Make text boxes
		getContentPane().setLayout(new BorderLayout());
		top = new JPanel(new GridBagLayout());
		constraints = new GridBagConstraints();
		constraints.insets = new Insets(3, 10, 3, 10);
		headsText = makeText();
		totalText = makeText();
		devText = makeText();

		// Make buttons
		startButton = makeButton("Start");
		stopButton = makeButton("Stop");
		stopButton.setEnabled(false);

		tabbedPane = makeTabbedPane();

		getContentPane().add(top, BorderLayout.NORTH);
		getContentPane().add(tabbedPane, BorderLayout.SOUTH);

		// Display the window.
		pack();
		setVisible(true);
	}

	private static class FlipPair {
		private final long heads, total;

		FlipPair(long heads, long total) {
			this.heads = heads;
			this.total = total;
		}
	}

	private class FlipTask extends SwingWorker<Void, FlipPair> {
		@Override
		protected Void doInBackground() {
			long heads = 0;
			long total = 0;
			Random random = new Random();
			while (!isCancelled()) {
				total++;
				if (random.nextBoolean()) {
					heads++;
				}
				publish(new FlipPair(heads, total));
			}
			return null;
		}

		@Override
		protected void process(List<FlipPair> pairs) {
			FlipPair pair = pairs.get(pairs.size() - 1);
			headsText.setText(String.format("%d", pair.heads));
			totalText.setText(String.format("%d", pair.total));
			devText.setText(String.format("%.10g", ((double) pair.heads)
					/ ((double) pair.total) - 0.5));
		}
	}

	public void actionPerformed(ActionEvent e) {
		if ("Start" == e.getActionCommand()) {
			startButton.setEnabled(false);
			stopButton.setEnabled(true);
			(flipTask = new FlipTask()).execute();
		} else if ("Stop" == e.getActionCommand()) {
			startButton.setEnabled(true);
			stopButton.setEnabled(false);
			flipTask.cancel(true);
			flipTask = null;
		}

	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new Flipper();
			}
		});
	}
}
 

 

你可能感兴趣的:(自定义)