`

自定义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 z.zuoqiang@gmail.com
 * @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();
			}
		});
	}
}
 

 

分享到:
评论

相关推荐

    swing自定义JTabbedPane组件外观

    自定义`JTabbedPane`的外观可以提升应用程序的用户体验,使其更加个性化和专业。下面将详细探讨如何通过Java Swing自定义`JTabbedPane`组件的外观。 首先,我们需要了解`JTabbedPane`的基本用法。创建一个`...

    java swing jTabbedPane 自定义UI(宽、高、放大、文本、颜色、间距) 简单易懂带注释可直接运行

    java swing jTabbedPane 自定义的U,包括(宽、高、点击放大、文本字体、背景颜色、选项卡间距等) 简单易懂带注释可直接运行

    带关闭按钮的JTabbedPane

    4. **集成到UI**:最后,将自定义的`CloseableTabPanel`添加到`JTabbedPane`中,确保适配器正确地处理了选项卡的创建和显示。 示例代码可能如下所示: ```java public class CloseableTabPanel extends JPanel { ...

    netbeans实现的可关闭“JTabbedPane”

    为了解决这个问题,开发者通常需要自定义`JTabbedPane`的行为,增加关闭按钮并处理相应的事件。而NetBeans IDE提供了一个便捷的解决方案,它内置了具有关闭按钮功能的`JTabbedPane`实现。 NetBeans是一个流行的开源...

    Jtabbedpane实现多任务

    8. **设置选项卡关闭功能**:虽然`JTabbedPane`本身不支持关闭选项卡,但可以通过添加自定义组件并监听鼠标点击事件来模拟此功能。 9. **国际化支持**:`JTabbedPane`支持使用`ResourceBundle`进行国际化,允许根据...

    java swing JTabbedPane实例

    `JTabbedPane`默认不支持关闭按钮,但可以通过自定义布局和组件实现。这通常涉及到复杂的布局管理和监听器设置。 7. **自定义选项卡内容**: 除了简单的`JPanel`之外,你还可以在选项卡中放置任何Swing组件,如`...

    Java中JTabbedPane(选项卡)的用法实例

    // 添加关闭按钮(需自定义实现) tabbedPane.setTabComponentAt(0, createCloseableTabComponent(panel1)); // 监听选项卡切换 tabbedPane.addChangeListener(e -&gt; { int index = tabbedPane.getSelectedIndex();...

    选项卡面板例子JTabbedPane

    通过观察和修改代码,你可以学习到更多关于`JTabbedPane`的高级特性,比如自定义图标、添加关闭按钮、设置选项卡的可选性,以及响应选项卡切换事件等。 总之,`JTabbedPane`是Java Swing提供的一种强大工具,用于...

    带关闭按钮可定制的JTabbedPane

    带关闭按钮可定制的JTabbedPane,首先解决了java自带的UI丑的不行的问题,然后附带了可关闭按钮,这个可关闭按钮,可以在添加标签时,自定义是否出现.该资源属于网络资源,谢谢作者的无私奉献.象征性的收1点积分,因为我的...

    JTabbedPane简单示例

    一个简单的标签页实例

    增强型JTabbedPane

    "增强型JTabbedPane"是一种经过改良的`JTabbedPane`实现,它扩展了标准组件的功能,允许开发人员在选项卡的头部或尾部添加自定义的工具栏按钮。这种增强功能为用户界面设计提供了更多的灵活性,使得可以更方便地对...

    java Swing实现选项卡功能(JTabbedPane)实例代码

    在Java Swing中,`JTabbedPane` 是一个非常有用的组件,它允许开发者创建具有选项卡界面的应用程序,用户可以通过点击不同的选项卡来切换不同的视图或内容。在本实例中,我们将深入探讨如何使用`JTabbedPane` 实现...

    JTabbedPanel的标签

    标题:JTabbedPanel的标签 描述:JTabbedPanel的美化标签很详细,...这种方法不仅可以应用于JTabbedPane,还可以推广到其他Swing组件的自定义设计中,为开发者提供了强大的工具,以构建更具吸引力和专业性的用户界面。

    java swing-JTabbedPane的使用

    JTabbedPane是Swing库提供的一个选项卡面板组件。它可以在图形界面中创建多个选项卡,并在用户点击不同选项卡时显示相应的内容。

    学生成绩系统_实现成绩的查询和排序。具体要求如下:使用jtabbedpane,建立三个选项卡“成绩输入,实验内容:实现成绩的查询和排序

    具体要求如下:使用JTabbedPane,建立三个选项卡“成绩输入”、“成绩查询”、“成绩排序” ① 成绩输入:从界面上输入学生的学号和成绩,点击“确认”按钮进行保存。 ② 成绩查询:输入学生的学号,点击“查询”...

    swing-htabs:Swing 的分层选项卡

    我们正在使用一个小技巧来缩进自定义 JTabbedPane 中的选项卡组件。 它在我们的测试中运行良好,但我们需要更多的测试。 请参阅下面的贡献部分。 Metal LAF 有一个已知的小问题。 此 LAF 中的标签有一个与下一个...

    JTabbedPaneDemo.rar_Tabú

    在`JTabbedPaneDemo.java`文件中,可以看到上述步骤的具体实现,包括可能的自定义逻辑,如创建自定义的面板组件、设置布局管理器、添加按钮或其他交互元素,以及可能的事件处理代码。 此外,`JTabbedPaneDemo`可能...

    基于java的开发源码-UI皮肤 Quaqua.zip

    Quaqua是一款为Java Swing应用程序设计的用户界面(UI)皮肤库,它提供了丰富的外观和感觉,让Swing应用看起来更加美观和现代化。基于Java的开发源码Quaqua.zip包含的是Quaqua库的源代码,对于Java开发者来说,这是...

    JTab 例子介绍

    7. **自定义选项卡布局** 默认的选项卡布局可能无法满足所有需求,可以使用`setTabLayoutPolicy`方法更改布局策略: ```java tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); // 滚动布局 ...

Global site tag (gtag.js) - Google Analytics