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()方法

如果您只是尝试绘制自定义背景,那么我认为您会:

  • 在paintComponent()方法的开始处绘制渐变背景

  • 然后调用super.paintComponent(g)。正常绘制代码将基于水平对齐特性定位文本


  • 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);