JEditorPane: HTML макет сломан - PullRequest
       12

JEditorPane: HTML макет сломан

0 голосов
/ 20 февраля 2012

Я рендеринг некоторых изображений, которые наслоены в JEditorPane.Я читал, что JEditorPane в лучшем случае довольно шаткий, но я надеюсь, что это проблема либо с моим HTML-кодом, либо с чем-то еще.Вот как мой контент выглядит в браузере:

enter image description here

И как он выглядит в JScrollBar (JEditorPane):

enter image description here

HTML-код: http://pastebin.com/EixG3WLH

Java-код:

File f = new File("index.html");
JEditorPane jep = new JEditorPane(f.toURI().toURL());
JScrollPane sp = new JScrollPane(jep);

JFrame frame = new JFrame();
frame.add(sp);
jep.setEditable(false);

frame.setVisible(true);
frame.setSize(500, 500);
frame.setTitle(wpj.getParse().getTitle());

Я бы действительно не хотел использовать FlyingSaucer, если эту проблему можно решить в JEditorPane!

Ответы [ 2 ]

2 голосов
/ 26 апреля 2012

Вы можете сделать это ... но это не совсем просто ... потому что JEditorPane не имеет абсолютного позиционирования CSS ... поэтому, вы должны сначала вообще определить, имеет ли какой-либо элемент позицию: абсолютный или позиционный:исправлен атрибут, расширяющий ViewFactory, что-то вроде:

public class ExtendedHTMLEditorKit extends HTMLEditorKit{
//.... other code here
    public class MyHTMLFactory extends HTMLFactory{
      //other code here
      @Override
      public View create(Element elem) {
          if (isLayered(elem)){ //it means, it has position attribute
             return new PositionedView(elem);
          }
          else 
            return super.create(elem);
      }

      boolean isLayered(Element elem){
          SimpleAttributeSet sas = new  SimpleAttributeSet(elem);
          StyleSheet styles = (HTMLDocument elem.getDocument).getStyleSheet();
          Tag tag = element.getAttributes().getAttribute(AttributeSet.NameAttribute);
          sas.addAttributes(styleSheet.getRule(tag, element));
          return sas.isDefined("position") 
            && !sas.getAttribute("position").toString().equalsIgnorecase("static");
      }
    }
}

В этом случае нам нужно построить правильное представление для вашего элемента ... Я не знаю, позиционируете ли вы только изображения (вв этом случае, это может быть просто) или много вещей ... Я вижу по вашему коду, вы используете divs ...

Позвольте мне более или менее объяснить, что я делаю:создал ComponentView и вернул в качестве компонента новый JEditorPane, где я поместил innerCode исходного элемента ... и после этого переместил его в правильную позицию родительского редактора ...

Для синхронизации этодействительно трудно разрешить редактирование, но если вам нужно только использовать их для отображения, оно должно быть более простым ...

окей ... вид должен быть таким:

public class PositionedView extends ComponentView{
   private JEditorPane view;
   private JEditorPane parent;

    @Override
    public Component createComponent(){
       if (view == null){
         view = new JEditorPane();
       }
       String innerText = dumpInnerText(getElement());
       view.setText(innerText);
       view.setLocation(getAbsoluteX(), getAbsoluteY());
       parent.add(view);
    }

    @Override
    public void setParent(View parent) {
      if (parent != null) {

        java.awt.Container host = parent.getContainer();
        if (host != null && host instanceof JEditorPane) {
            parent = (JEditorPane) host;
        }
      }

    super.setParent(parent);
   }

    protected int getAbsoluteX() {
     //search for the attribute left or right and calculate the position over parent
    }

    protected int getAbsoluteY(){
     //search for the attribute top or bottom and calculate the position over parent
    }

    protected String dumpInnerText(Element element){
     //there are several ways to do it, I used my own reader/writer, 
     //because I've need add special tags support...
    }
}

Iнадеюсь, это поможет вам ... Ах!есть еще одна вещь: если вы сделаете это, вы должны обеспечить, чтобы ваше представление не было непрозрачным, и это означает, что все элементы представления, в другом случае, у вас будет пустой прямоугольник для ваших элементов.

ДругойДело в том, что вам, возможно, нужно проверить правильность размера представления ... сделайте как getAbsoluteX / getAbsoluteY для получения атрибутов width / height.

2 голосов
/ 20 февраля 2012

JEditorPane не так хорош с абсолютным позиционированием CSS. Я думаю, что вы пытаетесь достичь большего с JEditorPane, чем он способен доставить.

...