Criando um botão personalizado em Java com JButton

Eu estou tentando criar um botão que tem uma forma personalizada (hexágono), mas funciona como um JButton normal (isto é, funciona com um ActionListener).

Eu criei uma class que estende AbstractButton, mas não parece estar enviando events para o ActionListener quando clico nele. Se eu mudar a class para estender o JButton, ele funciona perfeitamente, mas isso estraga a maneira como o botão é exibido. Eu estou supondo que há um método que eu preciso replace para que ele dispare events, mas não consigo descobrir o que é.

Você terá que estender a class JButton não o AbstractButton . Tente as seguintes coisas e você terá uma idéia.

O primeiro passo é subclassificar o JButton .

Em seguida, na sua subclass, comece redefinindo o método paintComponent(Graphics) . Se você quiser alguma mudança.

Em seguida, substitua paintBorder(Graphics) para obter uma forma de hexágono.

Se você quiser criar um CustomButtonUI, então você tem que olhar

  • mais profundo para o BasicXxxUI .

  • lista de colors de JButton

Note que não há paintComponent() . Está errado, basta usar o método paint() ,

Abaixo está apenas um exemplo simples, se for possível (para Metal JButton). Nota apenas para Metal LaF, eu sou tão preguiçoso e não há nada sobre replace paintText, paintIcon, paintFocus, paintBorder (para todas as funcionalidades que você tem que verificar os methods disponíveis de BasicButtonUI), e algo que eu coloquei no ButtonModel, apenas para meu prazer.

imagem do botão de teste

 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) { } } 

Eu sei que esta pergunta foi respondida, mas você pode querer olhar usando os methods internos e usando imagens para desenhar seu botão em diferentes estados.

Aqui está um pequeno código que usei para gerar um botão personalizado.

 BufferedImage startButton = ImageIO.read(getClass().getResource("/icons/standard/buttons/start_backup.png")); BufferedImage startButtonHover = ImageIO.read(getClass().getResource("/icons/standard/buttons/start_backup_hover.png")); BufferedImage startButtonActive = ImageIO.read(getClass().getResource("/icons/standard/buttons/start_backup_active.png")); JButton startBackupButton = new JButton(new ImageIcon(startButton)); startBackupButton.setRolloverIcon(new ImageIcon(startButtonHover)); startBackupButton.setPressedIcon(new ImageIcon(startButtonActive)); startBackupButton.setBorder(BorderFactory.createEmptyBorder()); startBackupButton.setContentAreaFilled(false); startBackupButton.setFocusable(false); 

Você pode adicionar um ouvinte de ação a ele normalmente.

tente um Jlabel e use uma imagem para qualquer forma !!

  JLabel lbl = new JLabel(""); lbl.setIcon(new ImageIcon("shape.png")); lbl.setBounds(548, 11, 66, 20); contentPane.add(lbl); lbl.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent arg0) { System.exit(0); } });