상세 컨텐츠

본문 제목

자바 JTextPane 을 html로 변환시 vertically 센터 설정 관련

본문

반응형

 

 

 

=================================

=================================

=================================

 

 

 

Centering text vertically in JEditorPane.All is necessary in fact is to replace the root view and shift children vertically. The shift is half of difference between available height and sum of children's heights. The screenshot illustrates the result and the code are below

 

import javax.swing.*; import javax.swing.text.*; import java.awt.*;   public class Test {      JTextPane edit=new JTextPane();     public Test() {         JFrame frame=new JFrame("Center text vertically");         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         frame.getContentPane().add(edit);         try {              edit.setEditorKit(new MyEditorKit());             SimpleAttributeSet attrs=new SimpleAttributeSet();             StyleConstants.setAlignment(attrs,StyleConstants.ALIGN_CENTER);             StyledDocument doc=(StyledDocument)edit.getDocument();             doc.insertString(0,"111\n2222222\n33333333333333",attrs);             doc.setParagraphAttributes(0,doc.getLength()-1,attrs,false);         }         catch (Exception ex) {              ex.printStackTrace();         }           frame.setSize(300,300);         frame.setLocationRelativeTo(null);         frame.setVisible(true);     }     public static void main(String[] args) throws Exception {          new Test();     } }   class MyEditorKit extends StyledEditorKit {      public ViewFactory getViewFactory() {         return new StyledViewFactory();     }       static class StyledViewFactory implements ViewFactory {          public View create(Element elem) {             String kind = elem.getName();             if (kind != null) {                 if (kind.equals(AbstractDocument.ContentElementName)) {                      return new LabelView(elem);                 } else if (kind.equals(AbstractDocument.ParagraphElementName)) {                     return new ParagraphView(elem);                 } else if (kind.equals(AbstractDocument.SectionElementName)) {                      return new CenteredBoxView(elem, View.Y_AXIS);                 } else if (kind.equals(StyleConstants.ComponentElementName)) {                     return new ComponentView(elem);                 } else if (kind.equals(StyleConstants.IconElementName)) {                      return new IconView(elem);                 }             }               return new LabelView(elem);         }      } }   class CenteredBoxView extends BoxView {     public CenteredBoxView(Element elem, int axis) {          super(elem,axis);     }     protected void layoutMajorAxis(int targetSpan, int axis, int[] offsets, int[] spans) {          super.layoutMajorAxis(targetSpan,axis,offsets,spans);         int textBlockHeight = 0;         int offset = 0;           for (int i = 0; i < spans.length; i++) {              textBlockHeight = spans[i];         }         offset = (targetSpan - textBlockHeight) / 2;         for (int i = 0; i < offsets.length; i++) {             offsets[i] += offset;         }      } }    

 

 

 

=================================

=================================

=================================

 

 

 

반응형


관련글 더보기

댓글 영역