java中按钮,Java中的设计按钮(如CSS)

For my project, I need to create customizable buttons. Except that I have a problem and I do not know how to solve it.

I have a background image for my button and I would like it to be extensible in X and Y according to the text there will be over without loss of quality.

Do you have any ideas?

vZFGN.png

解决方案

Swing has a pluggable Look&Feel which allows to alter the appearance of its widgets by means of a ComponentUI (in this case: a ButtonUI).

Example for your buttons:

Areyw.png

class StyledButtonUI extends BasicButtonUI {

@Override

public void installUI (JComponent c) {

super.installUI(c);

AbstractButton button = (AbstractButton) c;

button.setOpaque(false);

button.setBorder(new EmptyBorder(5, 15, 5, 15));

}

@Override

public void paint (Graphics g, JComponent c) {

AbstractButton b = (AbstractButton) c;

paintBackground(g, b, b.getModel().isPressed() ? 2 : 0);

super.paint(g, c);

}

private void paintBackground (Graphics g, JComponent c, int yOffset) {

Dimension size = c.getSize();

Graphics2D g2 = (Graphics2D) g;

g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g.setColor(c.getBackground().darker());

g.fillRoundRect(0, yOffset, size.width, size.height - yOffset, 10, 10);

g.setColor(c.getBackground());

g.fillRoundRect(0, yOffset, size.width, size.height + yOffset - 5, 10, 10);

}

}

Main method for testing:

public static void main (String[] args) {

JFrame f = new JFrame("Button UI Test");

f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

JPanel p = new JPanel();

p.setBackground(Color.white);

f.setContentPane(p);

p.setLayout(new FlowLayout(5, 5));

p.setBorder(new EmptyBorder(10, 10, 10, 10));

for (int i = 1; i <= 5; i++) {

final JButton button = new JButton("Button #" + i);

button.setFont(new Font("Calibri", Font.PLAIN, 14));

button.setBackground(new Color(0x2dce98));

button.setForeground(Color.white);

// customize the button with your own look

button.setUI(new StyledButtonUI());

p.add(button);

}

f.pack();

f.setLocation(500, 500);

f.setVisible(true);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值