Вы можете сделать это ... но это не совсем просто ... потому что 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.