HTMLDocument: Swing "оптимизирует" элементы span? - PullRequest
0 голосов
/ 17 апреля 2009

Я возиться с HTMLDocument в JTextPane в Swing. Если у меня такая ситуация:

 <html>... 
    <p id='paragraph1'><span>something</span></p> 
    <span id='span1'><span>something else</span></span>
 ...</html>

(дополнительные теги <span> не позволяют Swing жаловаться на то, что я не могу изменить innerHTML листа) или эта ситуация

 <html>... 
    <p id='paragraph1' />
    <span id='span1' />
 ...</html>

Я могу вызвать HTMLDocument.getElement () и найти элемент с идентификатором 'para1', но не элемент с идентификатором 'span1'. Если я поменяю тег для span1 с span на p, то я в порядке. WTF здесь происходит? Есть ли другой элемент HTML, который я могу использовать вместо этого, который позволит мне получить доступ к определенной части документа с помощью атрибута id, который не вызовет разрывов строк? (промежуток был бы идеален :( аааа!)

edit: Я думаю, что решение состоит в том, чтобы пересмотреть то, что я пытаюсь сделать, чтобы использовать тот факт, что я знаю, как сделать GUI + таблицы + отображения в HTML намного больше чем я в Swing, поэтому я задам другой вопрос ....

Ответы [ 3 ]

1 голос
/ 16 июля 2009

У меня именно эта проблема. Мои элементы span исчезают. Принимая во внимание, что если я использовал div, я могу их видеть Но, конечно, я не хочу элементов div, потому что это вызывает разрыв строки.

Черт возьми! Черт, ява

Редактировать!

СТОП ПРЕССА !!

Нашел ответ. По крайней мере, ответ, который исправляет это для меня.

Я все еще мог определить, что у меня есть элемент span. Я опишу, что я делаю, и предоставлю код, как я это сделал.

Я хочу знать, в каком элементе каретки находится. Итак, этот код существует в функции caretUpdate, которая предоставляет мне позицию каретки при каждом ее перемещении.

@Override
public void caretUpdate(CaretEvent e)
{
    System.out.println("caret event: " + e.toString());
    Object source = e.getSource();

    if (source instanceof JEditorPane)
    {
        JEditorPane jep = (JEditorPane)source;
        Document doc = jep.getDocument();
        if (doc instanceof HTMLDocument)
        {
            HTMLDocument hdoc = (HTMLDocument)doc;
            int pos = e.getDot();
            Element elem = hdoc.getCharacterElement(pos);
            AttributeSet a = elem.getAttributes();
            AttributeSet spanAttributeSet = (AttributeSet)a.getAttribute(HTML.Tag.SPAN);

            // if spanAttributeSet is not null, then we properly found ' a span '.
            // now we need to discover if it is one of OUR spans
            if (spanAttributeSet!=null)
            {
                Object type = spanAttributeSet.getAttribute(HTML.Attribute.TYPE);
                if (type !=null && type.equals("dragObject"))
                {
                    // for our logging, we get the ref, which holds the source
                    // of our value later
                    System.out.println("the value is: " + spanAttributeSet.getAttribute("ref"));
                }                   
            }
        }
    }
}

Редактировать !!!

Поцарапайте это ... Это почти работает ... за исключением того, что идиоты в Sun решили, что ключ будет иметь тип HTML. Атрибут. Мало того, что конструктор для HTML.Attribute является закрытым, и просто так получилось, что требуемый тип атрибута не существует в их привилегированном наборе атрибутов. Сволочи! Итак, еще не все потеряно ... Я все еще могу получить это через счетчик ... но это немного сложнее, чем нужно.

ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ!

Хорошо, теперь я понял. Если атрибут относится к известному типу, он сохраняется в AttributeSet как экземпляр HTML.Attribute («тип»). В противном случае он сохраняется в AttributeSet с ключом String. Глупый. Но у меня есть.

1 голос
/ 17 апреля 2009

Я не знаю Swing, но

<p style="display: inline;"> не переводит строки, так же, как <span>

0 голосов
/ 17 апреля 2009

Я взглянул на javadoc для HTMLDocument , который указал мне на HTMLReader .

Я не вижу упоминания span в HTMLReader. Может быть, он просто не знает этого элемента.

P, вероятно, не является хорошей заменой для span. P является элементом уровня блока, а span является элементом уровня текста (см. Описание этих терминов) . Может быть, попробовать шрифт (другой элемент уровня текста) без атрибутов?

...