// from Swing Hacks 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)); VectorButton.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)); VectorButton.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); VectorButton.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); VectorButton.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); VectorButton.fillRoundRect(g2, scale * 0.2f, scale * 0.1f, w - scale * 0.4f, scale * 0.4f, scale * 0.8f, scale * 0.4f); VectorButton.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)); VectorButton.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); } }