2010-01-30 2 views
5

Java에서 간단한 WYSIWYG RTF 편집기를 개발 중이며 작은 문제가 있습니다. 스타일 선택 토글 버튼 (예 : 굵게, 기울임 꼴, 밑줄)을 사용자 텍스트 선택과 동기화 할 수 있어야합니다. 예를 들어, 현재 텍스트 선택이 일반 텍스트 인 경우 굵게, 기울임 꼴 및 밑줄이 표시된 토글 버튼은 선택되지 않지만 사용자가 굵게 및 밑줄이있는 텍스트를 선택하면 굵게 및 밑줄이 그어진 토글 버튼이 선택됩니다.JTextPane 스타일 선택 UI 동기화 문제

이제는 JTextPane.getInputAttributes()이 내가 원하는 선택 속성을 가져 오지만 캐럿 업데이트 이벤트를 수신하는 데 문제가 있음을 확신합니다. 문제는 입력 속성 변경이 발생한 후 JTextPane에 첨부 된 캐럿 수신기가 호출 된 것 같습니다. 따라서 선택은 항상 한 걸음 뒤로입니다. 즉, 토글 버튼이 업데이트되기 전에 텍스트를 두 번 선택해야합니다!

중요한 코드는 여기에 있습니다 :

textPane.addCaretListener(new CaretListener() { 

     @Override 
     public void caretUpdate(CaretEvent e) { 
      syncAttributesWithUI(textPane.getInputAttributes()); 
     } 
    }); 

그리고 : 사전에

private void syncAttributesWithUI(AttributeSet attributes) { 
    boldButton.setSelected(StyleConstants.isBold(attributes)); 
    italicButton.setSelected(StyleConstants.isItalic(attributes)); 
    underlineButton.setSelected(StyleConstants.isUnderline(attributes)); 
} 

감사합니다!

+0

질문에 대한 답변이 있습니까? 그렇지 않다면 SSCCE 게시를 고려하십시오 –

답변

1

CaretListener은 (는) textPane을 듣고 있지만 선택 항목의 기존 속성은 Document에 있습니다. CaretEvent 메서드를 사용하여 Document의 선택한 부분을 찾고 거기에있는 스타일을 기반으로 버튼 조건을 지정할 수 있습니다. 안타깝게도 선택 사항은 일관성이 없습니다. 굵은 글씨체와 이탤릭체 부분. 일반적인 방법은 사용자가 전체 선택 항목에 완전히 새로운 속성 집합을 적용하려고한다고 가정하는 것입니다.

+0

제안하는 방법은 실제로 내가 원래 한 일입니다. 선택 항목의 각 개별 문자 요소를 가져오고 속성 집합 교차를 찾아서 UI가 반영해야하는 것을 결정합니다. 하지만 그때 나는 1) getInputAttributes() 메소드가 이미 이것을하고있는 것, 그리고 2) 사용자가 입력을 트리거 할 때까지 캐럿이 문서의 마지막 위치로 이동되면 어떤 방식으로 스타일이 적용되는지를 확인할 수 없다는 것을 깨달았다. 물론 (end position - 1)에서 문자 스타일을 계산하여 이것을 결정할 수는 있지만 깨끗한 방법이되기를 기대하고 있습니다. ( – S73417H

+0

사용자가 getInputAttributes()에 의해 반환 된 속성을 원할 것으로 기대합니다. 마지막에 캐럿이있을 때 변경되지 않은 상태로 유지됩니다. – trashgod

0

당신은 동기화를 연기을 시도 할 수 있기 때문에 다른 변화가 먼저 일어날 수 :

@Override 
public void caretUpdate(CaretEvent e) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      syncAttributesWithUI(textPane.getInputAttributes()); 
     } 
    }); 
} 

(면책 조항 : 내 머리의 상단에서 추측하는 것은 - 실제로 테스트를 작성하지 않은 것은 확인)