반응형
=================================
=================================
=================================
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; } } }
=================================
=================================
=================================
반응형
'프로그래밍 관련 > 언어들의 코딩들 C++ JAVA C# 등..' 카테고리의 다른 글
java 프레임, JPanel 패널에 백그라운드에 이미지설정 또는 투명값 설정 관련 (0) | 2015.03.09 |
---|---|
자바 현재 view나 frame 또는 panel 에 들어간 오브젝트 컴포넌트가 있는지 알아보기 (0) | 2015.03.09 |
자바 현재 리소스의 URL 을 알아내기 (0) | 2015.03.09 |
java 개발 프린터 객체 설정된 프린터 가져오기 또는 디폴드 프린터 가져오기 (지정한 프린터 서비스 가져오기) 관련 (0) | 2014.01.23 |
자바 버전7 업데이트 51 로 업데이트 했을때 manifest 보안 에러 관련 ("Missing Application-Name manifest attribute for") (0) | 2014.01.15 |