Java JLabel center drawString()用于不同大小的文本
我的自定义按钮代码为:Java JLabel center drawString()用于不同大小的文本,java,swing,jlabel,Java,Swing,Jlabel,我的自定义按钮代码为: public class GreyButton extends JLabel { private int ButtonWidth, ButtonHeight; String ButtonText; public GreyButton(String BText, int BWidth, int BHeight) { super(BText); thi
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
}
}
这是为了创建具有自定义二维图形的JLabel。问题是我试图在JLabel中将文本居中,这对于构造函数中使用的任何大小都应该有效
目前,我需要计算值,并相应地设置drawString
的第二个和第三个参数
问题:是否有一种将文本置于JLabel中心的通用方法,其大小可能因每个实例而异?您可以使用
备选方案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。因此,文本将在JPAND的中间变为中心。 换句话说,在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);
您很可能需要对约束进行一些实验,但上面的代码应该是一个很好的起点。看起来您希望使用
JButton
功能绘制自己的JComponent
1) 不要重新发明轮子;在许多情况下,只需更改参数即可。一切皆有可能,例如物质、合成物和灵气
如果你真的想详细破解JButton
2) 你可以按惯例去;请注意,我们只覆盖某些方法
3) 在某些情况下,只需要在中进行更改。在执行自定义绘制时不要重写paint()方法。您永远不会重写该方法来调用paintcomponent()方法
如果您只是尝试绘制自定义背景,那么我认为您会:
1) 当代码是一个
灰色**按钮**
时,为什么代码会扩展JLabel
?2) 您最好使用PLAF或UIDefaults来更改按钮的外观。请学习java命名约定并坚持使用相关示例。@peter这对宽度部分有帮助,我应该如何确定高度(垂直居中)?@jagan:swing不幸地具有uniqe高度度量。。。尝试Shape.getFontMetrics().getHeight()@camickr这确实有帮助,但它再次在文本周围抛出了一个蓝色边框。我怎样才能消除它?这是我决定“绘制”组件的问题之一myself@jagan,您可能需要在JLabel上使用set不透明(true)。这表示您的自定义绘制将负责绘制背景。如果这没有帮助,那么您需要发布您的SSCCE,以演示问题。@camickr它是。setFocusPainted(false)
我在评论中提到的。就是找不到正确的词。不管怎样,你对OP的回复很有帮助,谢谢!JLabel没有setFocustPaint()
方法。
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);