Пользовательский рендер в JTextField. Является ли это возможным ? - PullRequest
0 голосов
/ 17 января 2012

Мне нужно создать компонент, который выглядит как JTextField (те же границы, тени, закругленные углы и т. Д.), Но для отображения некоторой графики с текстом.

Можно ли создать что-то вроде рендерера для JTextField?Или создайте пользовательский компонент на основе JPanel, но как заставить его выглядеть так же, как JTextField

Еще одна сложность заключается в том, что приложение будет работать на разных LAF, измененных на лету.

У вас есть идеи?

Ответы [ 2 ]

8 голосов
/ 17 января 2012

Используйте JTextPane или JEditorPane, который может обрабатывать стилизованный текст (со встроенными значками). См. Как использовать панели редактора и текстовые панели для получения более подробной информации.

Embedded images in rich text documents


Обновление

Мне нужно создать пользовательский компонент, который будет выглядеть как JTextField в другом стиле. Использование JTextPane или JEditorPane изменит границы штриховки и компонента.

В самом деле? На следующем снимке экрана показаны все 3. Что есть что?

Distinguish These

(Нет обмана, глядя на код 1-й.)

Что касается PLAF. Покажите мне ПЛФ, в котором между ними есть какое-то видимое различие.

import java.awt.*;
import javax.swing.*;

class DistinguishThese {

    public void initGui() {
        JPanel gui = new JPanel(new GridLayout(3,0,2,2));

        gui.add(new JTextField(5));
        gui.add(new JScrollPane(new JEditorPane()));
        gui.add(new JScrollPane(new JTextPane()));

        JOptionPane.showMessageDialog(null, gui);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                DistinguishThese dt = new DistinguishThese();
                dt.initGui();
            }
        });
    }
}
3 голосов
/ 17 января 2012

Нет, Swing не предоставляет никакого интерфейса DefaultTextFieldRenderer или TextFieldRendere, над которым вы можете построить. Вы упоминаете, что любите рендеринг с учетом L & F; это уже часть ответа: вам нужно будет реализовать пользовательский интерфейс для каждого L & F для рендеринга графики в TextField - это может быть выполнимым для нескольких избранных (скажем, Windows / Mac / Metal), но вряд ли для любого L & F, который пользователь может захотеть использовать (если вы оставите им выбор).

Позвольте мне предположить, у вас есть требование отображать какой-то значок статуса / проверки с полем. Сделайте следующую лучшую вещь и отобразите ее в виде значка рядом с полем, а не с самим TextField. Гораздо меньше проблем:)

...