- 浏览: 448390 次
- 性别:
- 来自: 江门
文章分类
最新评论
-
ctz_131415:
谁能告诉我这个分页控件如何添加到窗口上?谢谢了
C# Winform DataGridView 公共分页实现 -
omymy:
FrmPage_Shown是放在页面加载时的load事件里的, ...
C# Winform DataGridView 公共分页实现 -
qie:
如何使用该分页控件?
C# Winform DataGridView 公共分页实现 -
anyanlonga:
看地图干什么用啊,如果查公交的话,自认为还是白度好
Android 上创建和地图相关的应用,用 Google 地图 API 好,还是百度等第三方地图 API 好 -
dedepro:
果然很强。
CSS层 固定置顶部兼容IE6等以上浏览器
么现在来说下用法吧,首先附上网上找来的一段代码(其实在csdn里面也有这个代码的资源,不过没说怎么用),
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.FontMetrics;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Area;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JComponent;
import javax.swing.JTabbedPane;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
public class SinaTabbedPaneUI extends BasicTabbedPaneUI {
private static final Insets NO_INSETS = new Insets(0, 0, 0, 0);
private ColorSet selectedColorSet;
private ColorSet defaultColorSet;
private ColorSet hoverColorSet;
private boolean contentTopBorderDrawn = true;
private Color lineColor = new Color(158, 158, 158);
private Color dividerColor = new Color(200, 200, 200);
private Insets contentInsets = new Insets(1, 1, 1, 1);
private int lastRollOverTab = -1;
public static ComponentUI createUI(JComponent c) {
return new SinaTabbedPaneUI();
}
protected LayoutManager createLayoutManager() {
if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT) {
return super.createLayoutManager();
} else {
return new TabbedPaneLayout();
}
}
// protected void installComponents() {
// super.installComponents();
// int counts = tabPane.getComponents().length;
// for (int i = 0; i < counts; i++) {
// if (tabPane.getComponentAt(i) instanceof JPanel) {
// ((JPanel) tabPane.getComponentAt(i)).setLayout(new FlowLayout(
// 10, 0, FlowLayout.LEFT));
// ((JPanel) tabPane.getComponentAt(i)).updateUI();
// }
// }
//
// }
public SinaTabbedPaneUI() {
selectedColorSet = new ColorSet();
selectedColorSet.topGradColor1 = new Color(255,0,0);//new Color(233, 237, 248);//选中的最上层
selectedColorSet.topGradColor2 = new Color(225,225,30);//new Color(158, 199, 240);//选中的第二层
selectedColorSet.bottomGradColor1 = new Color(225,225,30);//new Color(112, 173, 239);//选中的第三层
selectedColorSet.bottomGradColor2 = new Color(255,0,0);//new Color(183, 244, 253);//选中的最下层
defaultColorSet = new ColorSet();
defaultColorSet.topGradColor1 = new Color(73,50,205);//new Color(253, 253, 253);//未选的最上层
defaultColorSet.topGradColor2 = new Color(0,255,255);//new Color(237, 237, 237);
defaultColorSet.bottomGradColor1 = new Color(0,255,255);//new Color(222, 222, 222);
defaultColorSet.bottomGradColor2 = new Color(73,50,205);//new Color(255, 255, 255);
hoverColorSet = new ColorSet();
hoverColorSet.topGradColor1 = new Color(245,245,10);//new Color(244, 244, 244);//鼠标在的时候最上层
hoverColorSet.topGradColor2 = new Color(237,18,117);//new Color(223, 223, 223);
hoverColorSet.bottomGradColor1 = new Color(5,232,255);//new Color(211, 211, 211);
hoverColorSet.bottomGradColor2 = new Color(19,236,40);//new Color(235, 235, 235);
maxTabHeight = 21;
setContentInsets(1);
}
public void setContentTopBorderDrawn(boolean b) {
contentTopBorderDrawn = b;
}
public void setContentInsets(Insets i) {
contentInsets = i;
}
public void setContentInsets(int i) {
contentInsets = new Insets(i, i, i, i);
}
// 返回当前运行的用于显示选项卡的选项卡数
public int getTabRunCount(JTabbedPane pane) {
return 1;
}
protected void installDefaults() {
super.installDefaults();
RollOverListener l = new RollOverListener();
tabPane.addMouseListener(l);
tabPane.addMouseMotionListener(l);
tabAreaInsets = NO_INSETS; // tab色insets边框
tabInsets = new Insets(0, 0, 50, 50);
}
protected boolean scrollableTabLayoutEnabled() {
return false;
}
protected Insets getContentBorderInsets(int tabPlacement) {
return contentInsets;
}
// protected Insets getTabAreaInsets(int tabPlacement) {
//
// return contentInsets;
// }
protected int calculateTabHeight(int tabPlacement, int tabIndex,
int fontHeight) {
return 21;
}
protected int calculateTabWidth(int tabPlacement, int tabIndex,
FontMetrics metrics) {
int w = super.calculateTabWidth(tabPlacement, tabIndex, metrics);
int wid = metrics.charWidth('M');
w += wid * 2;
return w;
}
protected int calculateMaxTabHeight(int tabPlacement) {
return 20;
}
protected void paintTabArea(Graphics g, int tabPlacement, int selectedIndex) {
Graphics2D g2d = (Graphics2D) g;
// g2d.setPaint(new GradientPaint(0, 0, defaultColorSet.topGradColor1,
// 0,
// 10, defaultColorSet.topGradColor2));
// g2d.fillRect(0, 0, tabPane.getWidth(), 10);
//
// g2d.setPaint(new GradientPaint(0, 10,
// defaultColorSet.bottomGradColor1,
// 0, 21, defaultColorSet.bottomGradColor2));
// g2d.fillRect(0, 10, tabPane.getWidth(), 11);
super.paintTabArea(g, tabPlacement, selectedIndex);
if (contentTopBorderDrawn) {
g2d.setColor(lineColor);
g2d.drawLine(0, 20, tabPane.getWidth() - 1, 20);
}
}
protected void paintTabBackground(Graphics g, int tabPlacement,
int tabIndex, int x, int y, int w, int h, boolean isSelected) {
Graphics2D g2d = (Graphics2D) g;
ColorSet colorSet;
Rectangle rect = rects[tabIndex];
if (isSelected) {
colorSet = selectedColorSet;
} else if (getRolloverTab() == tabIndex) {
colorSet = hoverColorSet;
} else {
colorSet = defaultColorSet;
}
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int width = rect.width;
int xpos = rect.x;
int yPos = rect.y;
if (tabIndex > -1) {
width--;
xpos++;
yPos += 2;
}
g2d.setPaint(new GradientPaint(xpos, 0, colorSet.topGradColor1, xpos,
h / 2, colorSet.topGradColor2));
g2d.fill(this.getUpArea(xpos, yPos, width, h - 2));
g2d.setPaint(new GradientPaint(0, h / 2, colorSet.bottomGradColor1, 0,
h, colorSet.bottomGradColor2));
g2d.fill(this.getDownArea(xpos, yPos, width, h - 2));
if (contentTopBorderDrawn) {
g2d.setColor(lineColor);
g2d.drawLine(rect.x, 20, rect.x + rect.width - 1, 20);
}
}
private Shape getArea(int x, int y, int w, int h) {
RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, w, h, 15, 15);
Area a = new Area(rect);
Rectangle2D rec = new Rectangle2D.Float(x, y + h / 2, w, h / 2);
Area b = new Area(rec);
a.add(b);
return a;
}
private Shape getUpArea(int x, int y, int w, int h) {
Rectangle2D rec = new Rectangle2D.Float(x, y, w, h / 2 + 1);
Area a = new Area(rec);
RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, w, h, 15, 15);
Area b = new Area(rect);
a.intersect(b);
return a;
}
private Shape getDownArea(int x, int y, int w, int h) {
Rectangle2D rec = new Rectangle2D.Float(x, y + h / 2, w, h / 2 + 1);
Area a = new Area(rec);
RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, w, h, 15, 15);
// Area b = new Area(rect);
// a.intersect(b);
return a;
}
protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex,
int x, int y, int w, int h, boolean isSelected) {
Rectangle rect = getTabBounds(tabIndex, new Rectangle(x, y, w, h));
// g.setColor(dividerColor);
Graphics2D g2 = (Graphics2D) g;
Composite old = g2.getComposite();
AlphaComposite comp = AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, 0.0f);
g2.setComposite(comp);
g2.setColor(dividerColor);
g2.drawLine(rect.x + rect.width, 0, rect.x + rect.width, 20);
g2.setComposite(old);
}
protected void paintContentBorderTopEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y, int w, int h) {
}
protected void paintContentBorderRightEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y, int w, int h) {
// Do nothing
}
protected void paintContentBorderLeftEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y, int w, int h) {
// Do nothing
}
protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y, int w, int h) {
// Do nothing
}
protected void paintFocusIndicator(Graphics g, int tabPlacement,
Rectangle[] rects, int tabIndex, Rectangle iconRect,
Rectangle textRect, boolean isSelected) {
// Do nothing
}
protected int getTabLabelShiftY(int tabPlacement, int tabIndex,
boolean isSelected) {
return 0;
}
private class ColorSet {
Color topGradColor1;
Color topGradColor2;
Color bottomGradColor1;
Color bottomGradColor2;
}
private class RollOverListener implements MouseMotionListener,
MouseListener {
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
checkRollOver();
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
checkRollOver();
}
public void mouseExited(MouseEvent e) {
tabPane.repaint();
}
private void checkRollOver() {
int currentRollOver = getRolloverTab();
if (currentRollOver != lastRollOverTab) {
lastRollOverTab = currentRollOver;
Rectangle tabsRect = new Rectangle(0, 0, tabPane.getWidth(), 20);
tabPane.repaint(tabsRect);
}
}
}
public class TabbedPaneLayout extends BasicTabbedPaneUI.TabbedPaneLayout {
public TabbedPaneLayout() {
SinaTabbedPaneUI.this.super();
}
protected void calculateTabRects(int tabPlacement, int tabCount) {
super.calculateTabRects(tabPlacement, tabCount);
for (int i = 0; i < rects.length; i++) {
rects[i].x = rects[i].x + (5 * i);
}
}
protected void padSelectedTab(int tabPlacement, int selectedIndex) {
// don't pad only the selected tab, but all the tabs, to space them.
// for (int i = 0; i < rects.length; i++) {
// Rectangle selRect = rects[i];
// Insets padInsets = getSelectedTabPadInsets(tabPlacement);
// selRect.x += padInsets.left;
// selRect.width -= (padInsets.left + padInsets.right);
// selRect.y -= padInsets.top;
// selRect.height += (padInsets.top + padInsets.bottom);
// }
}
// protected void normalizeTabRuns(int tabPlacement, int tabCount,
// int start, int max) {
// if (tabPlacement == TOP || tabPlacement == BOTTOM) {
// super.normalizeTabRuns(tabPlacement, tabCount, start, max);
// }
// }
//
// // Don't rotate runs!
// protected void rotateTabRuns(int tabPlacement, int selectedRun) {
// }
}
}
这就是那段代码了,我稍微改动了几个地方,接着的一段文字是有关这里用到得几个方法的用处
具体颜色没怎么调,贵在神似阿呵呵
下面简要说一下自定义这种Tab的关键点:
1. 每个JComponent几乎都有其UI 委托对象类,当然JTabbedPane也不例外。我们首先继承BasicTabbedPaneUI类,这其中有我们必须要重写的一个方法,具体形式如下:
public static ComponentUI createUI(JComponent c) {
return new XXXTabbedPaneUI();
}
其中XXXTabbedPaneUI就是自己实现的BasicTabbedPaneUI的子类的名字。
2.下面类出几个改变外观的重要的方法:
a. protectedvoid installDefaults() //可以改变一些BasicTabbedPaneUI中默认的属性。
b.protectedvoid paintTabArea(Graphics g, int tabPlacement, int selectedIndex) //绘制整个选项卡区域
c. protectedvoid paintTabBackground(Graphics g, int tabPlacement,
int tabIndex, int x, int y, int w, int h, boolean isSelected)
//绘制某个选项卡的背景色
d. protectedvoid paintContentBorder(Graphics g, int tabPlacement,
int selectedIndex) //绘制TabbedPane容器的四周边框样式。
e. protectedvoid paintFocusIndicator(Graphics g, int tabPlacement,
Rectangle[] rects, int tabIndex, Rectangle iconRect,
Rectangle textRect, boolean isSelected)
//绘制选中某个Tab后,获得焦点的样式。
3.默认状态下每个选择项卡是连续摆放的,那么我们怎么使得他像新浪网页里那样的Tab中间有一定间隙呢,那么我们还定义一个内部类继承BasicTabbedPaneUI的内部类TabbedPaneLayou重写calculateTabRects方法,因为具体的选项卡标签位置是由变量rects所决定的。
根据上面的介绍是不是你也想自己动手实践一下呢??那还等什么,让我们共同努力让Swing更美丽!!
也许,看到这里你还是一头雾水,写了这个那到底怎么用它呢,其实很简单,在你要用的地方设置就行了,如下
UserJTab = new JTabbedPane();
UserJTab.setTabPlacement(JTabbedPane.TOP);
UserJTab.setBorder(null);
UserJTab.setUI(new SinaTabbedPaneUI());
这里就用到了,这样刚才的效果就实现了
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.FontMetrics;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Area;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JComponent;
import javax.swing.JTabbedPane;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
public class SinaTabbedPaneUI extends BasicTabbedPaneUI {
private static final Insets NO_INSETS = new Insets(0, 0, 0, 0);
private ColorSet selectedColorSet;
private ColorSet defaultColorSet;
private ColorSet hoverColorSet;
private boolean contentTopBorderDrawn = true;
private Color lineColor = new Color(158, 158, 158);
private Color dividerColor = new Color(200, 200, 200);
private Insets contentInsets = new Insets(1, 1, 1, 1);
private int lastRollOverTab = -1;
public static ComponentUI createUI(JComponent c) {
return new SinaTabbedPaneUI();
}
protected LayoutManager createLayoutManager() {
if (tabPane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT) {
return super.createLayoutManager();
} else {
return new TabbedPaneLayout();
}
}
// protected void installComponents() {
// super.installComponents();
// int counts = tabPane.getComponents().length;
// for (int i = 0; i < counts; i++) {
// if (tabPane.getComponentAt(i) instanceof JPanel) {
// ((JPanel) tabPane.getComponentAt(i)).setLayout(new FlowLayout(
// 10, 0, FlowLayout.LEFT));
// ((JPanel) tabPane.getComponentAt(i)).updateUI();
// }
// }
//
// }
public SinaTabbedPaneUI() {
selectedColorSet = new ColorSet();
selectedColorSet.topGradColor1 = new Color(255,0,0);//new Color(233, 237, 248);//选中的最上层
selectedColorSet.topGradColor2 = new Color(225,225,30);//new Color(158, 199, 240);//选中的第二层
selectedColorSet.bottomGradColor1 = new Color(225,225,30);//new Color(112, 173, 239);//选中的第三层
selectedColorSet.bottomGradColor2 = new Color(255,0,0);//new Color(183, 244, 253);//选中的最下层
defaultColorSet = new ColorSet();
defaultColorSet.topGradColor1 = new Color(73,50,205);//new Color(253, 253, 253);//未选的最上层
defaultColorSet.topGradColor2 = new Color(0,255,255);//new Color(237, 237, 237);
defaultColorSet.bottomGradColor1 = new Color(0,255,255);//new Color(222, 222, 222);
defaultColorSet.bottomGradColor2 = new Color(73,50,205);//new Color(255, 255, 255);
hoverColorSet = new ColorSet();
hoverColorSet.topGradColor1 = new Color(245,245,10);//new Color(244, 244, 244);//鼠标在的时候最上层
hoverColorSet.topGradColor2 = new Color(237,18,117);//new Color(223, 223, 223);
hoverColorSet.bottomGradColor1 = new Color(5,232,255);//new Color(211, 211, 211);
hoverColorSet.bottomGradColor2 = new Color(19,236,40);//new Color(235, 235, 235);
maxTabHeight = 21;
setContentInsets(1);
}
public void setContentTopBorderDrawn(boolean b) {
contentTopBorderDrawn = b;
}
public void setContentInsets(Insets i) {
contentInsets = i;
}
public void setContentInsets(int i) {
contentInsets = new Insets(i, i, i, i);
}
// 返回当前运行的用于显示选项卡的选项卡数
public int getTabRunCount(JTabbedPane pane) {
return 1;
}
protected void installDefaults() {
super.installDefaults();
RollOverListener l = new RollOverListener();
tabPane.addMouseListener(l);
tabPane.addMouseMotionListener(l);
tabAreaInsets = NO_INSETS; // tab色insets边框
tabInsets = new Insets(0, 0, 50, 50);
}
protected boolean scrollableTabLayoutEnabled() {
return false;
}
protected Insets getContentBorderInsets(int tabPlacement) {
return contentInsets;
}
// protected Insets getTabAreaInsets(int tabPlacement) {
//
// return contentInsets;
// }
protected int calculateTabHeight(int tabPlacement, int tabIndex,
int fontHeight) {
return 21;
}
protected int calculateTabWidth(int tabPlacement, int tabIndex,
FontMetrics metrics) {
int w = super.calculateTabWidth(tabPlacement, tabIndex, metrics);
int wid = metrics.charWidth('M');
w += wid * 2;
return w;
}
protected int calculateMaxTabHeight(int tabPlacement) {
return 20;
}
protected void paintTabArea(Graphics g, int tabPlacement, int selectedIndex) {
Graphics2D g2d = (Graphics2D) g;
// g2d.setPaint(new GradientPaint(0, 0, defaultColorSet.topGradColor1,
// 0,
// 10, defaultColorSet.topGradColor2));
// g2d.fillRect(0, 0, tabPane.getWidth(), 10);
//
// g2d.setPaint(new GradientPaint(0, 10,
// defaultColorSet.bottomGradColor1,
// 0, 21, defaultColorSet.bottomGradColor2));
// g2d.fillRect(0, 10, tabPane.getWidth(), 11);
super.paintTabArea(g, tabPlacement, selectedIndex);
if (contentTopBorderDrawn) {
g2d.setColor(lineColor);
g2d.drawLine(0, 20, tabPane.getWidth() - 1, 20);
}
}
protected void paintTabBackground(Graphics g, int tabPlacement,
int tabIndex, int x, int y, int w, int h, boolean isSelected) {
Graphics2D g2d = (Graphics2D) g;
ColorSet colorSet;
Rectangle rect = rects[tabIndex];
if (isSelected) {
colorSet = selectedColorSet;
} else if (getRolloverTab() == tabIndex) {
colorSet = hoverColorSet;
} else {
colorSet = defaultColorSet;
}
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int width = rect.width;
int xpos = rect.x;
int yPos = rect.y;
if (tabIndex > -1) {
width--;
xpos++;
yPos += 2;
}
g2d.setPaint(new GradientPaint(xpos, 0, colorSet.topGradColor1, xpos,
h / 2, colorSet.topGradColor2));
g2d.fill(this.getUpArea(xpos, yPos, width, h - 2));
g2d.setPaint(new GradientPaint(0, h / 2, colorSet.bottomGradColor1, 0,
h, colorSet.bottomGradColor2));
g2d.fill(this.getDownArea(xpos, yPos, width, h - 2));
if (contentTopBorderDrawn) {
g2d.setColor(lineColor);
g2d.drawLine(rect.x, 20, rect.x + rect.width - 1, 20);
}
}
private Shape getArea(int x, int y, int w, int h) {
RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, w, h, 15, 15);
Area a = new Area(rect);
Rectangle2D rec = new Rectangle2D.Float(x, y + h / 2, w, h / 2);
Area b = new Area(rec);
a.add(b);
return a;
}
private Shape getUpArea(int x, int y, int w, int h) {
Rectangle2D rec = new Rectangle2D.Float(x, y, w, h / 2 + 1);
Area a = new Area(rec);
RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, w, h, 15, 15);
Area b = new Area(rect);
a.intersect(b);
return a;
}
private Shape getDownArea(int x, int y, int w, int h) {
Rectangle2D rec = new Rectangle2D.Float(x, y + h / 2, w, h / 2 + 1);
Area a = new Area(rec);
RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, w, h, 15, 15);
// Area b = new Area(rect);
// a.intersect(b);
return a;
}
protected void paintTabBorder(Graphics g, int tabPlacement, int tabIndex,
int x, int y, int w, int h, boolean isSelected) {
Rectangle rect = getTabBounds(tabIndex, new Rectangle(x, y, w, h));
// g.setColor(dividerColor);
Graphics2D g2 = (Graphics2D) g;
Composite old = g2.getComposite();
AlphaComposite comp = AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, 0.0f);
g2.setComposite(comp);
g2.setColor(dividerColor);
g2.drawLine(rect.x + rect.width, 0, rect.x + rect.width, 20);
g2.setComposite(old);
}
protected void paintContentBorderTopEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y, int w, int h) {
}
protected void paintContentBorderRightEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y, int w, int h) {
// Do nothing
}
protected void paintContentBorderLeftEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y, int w, int h) {
// Do nothing
}
protected void paintContentBorderBottomEdge(Graphics g, int tabPlacement,
int selectedIndex, int x, int y, int w, int h) {
// Do nothing
}
protected void paintFocusIndicator(Graphics g, int tabPlacement,
Rectangle[] rects, int tabIndex, Rectangle iconRect,
Rectangle textRect, boolean isSelected) {
// Do nothing
}
protected int getTabLabelShiftY(int tabPlacement, int tabIndex,
boolean isSelected) {
return 0;
}
private class ColorSet {
Color topGradColor1;
Color topGradColor2;
Color bottomGradColor1;
Color bottomGradColor2;
}
private class RollOverListener implements MouseMotionListener,
MouseListener {
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
checkRollOver();
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
checkRollOver();
}
public void mouseExited(MouseEvent e) {
tabPane.repaint();
}
private void checkRollOver() {
int currentRollOver = getRolloverTab();
if (currentRollOver != lastRollOverTab) {
lastRollOverTab = currentRollOver;
Rectangle tabsRect = new Rectangle(0, 0, tabPane.getWidth(), 20);
tabPane.repaint(tabsRect);
}
}
}
public class TabbedPaneLayout extends BasicTabbedPaneUI.TabbedPaneLayout {
public TabbedPaneLayout() {
SinaTabbedPaneUI.this.super();
}
protected void calculateTabRects(int tabPlacement, int tabCount) {
super.calculateTabRects(tabPlacement, tabCount);
for (int i = 0; i < rects.length; i++) {
rects[i].x = rects[i].x + (5 * i);
}
}
protected void padSelectedTab(int tabPlacement, int selectedIndex) {
// don't pad only the selected tab, but all the tabs, to space them.
// for (int i = 0; i < rects.length; i++) {
// Rectangle selRect = rects[i];
// Insets padInsets = getSelectedTabPadInsets(tabPlacement);
// selRect.x += padInsets.left;
// selRect.width -= (padInsets.left + padInsets.right);
// selRect.y -= padInsets.top;
// selRect.height += (padInsets.top + padInsets.bottom);
// }
}
// protected void normalizeTabRuns(int tabPlacement, int tabCount,
// int start, int max) {
// if (tabPlacement == TOP || tabPlacement == BOTTOM) {
// super.normalizeTabRuns(tabPlacement, tabCount, start, max);
// }
// }
//
// // Don't rotate runs!
// protected void rotateTabRuns(int tabPlacement, int selectedRun) {
// }
}
}
这就是那段代码了,我稍微改动了几个地方,接着的一段文字是有关这里用到得几个方法的用处
具体颜色没怎么调,贵在神似阿呵呵
下面简要说一下自定义这种Tab的关键点:
1. 每个JComponent几乎都有其UI 委托对象类,当然JTabbedPane也不例外。我们首先继承BasicTabbedPaneUI类,这其中有我们必须要重写的一个方法,具体形式如下:
public static ComponentUI createUI(JComponent c) {
return new XXXTabbedPaneUI();
}
其中XXXTabbedPaneUI就是自己实现的BasicTabbedPaneUI的子类的名字。
2.下面类出几个改变外观的重要的方法:
a. protectedvoid installDefaults() //可以改变一些BasicTabbedPaneUI中默认的属性。
b.protectedvoid paintTabArea(Graphics g, int tabPlacement, int selectedIndex) //绘制整个选项卡区域
c. protectedvoid paintTabBackground(Graphics g, int tabPlacement,
int tabIndex, int x, int y, int w, int h, boolean isSelected)
//绘制某个选项卡的背景色
d. protectedvoid paintContentBorder(Graphics g, int tabPlacement,
int selectedIndex) //绘制TabbedPane容器的四周边框样式。
e. protectedvoid paintFocusIndicator(Graphics g, int tabPlacement,
Rectangle[] rects, int tabIndex, Rectangle iconRect,
Rectangle textRect, boolean isSelected)
//绘制选中某个Tab后,获得焦点的样式。
3.默认状态下每个选择项卡是连续摆放的,那么我们怎么使得他像新浪网页里那样的Tab中间有一定间隙呢,那么我们还定义一个内部类继承BasicTabbedPaneUI的内部类TabbedPaneLayou重写calculateTabRects方法,因为具体的选项卡标签位置是由变量rects所决定的。
根据上面的介绍是不是你也想自己动手实践一下呢??那还等什么,让我们共同努力让Swing更美丽!!
也许,看到这里你还是一头雾水,写了这个那到底怎么用它呢,其实很简单,在你要用的地方设置就行了,如下
UserJTab = new JTabbedPane();
UserJTab.setTabPlacement(JTabbedPane.TOP);
UserJTab.setBorder(null);
UserJTab.setUI(new SinaTabbedPaneUI());
这里就用到了,这样刚才的效果就实现了
发表评论
-
Java中HashMap的用法
2012-04-10 11:31 1077import java.util.Map; import ... -
Eclipse-jee-galileo的简单应用配置(包含Tomcat)
2012-03-23 17:43 1首先:下载 JDK 6,Eclip ... -
JDK官方下载
2011-11-27 22:54 850JDK1.6官方下载_JDK6官方下载地址:http:// ... -
使用Servlet Filter来防止SQL注入的方法
2010-08-28 14:29 1804SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的B ... -
避免XPath 注入的危险
2010-08-28 14:27 1435随着简单 XML API、Web 服 ... -
Xpath注入攻击及其防御技术研究
2010-08-28 14:25 13671 Xpath注入攻击概述 1.1 Xpath定义 近 ... -
突破SQL注入限制的一点想法
2010-08-28 14:19 1039突然想我们是否可以用什么方法绕过SQL注入的限制呢?到网上考察 ... -
JPanel上设置背景图片
2010-08-28 14:12 1487import java.awt.*; import javax ... -
通过Java Swing看透MVC设计模式
2010-08-28 14:11 951一个好的用户界面(GUI) ... -
jtree 默认展开树的全部节点
2010-08-28 14:06 5654public static void expandTr ... -
jTree 背景图片.节点颜色
2010-08-28 14:05 1598import java.awt.*; import java. ... -
JTree用法
2010-08-28 14:04 1280一、JTree用法及JTree使用经验总结 import ja ... -
Swing-JTree树模型的操作
2010-08-28 14:03 2340本文介绍Java Swing中的JTree模型,介绍如何创建、 ... -
常用的数据库连接写法和下载地址
2010-08-28 14:01 8721. MySQL(http://www.mysql.com)m ... -
java中常见的日期时间类
2010-08-28 13:20 803java中常见的日期时间类 以及时间转换 java中常见的 ... -
计算任意2个日期内的工作日(没有考虑到国定假日
2010-08-28 13:08 1083主要思路: 对于任意2个日期比如:date_start=20 ... -
Java获取各种常用时间方法
2010-08-28 13:07 712http://gigixin.iteye.com/blog/4 ... -
计算从beginDate到endDate的工作日
2010-08-28 13:06 1481public static int[] work_rest_a ... -
Java时间格式转换大全
2010-08-28 13:05 541import java.text.*; import java ... -
JAVA计划任务 定时器
2010-08-28 12:57 1367所有类型的 Java 应用程序一般都需要计划重复执行的任务。企 ...
相关推荐
描述:JTabbedPanel的美化标签很详细,找了很久。 根据提供的信息,本文将深入探讨如何通过自定义UI来美化JTabbedPanel中的标签,使其具有更吸引人的视觉效果。JTabbedPane是Java Swing框架中用于创建带有多个标签...
在Java Swing库中,`JTabbedPane`是一个非常重要的组件,它允许用户在多个面板(JPanel)之间切换,每个面板都可以包含不同的内容。自定义`JTabbedPane`的外观可以提升应用程序的用户体验,使其更加个性化和专业。...
java swing jTabbedPane 自定义的U,包括(宽、高、点击放大、文本字体、背景颜色、选项卡间距等) 简单易懂带注释可直接运行
机械原理课程设计 破碎机.doc
电子设计论文施密特触发器电子设计论文施密特触发器
电子设计论文往返式流动灯电子设计论文往返式流动灯
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
政策背景与动机: 签署法案:2021年11月15日,拜登总统签署了《基础设施投资和就业法案》(IIJA),旨在通过多项措施推动美国电动汽车充电基础设施的扩张。 市场增长:随着电动汽车市场的快速增长,对充电基础设施的需求也日益增加,政府政策成为推动这一发展的关键力量。 电动汽车充电基础: 充电技术:电动汽车充电技术通常分为三级,各级充电速度和功率不同,满足不同场景下的充电需求。 充电站类型:包括公共、私人及工作场所充电站,各自具有不同的访问限制和使用特点。 市场趋势与现状: 市场增长:EV市场增长依赖技术进步、成本降低及充电便利性的提高。 充电站数量:截至2022年10月,美国公共和私人充电站总数超过50,000个,其中93%为公共充电站。 区域差异:充电站分布存在地区差异,部分低收入社区充电基础设施不足。 政策与项目: NEVI公式计划:通过IIJA设立的国家电动汽车基础设施(NEVI)公式计划,为各州提供资金以建设EV充电站。 税收抵免:扩展了替代燃料汽车加油站的税收抵免政策,包括EV充电站,以激励投资者。 联合办公室:DOT和DOE成立联合办公室,负责NEVI计划的实施和监管,确保
电子设计论文照明过暗提醒电路电子设计论文照明过暗提醒电路
我选用的软件是:Visual Studio CODE,这个软件在前端开发中十分常用,且提供了很大的便利。 当然也可以用记事本开发,记得把后缀名改成.html 还有我的CSS使用的是内部样式表。 写在head标签下。用到的标签有 <h1></h1> <img src="lyf.jpg" class="god"> <p> </p> 就是这三个标签,构成了HTML的主体架构。 而CSS则是设置了以下形式。 font-size: 16px; line-height: 32px; font-family: "Microsoft Yahei"; text-align: left; text-indent:2em; text-decoration: none; color: #888888 width:66px
大名鼎鼎的MFC MAPI 源码和可执行文件,是开发OUTLOOK插件的好帮手。
机械原理课程设计插床机构机械设计.doc
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
《化工设备机械基础》课程设计 IB储罐设计.doc.doc
机械原理课程设计网球自动捡球机.doc
EKFUKFCKF录屏.mp4
仿新浪读书小程序源码学习
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
ecbbc多商户系统BSD开源协议,和yii2框架一样的开源协议,做国内首款真正开源BSD的多商户系统,欢迎大家研究学习,商用项目使用。Fecbbc多商户购物商城系统BSD一:多商户介绍Fecbbc多商户系统正式开源免费,BSD开源协议,和yii2框架一样的开源协议,真正商用免费授权。做国内首款真正开源BSD的多商户系统,欢迎大家研究学习,商用项目使用。