Значки между текстом в Jlabel с использованием графики - PullRequest
2 голосов
/ 26 июня 2009

Как нарисовать несколько значков (например, значки между текстом) в JLabel, используя графику? Пожалуйста, помогите мне в этом усилии

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

Одним из способов является использование настраиваемой рамки, которая рисует значок (и текст, если хотите), тогда вы можете вкладывать неопределенно долго.

Вот одна из таких границ:

/**
 * Show a leading or trailing icon in border.
 */
public static class IconBorder implements Border
{
    /**
     * @param icon - icon to paint for this border
     * @param top outer insets for this border
     * @param left
     * @param bottom
     * @param right
     */
    public IconBorder(Icon icon, int top, int left, int bottom, int right)
    {
        setIcon(icon);
        top_ = top;
        left_ = left;
        bottom_ = bottom;
        right_ = right;
        rect_ = new Rectangle(0, 0, icon_.getIconWidth(), icon_.getIconHeight());
    }

    public Insets getBorderInsets(Component c)
    {
        if( icon_ == null )
            return new Insets(0, 0, 0, 0);
        return isTrailing_ ? new Insets(top_, left_, bottom_, icon_.getIconWidth() + right_) :
                             new Insets(top_, icon_.getIconWidth() + left_, bottom_, right_);
    }

    public boolean isBorderOpaque()
    {
        return false;
    }

    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height)
    {
        if( icon_ != null )
        {
            if( isTrailing_ )
                x = width - icon_.getIconWidth() + 4;
            else
                x += left_ - 1;
            icon_.paintIcon(c, g, x, y + top_);
            rect_.x = x;
            rect_.y = y;
        }
    }

    public void setIcon(Icon icon)
    {
        if( icon_ != icon )
            icon_ = icon;
    }

    public Icon getIcon()
    {
        return icon_;
    }

    public void setPosition(boolean isTrailing)
    {
        isTrailing_ = isTrailing;        
    }

    public Rectangle getIconRect()
    {
        return rect_;
    }

    private final int top_;
    private final int left_;
    private final int bottom_;
    private final int right_;
    private final Rectangle rect_;
    private Icon icon_;
    private boolean isTrailing_ = true;
}

Я использую это, чтобы добавить значок поиска в JTextField (окно поиска в стиле браузера). getIconRect может использоваться для проверки наведения мыши. Например, я меняю курсор на HAND_CURSOR, когда мышь находится над значком поиска.

1 голос
/ 26 июня 2009

Один из вариантов, который я бы использовал, это иметь последовательность JLabels. Одни со значком и те, которые только с текстом.

Другой вариант - использовать поддержку мини-HTML JLabel:

<html><img src='theimage.png'>The text<img src='theimage2.png'>

как текст JLabel. Этот подход работает для форматирования текста, но я не уверен, что теги изображений там тоже работают.

Или вы переопределили JLabel.paint (), чтобы сделать пользовательский рендеринг кстати?

Тогда я бы использовал следующий подход:

List<Object> textAndImage = new ArrayList<Object>() {{
    add("This ");
    add(new ImageIcon("image1.png"));
    add(" is ");
    add(new ImageIcon("image2.png"));
    add(" an ");
    add(" imaged text sample ");
}};
FontMetrics fm = g.getFontMetrics();
int x = 0;
for (Object o : textAndImage) {
    if (o instanceof String) {
        g.drawString((String)o, x, fm.getHeight());
        x += fm.stringWidth((String)o);
    } else
    if (o instanceof ImageIcon) {
        ((ImageIcon)o).paintIcon(null, g, x, 0);
        x += ((ImageIcon)o).getIconWidth();
    }
}

Конечно, это не полноценное решение, но может дать вам несколько советов, как действовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...