我的自定义按钮代码是:
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
}
}
这是使用自定义2D图形创建JLabel。问题是我试图将文本放在JLabel中心,这应该对构造函数中使用的任何大小都有效。
目前,我需要计算值并相应地设置drawString
的第二个和第三个参数。
问题:是否有一种将文本居中于JLabel的一般方法,其大小可能因每个实例而异?
答案 0 :(得分:4)
您可以使用FontMetrics获取字符串的宽度。
Shape.getFontMetrics().stringWidth(ButtonText);
答案 1 :(得分:4)
执行自定义绘制时,不要覆盖paint()方法。您永远不会覆盖该方法来调用paintCompnent()方法。
如果您只是想绘制自定义背景,那么我认为您会:
在paintComponent()方法的开头绘制渐变背景。
然后调用super.paintComponent(g)。正常的绘制代码将根据水平对齐属性定位文本。
答案 2 :(得分:2)
备选方案1:
让你的按钮扩展JButton。在该按钮上调用setContentAreaFilled(false)。覆盖按钮的paintComponent()方法并绘制背景,然后调用super.paintComponent()来绘制文本/标签。
备选方案2:
由于JLabel擅长水平和垂直绘制文本并定位文本,我想我会利用它并将实际绘图委托给JLabel。但是,显然,这是一个问题,因为您需要渐变背景。据我所知,背景绘画和文字绘画都是在JLabel的同一个方法(paintComponent())中处理的,所以你不能让JLabel只绘制文本而不是背景。
我要做的是让GreyButton扩展JPanel。然后我会创建一个扩展PanelUI以绘制JPanel的类,并将该类设置为JPanel的UI。
之后,我将GridBagLayout设置为JPanel上的布局管理器,并将JLabel添加到JPanel。布局管理器确保JLabel水平和垂直填充整个JPanel。因此,文本将在JPanel的中间居中。
换句话说,在JPanel构造函数中,我确保使用以下内容添加JLabel:
JLabel label = new JLabel("Label");
GridBagLayout l = new GridBagLayout();
setLayout(l);
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
add(label, c0);
你很可能不得不尝试一下约束,但上面的代码应该是一个很好的起点。
答案 3 :(得分:1)
您似乎想要使用JComponent
功能绘制自己的JButton
。
1)不要重新发明轮子;在许多情况下,只需要更改Look and Feel in Java。那里的一切都是可能的,例如Substance,Synthetica和Nimbus。
如果确实想要详细破解JButton
,
2)您可以使用自定义this way转到ButtonUI
;注意一个只覆盖某些方法。
3)在某些情况下,只需更改"Button.background"。