2012-12-18 9 views
4

현재 그렇게JTextPane에 텍스트와 JComponent를 세로로 가운데에 배치하는 방법은 무엇입니까?

enter image description here

가 그렇게 보이도록 무엇을 보인다?

enter image description here

다음은 내 코드입니다 :

JFrame f = new JFrame(); 
    JTextPane textPane = new JTextPane(); 

    JTextField component = new JTextField("  "); 
    component.setMaximumSize(component.getPreferredSize()); 
    textPane.setSelectionStart(textPane.getDocument().getLength()); 
    textPane.setSelectionEnd(textPane.getDocument().getLength()); 
    textPane.insertComponent(component); 
    try { 
     textPane.getDocument().insertString(textPane.getDocument().getLength(), "text", 
      new SimpleAttributeSet()); 
    } catch (BadLocationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    f.add(new JScrollPane(textPane)); 
    f.setSize(200, 100); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 

내가 찾은이 주제에 가까운 단일 질문 : JTextPane insert component, faulty vertical alignment 그러나 정렬을 변경하는 방법 응답이 없습니다. 그러나 토론에 따르면 그것은 가능해야합니다.

+1

@DavidKroukamp 나는 수직 정렬이 수직 위치에 영향을 미친다고 생각했다. 두 번째 그림의 텍스트는 첫 번째 그림의 텍스트보다 낮게 위치합니다. – ka3ak

+0

내 실수 롤 :) –

답변

7

는이 http://java-sl.com/tip_center_vertically.html

그것은뿐만 아니라 JComponents 작업을해야 사용할 수 있습니다.

LabelView'sgetPreferredSpan() 하단에 약간의 공백을 추가 할 수도 있습니다.

또는 당신이 내부 클래스 행을 가리키는 ParagraphView

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/javax/swing/text/ParagraphView.java#ParagraphView.Row

RowView 내부 클래스를 대체 할 시도 할 수 있습니다 당신은 자신의 것으로 교체해야의 BoxView

을 확장합니다. 무시하려고하면 CENTER (0.5)를 반환하려면

public float getAlignment(int axis) 

을 반환하십시오. 이 layoutMinorAxis를 오버라이드 (override) 도움이되지 않는 경우 (0) 적절한 오프셋 (이동 돌아갑니다

+0

getPrefferedSpan() 작업을 않습니다. 텍스트 위치를 일정한 값으로 조정할 수 있습니다. 그러나 크기가 다른 구성 요소를 사용한다면 어떻게 될까요? 모든 것을 고기 꼬챙이와 비슷하게 보이기를 바랍니다. 고기의 덩어리는 크기가 다를 수 있지만 중심을 통과하면 모두 꼬치뼈가납니다. 꼬치는 텍스트입니다. "RowView"및 "ParagraphView"로이 작업을 수행 할 수 있습니까? 그렇다면 클래스를 재정의하는 방법과 ParagraphView에도 내부 클래스가없는 방법을 이해할 수 없습니다. – ka3ak

+0

@ ka3ak 답변이 업데이트되었습니다. – StanislavL

+0

Thanks!getAlignment()의 재정의 (override)가 도움이되었습니다. – ka3ak

1

을 JLabel를 사용하여 문서의 스타일을 정의하고 그 위에 수직 aligment을 설정합니다.

Style s = doc.addStyle("icUf", regular);   
ImageIcon icUf = createImageIcon("uf.png", "Unidad Funcional"); 
if (icUf != null) { 
    JLabel jl = new JLabel(icUf); 
    jl.setVerticalAlignment(JLabel.CENTER); 
    StyleConstants.setComponent(s, jl); 
} 

레이블을 삽입 :

doc.insertString(doc.getLength(), " ", doc.getStyle("icUf")); 

텍스트 : 위의 답변에 따라

doc.insertString(doc.getLength(), " text ", doc.getStyle("bold")); 
1

(이) 나를 위해 작동하지만 날이 찾아 도움이되지 않았다, 내가 사용 :

Style s = doc.addStyle("icUf", regular);   
ImageIcon icUf = createImageIcon("uf.png", "Unidad Funcional"); 
if (icUf != null) { 
    // create label with icon AND text 
    JLabel jl = new JLabel("some text",icUf, SwingConstants.LEFT); 
    StyleConstants.setComponent(s, jl); 
} 
doc.insertString(doc.getLength(), " ", doc.getStyle("icUf")) 

이 제대로 텍스트 '텍스트'와 아이콘을 정렬됩니다.

관련 문제