Java Swing 自定义图片按钮

一个按钮,如下:


已经实现了,鼠标滑过变色,鼠标单击变色,如下:

 

如果在上面设置文本button.setText("ABCDEFGHIJKLMNOPQ"),如下:


那么问题来了

(1)设置很长的文本,button不会自动伸长

(2)文本覆盖了左边的图片

解决办法:将图片切成三块


重写paintComponent方法。但是问题如下:

button.setText("ABC");
button.setFont(new Font("SansSerif", Font.BOLD, 50));

,水平可以拉伸,竖直根据算法可以拉伸,但是由于水平切成三幅图,竖直拉伸时上下线条变粗了!

所以为了美观需要切成9格图片:


另外,重写paintComponent方法时,需要注意算法,一方面考虑到字体大小对图片的拉伸,还要考虑到setPreferredSize()等方法对其影响。


代码如下:


import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
import java.util.Map;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import twaver.TWaverUtil;

public class ImageButton9 extends JButton {
	private static final long serialVersionUID = 1L;

	protected boolean isEnable = true;

	private Color color;
	private Color txtBgColor = Color.BLACK;
	private Color txtOverColor = Color.BLACK;
	private Color txtDisColor = Color.GRAY;
	private Color txtPressColor = Color.WHITE;
	private Color txtSelColor = Color.WHITE;

    private int txtW;
    private int txtH;
    private int txtDescent;
	
	private String path;
	
	private Map<String, ImageIcon> map = new HashMap<String, ImageIcon>();

	public static final String ICON = "icon_";
	
	public static final String BG = "bg_";
	public static final String SEL = "sel_";
	public static final String OVER = "over_";
	public static final String PRESS = "press_";
	public static final String DIS = "dis_";

	public static final String LEFT
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值