如何在运行时突出显示JLabel的一部分?

时间:2013-01-17 09:49:43

标签: java jlabel method-overriding

我在JPanel中有一个JLabel。我正在使用Netbeans IDE作为我的java程序的GUI(免费设计,没有布局管理器)。

在运行时,我需要突出显示我的JLabel的一部分。突出显示JLabel的一部分可以按照此处的说明完成:How to highlight part of a JLabel?

我不知道如何在运行时这样做,我的意思是我已经有了一个JLabel,现在我怎么能为此目的覆盖它的paintComponent()方法呢?

1 个答案:

答案 0 :(得分:0)

以下是Tikhon Jelvis在您提到的帖子中给出的答案的说明性示例,您只需添加一些字段(在此示例中为startend)来指示突出显示,并使用方法(在此示例中为highlightRegion)来设置这些字段:

import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Main
{
    public static void main(String[] argv)
    {
        JFrame frame = new JFrame("Highlighting");
        frame.setSize(300, 100);

        Label label = new Label();
        label.setText("Money does not buy happiness");
        label.setVerticalAlignment(JLabel.TOP);
        label.highlightRegion(3, 15);

        frame.add(label);
        frame.setVisible(true);
    }

    static class Label extends JLabel
    {
        private static final long serialVersionUID = 1L;
        private int start;
        private int end;

        @Override
        public void paint(Graphics g)
        {
            FontMetrics fontMetrics = g.getFontMetrics();

            String startString = getText().substring(0, start);
            String text = getText().substring(start, end);

            int startX = fontMetrics.stringWidth(startString);
            int startY = 0;

            int length = fontMetrics.stringWidth(text);
            int height = fontMetrics.getHeight();

            g.setColor(new Color(0x33, 0x66, 0xFF, 0x66));
            g.fillRect(startX, startY, length, height);

            super.paint(g);
        }

        public void highlightRegion(int start, int end)
        {
            this.start = start;
            this.end = end;
        }
    }

}

请注意使用label.setVerticalAlignment(JLabel.TOP);来简化操作。如果您不使用它,那么您需要进行额外的计算以确定要突出显示的区域的确切垂直位置。