JLabel中心drawString()文本的大小不同

时间:2011-09-20 17:43:50

标签: java swing jlabel

我的自定义按钮代码是:

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的一般方法,其大小可能因每个实例而异?

4 个答案:

答案 0 :(得分:4)

您可以使用FontMetrics获取字符串的宽度。

    Shape.getFontMetrics().stringWidth(ButtonText);

答案 1 :(得分:4)

执行自定义绘制时,不要覆盖paint()方法。您永远不会覆盖该方法来调用paintCompnent()方法。

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

  1. 在paintComponent()方法的开头绘制渐变背景。

  2. 然后调用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"