My code for custom button is:
public class GreyButton extends JLabel {
private int ButtonWidth,
ButtonHeight;
String ButtonText;
public GreyButton(String BText, int BWidth, int BHeight) {
super(BText);
this.ButtonHeight = BHeight;
this.ButtonWidth = BWidth;
this.ButtonText = BText;
setGreyButton();
}
private void setGreyButton() {
this.setPreferredSize(new Dimension(this.ButtonWidth, this.ButtonHeight));
this.setBackground(Color.LIGHT_GRAY);
this.setOpaque(false);
this.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
this.setForeground(Color.WHITE);
this.setHorizontalAlignment(SwingConstants.CENTER); //This line
}
@Override
public void paint(Graphics g) {
paintComponent(g);
}
@Override
public void paintComponent(Graphics g) {
Graphics2D Shape = (Graphics2D) g;
AlphaComposite newComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f);
Shape.setComposite(newComposite);
Color[] FillArray = {Color.WHITE, Color.GRAY};
float[] Distribution = {0.85f, 1.0f};
GradientPaint Fill = new GradientPaint(10, 8, Color.BLACK, 10, 72, Color.WHITE);
Paint OldPaint = Shape.getPaint();
Shape.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Shape.setPaint(Fill);
Shape.fillRect(0, 0, ButtonWidth, ButtonHeight);
Shape.setPaint(OldPaint);
Shape.setFont(new Font("Monospace", Font.BOLD, 14));
Shape.drawString(ButtonText, 0, 0); //This line
}
}
This is to create a JLabel with custom 2D Graphics. The problem is that I am trying to center the text in the JLabel and this be should valid for any size the used in the constructor.
Currently, I need to calculate the values and set the second and third parameters of drawString accordingly.
Question: Is there a general way of centering a text on JLabel whose size may differ with each instance?
Don’t override the paint() method when doing custom painting. You would never override the method to invoke the paintCompnent() method.
If you are just trying to paint a custom background then I would think you would:
Paint your gradient background at the start of the paintComponent() method.
Then invoke super.paintComponent(g). The normal painting code will position the text based on the horizontal alignment property.