📄 vectorbutton.java
字号:
import java.awt.*;import java.awt.geom.*;import java.awt.event.*;import javax.swing.*;public class VectorButton extends JButton implements MouseListener { public VectorButton() { this.addMouseListener(this); } public Dimension getPreferredSize() { String text = getText(); FontMetrics fm = this.getFontMetrics(getFont()); float scale = (50f/30f)*this.getFont().getSize2D(); int w = fm.stringWidth(text); w += (int)(scale*1.4f); int h = fm.getHeight(); h += (int)(scale*.3f); return new Dimension(w,h); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(this.getBackground()); g2.fillRect(0,0,this.getWidth(),this.getHeight()); float scale = (50f/30f)*this.getFont().getSize2D(); drawLiquidButton(this.getForeground(), this.getWidth(), this.getHeight(), getText(), scale, g2); } protected void drawLiquidButton(Color base, int width, int height, String text, float scale, Graphics2D g2) { // calculate inset int inset = (int)(scale*0.04f); int w = width - inset*2 - 1; int h = height - (int)(scale*0.1f) - 1; g2.translate(inset,0); drawDropShadow(w,h,scale,g2); if(pressed) { g2.translate(0, 0.04f*scale); } drawButtonBody(w,h,scale,base,g2); drawText(w,h,scale,text,g2); drawHighlight(w,h,scale,base,g2); drawBorder(w,h,scale,g2); if(pressed) { g2.translate(0, 0.04f*scale); } g2.translate(-inset,0); } protected void drawDropShadow(int w, int h, float scale, Graphics2D g2) { // draw the outer drop shadow g2.setColor(new Color(0,0,0,50)); this.fillRoundRect(g2, (-.04f)*scale, (.02f)*scale, w+.08f*scale, h+0.08f*scale, scale*1.04f, scale*1.04f); g2.setColor(new Color(0,0,0,100)); this.fillRoundRect(g2,0,0.06f*scale,w,h,scale,scale); } protected void drawButtonBody(int w, int h, float scale, Color base, Graphics2D g2) { // draw the button body Color grad_top = base.brighter(); Color grad_bot = base.darker(); GradientPaint bg = new GradientPaint( new Point(0,0), grad_top, new Point(0,h), grad_bot); g2.setPaint(bg); this.fillRoundRect(g2, (0)*scale, (0)*scale, w,h,1*scale,1*scale); // draw the inner color Color inner = base.brighter(); inner = alphaColor(inner,75); g2.setColor(inner); this.fillRoundRect(g2, scale*(.4f), scale*(.4f), w-scale*.8f, h-scale*.5f, scale*.6f,scale*.4f); } protected void drawText(int w, int h, float scale, String text, Graphics2D g2) { // calculate the width and height int fw = g2.getFontMetrics().stringWidth(text); int fh = g2.getFontMetrics().getAscent() - g2.getFontMetrics().getDescent(); int textx = (w-fw)/2; int texty = h/2 + fh/2; // draw the text g2.setColor(new Color(0,0,0,70)); g2.drawString(text,(int)((float)textx+scale*(0.04f)), (int)((float)texty + scale*(0.04f))); g2.setColor(Color.black); g2.drawString(text, textx, texty); } protected void drawHighlight(int w, int h, float scale, Color base, Graphics2D g2) { // create the highlight GradientPaint highlight = new GradientPaint( new Point2D.Float(scale*0.2f,scale*0.2f), new Color(255,255,255,175), new Point2D.Float(scale*0.2f,scale*0.55f), new Color(255,255,255,0) ); g2.setPaint(highlight); this.fillRoundRect(g2, scale*0.2f, scale*0.1f, w-scale*0.4f, scale*0.4f, scale*0.8f, scale*0.4f); this.drawRoundRect(g2, scale*0.2f, scale*0.1f, w-scale*0.4f, scale*0.4f, scale*0.8f, scale*0.4f); } protected void drawBorder(int w, int h, float scale, Graphics2D g2) { // draw the border g2.setColor(new Color(0,0,0,150)); this.drawRoundRect(g2, scale*(0f), scale*(0f), w,h,scale,scale); } // float version of fill round rect protected static void fillRoundRect(Graphics2D g2, float x, float y, float w, float h, float ax, float ay) { g2.fillRoundRect( (int)x, (int)y, (int)w, (int)h, (int)ax, (int)ay ); } // float version of draw round rect protected static void drawRoundRect(Graphics2D g2, float x, float y, float w, float h, float ax, float ay) { g2.drawRoundRect( (int)x, (int)y, (int)w, (int)h, (int)ax, (int)ay ); } // generate the alpha version of this color protected static Color alphaColor(Color color, int alpha) { return new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); } /* mouse listener implementation */ protected boolean pressed = false; public void mouseExited(MouseEvent evt) { } public void mouseEntered(MouseEvent evt) { } public void mouseClicked(MouseEvent evt) { } public void mouseReleased(MouseEvent evt) { pressed = false; } public void mousePressed(MouseEvent evt) { pressed = true; } public static void p(String s) { System.out.println(s); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -