Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a custom button in Java with JButton

I am trying to create a button that has a custom shape (hexagon), but otherwise acts like a normal JButton would (that is, works with an ActionListener).

I have created a class that extends AbstractButton, but it doesn't seem to be sending events to the ActionListener when I click it. If I change the class to extend JButton it works perfectly, but it screws up the way the button is displayed. I'm assuming that there is a method that I need to override to get it to fire events, but I can't figure out what it is.

like image 205
rybl Avatar asked Apr 22 '11 00:04

rybl


People also ask

What is the difference between button and JButton in Java?

JButton class provided by Swing is totally different from Button which is provided by AWT. It is used to add platform independent button in swing application. Swing buttons are extended from the AbstractButton class that is derived from JComponent. AbstractButton class implements the Accessible interface.

Can you add JButton to JFrame?

In a Java JFrame, we can add an instance of a JButton class, which creates a button on the frame as follows in the code below: //add a button. JButton b = new JButton("Submit");


1 Answers

If you want to create a CustomButtonUI then you have to look

  • deepest to the BasicXxxUI.

  • overide List of Colors from JButton

Note there isn't paintComponent(). It's wrong, just use the paint() method,

Below is just a simple example if that is possible (for Metal JButton). Note just for Metal LaF, I'm so lazy and there isn't something about override paintText, paintIcon, paintFocus, paintBorder (for all funcionalities you have to check available methods from BasicButtonUI), and something I put to the ButtonModel, just for my enjoyment.

test button image

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) {     } } 
like image 129
mKorbel Avatar answered Sep 29 '22 03:09

mKorbel