使用JButton在Java中创建自定义按钮

我正在尝试创建一个具有自定义形状(六边形)的按钮,但其行为类似于普通的JButton(即与ActionListener一起使用)。

我创建了一个扩展AbstractButton的类,但是单击它似乎不会向ActionListener发送事件。如果我更改类以扩展JButton,则它可以很好地工作,但是会弄乱按钮的显示方式。我假设有一种方法需要重写才能引发事件,但是我不知道它是什么。

回答:

如果要创建CustomButtonUI,则必须查看

  • 最深的BasicXxxUI。

从JButton覆盖颜色列表

请注意,没有paintComponent()。是错误的,只需使用paint()方法,

如果可能的话,下面仅是一个简单示例(对于Metal JButton)。请注意,仅对于Metal LaF,我是如此懒惰,并且没有关于覆盖paintText,paintIcon,paintFocus,paintBorder的东西(对于所有功能,您必须检查BasicButtonUI的可用方法),而我放到ButtonModel上的东西只是为了我的享受。

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.border.AbstractBorder;

import javax.swing.border.Border;

import javax.swing.event.ChangeEvent;

import javax.swing.event.ChangeListener;

import javax.swing.plaf.ComponentUI;

import javax.swing.plaf.metal.MetalButtonUI;

public class TextAreaInButton {

private JFrame frame = new JFrame("sssssssss");

private JButton tip1Null = new JButton(" test button ");

public TextAreaInButton() {

Border line, raisedbevel, loweredbevel, title, empty;

line = BorderFactory.createLineBorder(Color.black);

raisedbevel = BorderFactory.createRaisedBevelBorder();

loweredbevel = BorderFactory.createLoweredBevelBorder();

title = BorderFactory.createTitledBorder("");

empty = BorderFactory.createEmptyBorder(1, 1, 1, 1);

final Border compound;

Color crl = (Color.blue);

compound = BorderFactory.createCompoundBorder(empty, new OldRoundedBorderLine(crl));

Color crl1 = (Color.red);

final Border compound1;

compound1 = BorderFactory.createCompoundBorder(empty, new OldRoundedBorderLine(crl1));

Color crl2 = (Color.black);

final Border compound2;

compound2 = BorderFactory.createCompoundBorder(empty, new OldRoundedBorderLine(crl2));

tip1Null.setFont(new Font("Serif", Font.BOLD, 14));

tip1Null.setForeground(Color.darkGray);

tip1Null.setPreferredSize(new Dimension(50, 30));

tip1Null.addActionListener(new java.awt.event.ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

}

});

tip1Null.setBorderPainted(true);

tip1Null.setFocusPainted(false);

tip1Null.setBorder(compound);

tip1Null.setHorizontalTextPosition(SwingConstants.CENTER);

tip1Null.setVerticalTextPosition(SwingConstants.BOTTOM);

tip1Null.setUI(new ModifButtonUI());

tip1Null.getModel().addChangeListener(new ChangeListener() {

@Override

public void stateChanged(ChangeEvent e) {

ButtonModel model = (ButtonModel) e.getSource();

if (model.isRollover()) {

tip1Null.setBorder(compound1);

} else {

tip1Null.setBorder(compound);

}

if (model.isPressed()) {

tip1Null.setBorder(compound2);

}

}

});

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(tip1Null, BorderLayout.CENTER);

frame.setLocation(150, 150);

frame.setPreferredSize(new Dimension(310, 75));

frame.setLocationRelativeTo(null);

frame.pack();

frame.setVisible(true);

}

public static void main(String args[]) {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

TextAreaInButton taib = new TextAreaInButton();

}

});

}

}

class OldRoundedBorderLine extends AbstractBorder {

private final static int MARGIN = 5;

private static final long serialVersionUID = 1L;

private Color color;

OldRoundedBorderLine(Color clr) {

color = clr;

}

public void setColor(Color clr) {

color = clr;

}

@Override

public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {

((Graphics2D) g).setRenderingHint(

RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

g.setColor(color);

g.drawRoundRect(x, y, width, height, MARGIN, MARGIN);

}

@Override

public Insets getBorderInsets(Component c) {

return new Insets(MARGIN, MARGIN, MARGIN, MARGIN);

}

@Override

public Insets getBorderInsets(Component c, Insets insets) {

insets.left = MARGIN;

insets.top = MARGIN;

insets.right = MARGIN;

insets.bottom = MARGIN;

return insets;

}

}

class ModifButtonUI extends MetalButtonUI {

private static final ModifButtonUI buttonUI = new ModifButtonUI();

ModifButtonUI() {

}

public static ComponentUI createUI(JComponent c) {

return new ModifButtonUI();

}

@Override

public void paint(Graphics g, JComponent c) {

final Color color1 = new Color(230, 255, 255, 0);

final Color color2 = new Color(255, 230, 255, 64);

final Color alphaColor = new Color(200, 200, 230, 64);

final Color color3 = new Color(

alphaColor.getRed(), alphaColor.getGreen(), alphaColor.getBlue(), 0);

final Color color4 = new Color(

alphaColor.getRed(), alphaColor.getGreen(), alphaColor.getBlue(), 64);

super.paint(g, c);

Graphics2D g2D = (Graphics2D) g;

GradientPaint gradient1 = new GradientPaint(

0.0F, (float) c.getHeight() / (float) 2, color1, 0.0F, 0.0F, color2);

Rectangle rec1 = new Rectangle(0, 0, c.getWidth(), c.getHeight() / 2);

g2D.setPaint(gradient1);

g2D.fill(rec1);

GradientPaint gradient2 = new GradientPaint(

0.0F, (float) c.getHeight() / (float) 2, color3, 0.0F, c.getHeight(), color4);

Rectangle rec2 = new Rectangle(0, c.getHeight() / 2, c.getWidth(), c.getHeight());

g2D.setPaint(gradient2);

g2D.fill(rec2);

}

@Override

public void paintButtonPressed(Graphics g, AbstractButton b) {

paintText(g, b, b.getBounds(), b.getText());

g.setColor(Color.red.brighter());

g.fillRect(0, 0, b.getSize().width, b.getSize().height);

}

public void paintBorder(Graphics g) {

}

@Override

protected void paintFocus(Graphics g, AbstractButton b,

Rectangle viewRect, Rectangle textRect, Rectangle iconRect) {

}

}

以上是 使用JButton在Java中创建自定义按钮 的全部内容, 来源链接: utcz.com/qa/413893.html

回到顶部