java自带的Label太枯燥了,真是拿不出手啊。
所以,我们要设计3D标签!!
看看下面这张图
原理
看看这图,可以看到哈哈有三种颜色:白色、黑色和灰色
实现的时候并不像PS那样,按几个按钮就O了
其实实际是画出3个“哈哈”,一种白色,一种黑色,一种灰色
然后想象一下,如果三种颜色的”哈哈“,重叠了起来,只留下了很小的一部分,那么就形成了阴影。
既然有三种颜色的”哈哈“,那么就需要画三次。
下面开始,我们将左上角的阴影(白色的哈哈)称为左阴影,将右下角的阴影称为由右阴影
此时阴影的位置就显得格外重要了,需要自定义左右阴影的偏移量
总所周知,对于位置的表示是坐标即横纵坐标,这时就需要设置4个偏移量——左阴影x、左阴影y、右阴影x、右阴影y
然后覆盖JLabel类中的paintComponent方法,原本这个方法只是花一次,现在我们让他画3次!!
代码实现
import java.awt.*;
import javax.swing.*;
public class ThreeDLabel extends JLabel{
private int tracking;
private int left_x,left_y,right_x,right_y;
private Color left_color,right_color;
public ThreeDLabel(String text,int tracking){
super(text);
this.tracking=tracking;
}
public void setLeftShadow(int left_x,int left_y,Color left_color){
this.left_x=left_x;
this.left_y=left_y;
this.left_color=left_color;
}
public void setRightShadow(int right_x,int right_y,Color right_color){
this.right_x=right_x;
this.right_y=right_y;
this.right_color=right_color;
}
public Dimension getPreferredSize(){
int x,y;
FontMetrics font=this.getFontMetrics(this.getFont());
x=(getText().length()-1)*tracking+left_x+right_x+font.stringWidth(getText());
y=font.getHeight()+left_y+right_y;
return new Dimension(x,y);
}
public void paintComponent(Graphics g){
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
char[] chars=getText().toCharArray();
FontMetrics fm=this.getFontMetrics(getFont());
int h=fm.getAscent();
int x=0;
for(char c:chars){
int w=fm.charWidth(c)+tracking;
g.setColor(left_color);
g.drawString(c+"",x-left_x,h-left_y);
g.setColor(right_color);
g.drawString(c+"",x+right_x,h+right_y);
g.setColor(getForeground());
g.drawString(c+"",x,h);
x+=w;
}
((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
}
}
下面是实例代码
class Demo{
public static void main(String[] args){
DIYLabel label=new DIYLabel("小柒再出发",40);
label.setLeftShadow(2,1,Color.white);
label.setRightShadow(4,5,Color.gray);
label.setForeground(Color.black);
label.setFont(label.getFont().deriveFont(140f));
JFrame frame=new JFrame("title");
frame.getContentPane().add(label);
frame.pack();
frame.setVisible(true);
}
}
结果如图
几个解释的地方
为什么要有一个字符间隙tracking?
因为:当右阴影的偏移量过大时,右阴影可能就会跑到下一个字符所在的地方,这样看起来就很难看的
上图看看有字符间隙和没有字符间隙的区别
这个图的字符间隙是0,右阴影的偏移量right_x=60,right_y=40
可以看到,前一个字的右阴影和下一个字都挤到了一起了
这张图的字符间隙为80,阴影的偏移量和上一个字一样
有了字符间隙,就可以避免前一个字的阴影和下一个字挤到了一起
所以字符间隙至少是left_x+right_x
为什么要重写getPrefferedSize()?
因为pack()这个方法,可以自动调节窗口的尺寸(前提是有布局管理器,也就是不是绝对布局)
然后pack()这个方法的原理是根据每个组件的最适尺寸来安排窗体的尺寸的,也就是每个组件的getPrefferedSize()方法
现在已经知道了getPrefferedSize()的用处了,然后我们来讲讲如果不重写getPrefferedSize()会怎么样?
原始的getPrefferedSize()方法的实现是根据Label的文本信息、图标、文本信息与图标之间的距离来安排最佳尺寸的
然而原始的文本信息是没有阴影的,所以最佳尺寸也就没有加上阴影的尺寸和字符间距
这会使得,最佳尺寸偏小,甚至右边或左边的字有一部分显示不出来(超出了组件的尺寸)
画三遍的顺序有讲究
画阴影和正文的顺序有讲究,因为画画的时候,当下一次画画的时候与上一次画画有重复的部分,那么下一次画画就会覆盖上一次的部分
所以,应该先画左右阴影(左右阴影的顺序没有讲究),最后再画正文,要确保正文不被覆盖,阴影一定要被覆盖
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
3D立体画设计软件PSDTO3D系列 国内最著名的3D设计软件,用于3D立体图,3D立体画,3D立体电影设计,广泛应用于裸眼立体领域,无需佩戴眼睛。...标签:3D软件 立体画设计软件 立体画软件 PSDTO3D 3D设计软件
用vb做的 涉及窗口的常用方法,常用事件 标签框的常用方法
Civil 3D的样板文件,是自己修改自定义的设计院出图样板文件,不能满足每个人的需求,可以在此基础上进行自定义修改,一共三个文件,分别是2012版本、2017版本、2018版本。每个版本有些许差别,是针对不同项目进行...
基于Js+HTML的实现3D标签云的效果代码.zip
标签定点剥离_零件图_机械工程图_机械三维3D设计图打包下载
热压贴标签机_零件图_机械工程图_机械三维3D设计图打包下载
笔袋标签贴附机_零件图_机械工程图_机械三维3D设计图打包下载
HTML5+SVG实现可互动的3D标签云特效源码.zip
自动剥离标签贴膜机_零件图_机械工程图_机械三维3D设计图打包下载
标签出标机供膜机构_零件图_机械工程图_机械三维3D设计图打包下载
手机标签自动贴合设备_零件图_机械工程图_机械三维3D设计图打包下载.x_t
自动化贴标签机_零件图_机械工程图_机械三维3D设计图打包下载.x_t
全自动剥离标签贴膜机_零件图_机械工程图_机械三维3D设计图打包下载.x_t
回撤式标签剥料机_x_t_零件图_机械工程图_机械三维3D设计图打包下载
"3D虚拟试衣APP——魔法衣橱的设计研究" 本文主要讨论了基于3D虚拟试衣系统的魔法衣橱APP的设计研究,该系统利用计算机模拟实际环境对顾客进行试衣,并结合VR技术、CAD/CAM技术和三维非接触式人体测量技术,实现...
Artlantis 2021是一款快速、强大但易于使用的3D渲染软件,用于建筑师和工程师,使他们能够在2D和3D中创建高质量的设计。 这是一个方便的工具,包括广泛的有效的工具,允许您建模交互式设计与无与伦比的轻松。 这是一...
这是一款采用了精密视觉检测系统设计的检测贴标签的设备,图纸结构原理设计合理,已经用于实际生产加工了。设备结构及其原理是,有机身部分、贴标签、送标签结构、物料自动上料输送机、设备防护罩和电气控制部分组成...
一次性纸杯塑料杯叠杯套膜包装机sw16可编辑_零件图_机械工程图_机械三维3D设计图打包下载.zip
贴标签设备(全自动贴标机)_零件图_机械工程图_机械三维3D设计图打包下载.x_t
贴标机标签出标机供膜机构_零件图_机械工程图_机械三维3D设计图打包下载.x_t