2012-11-30 5 views
0

wiki 소스 편집 응용 프로그램에서 JTextPane을 사용하고 있습니다. StyledDocument.setCharacterAttributes을 통해 문자 속성을 다른 스타일로 변경하여 잘못 발음 된 단어에 밑줄을 긋는 간단한 맞춤법 검사 기능을 추가했습니다.JTextPane 단어 배치 문제

기본값과 '맞춤법이 틀린'두 가지 스타일 만 사용됩니다. 텍스트 편집기 컨트롤은 예상되는 동작 인 줄 바꿈을 수행합니다.

제 문제는 (항상 그런 것은 아니지만 특정 wiki 문서로 재현 가능합니다)이 문자 속성이 어떻게 든 변경되면 단어 줄 바꿈이 비활성화된다는 것입니다. 더 구체적으로 말하자면, 문서 중간에서 3 줄을 지우고 다음에 맞춤법 검사기를 실행하면 문자 속성을 기본 스타일 (맞춤법 검사를 다시 실행하기 전에)로 재설정 할 때 단어 줄 바꿈 기능이 비활성화되고 그대로 유지됩니다 방법. 삭제를 취소하면 단어 줄 바꿈이 정상적으로 돌아갑니다.

editorPane.getStyledDocument().setCharacterAttributes(0, editorPane.getStyledDocument().getLength(), defaultStyle, true); 

이 문제를 해결 :

스타일을 재설정 한 줄을 주석.

EDIT 1

나는 간단한 테스트 케이스에 문제를 추출했습니다.

package jtextpanebug; 

import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 
import javax.swing.WindowConstants; 
import javax.swing.text.Style; 


public class DemoFrame extends javax.swing.JFrame { 

    private final JButton btResetStyle; 
    private final JScrollPane scrollPane; 
    private final JTextPane textPane;  
    private final Style defaultStyle; 

    public DemoFrame() { 
     // Creating a simple form with a scrollable text pane and a button 
     scrollPane = new JScrollPane(); 
     textPane = new JTextPane(); 
     btResetStyle = new JButton(); 

     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); 

     // The text pane's text is the scrambled version of my original test data, 
     // it is important because the problem depends on the pane's text 
     // (not every text makes it wrong) 
     textPane.setText("= Gernela Stuff Dogo to Wnko Obuat Oebrfe Disytung hte Iidnividal Oitpcs =\n\n== Elmyonrogit ==\n\n'''memidtaie-ngiebhro opnits''' - 2 points, \nwihhc nac eb ense ot eb mmiieadte hnigeorbs fo haec othre. \nThere si no strict | cxeat defiintoin. \nEth etipcur owebl shsow sa an example optins dna the rispa \nienbg mimedtiea iebnghsor ear ncnoetced.\n\n[[Amieg:einogrhb_pinsot.pgn]]\n\n'''enihgorb optnsi distacne''' - het avaeegr of sdntaisce \nderemitedn by het mimeidate-hieobngr tonpi ipras. \n\n'''lalw''' - a iotpntes nepgesnietrr a llwa, with toerh orwds: 2 apraelll, \nevyr sloce sraufce picsee. Heer is an xamelpe. \nIt is eualgttandri ofr eterbt zisiuaitovlan.\n\n[[Gimae:llwa.npg]]\n\n'''addtaiilon emmory reeueimtnqr of na laigorthm''' - \n(eth kepa mmeory suaeg fo teh nltpiaciapo ndirug the excteouin of eht grlaotihm) - \n(hte moeymr sueag fo hte loragitmh befoer ro ftrea eht ucxeeiont of the laogrihmt)\n\n== Het Input Pnoitset Ash to Repnrsete Ufscear Arsnoelbay Elwl ==\n\nIf tno efisciped toehrwsie yb hte cdoritnpsei of an aoglirthm, \nhetn hte eqtunrmeersi of it are heste:\n\n* Ifsrt fo all the poisentt umst reprseent urfseac, not urvec ro uvomel or nayithng eesl.\n* Awlls aym otn eb tniehnr tanh at least 3 * fo ienhbgro-tpoin-sidenact.\n* Dseeg amy ton be rhserap tnha 70 grdesee (as het agnle fo eht trmeaial) nda husdol be ta tleas 290 redeseg (ni caes fo cnvocae eedgs).\n* Onpti edintsy amy ont vayr oto humc \n** Het angre fo the coall ption desitnsei of a igsenl pisnotte nutip ushold eb sallm. Ahtt is: teh orait of het oclla oitnp idsentise oarund any 2 ipnost lsdhou eb lmitied.\n** Hte lcoal noipt deisynt ushlod otn ahencg sdduelyn (gliftyscaiinn ni a hotsr idnsteac). \n\nYreftntunaoul the largoimths cna tno yb ethmsevesl \nhcekc these qutenmeserir nda usjt yden rnuning, \nso it si eth rseu's iyponerissbtil to ton extucee an raltghomi no a itseopnt \nthat does ont mete het aogitmlhr's terieseurmnq.\n\nIf eth rmeteriuqen fo na airlgmoth on its npuit is ont mte, then tobh hte ueavbhior nad hte srluet fo hte alghoritms si dinfeuned. \nTeh loirgamth amy nru rfo iinfntie long imet or rodpuce evry abd rselut, ro a eruslt htat oolsk good btu is nicrtroec. Ni htis scea rtehe si tno nay aguntreee toabu the tmniatreion of the iralgtmho ro eht lqutaiy fo the sreltu ecxept htat the nptapalcioi iwll ont carsh.\n"); 
     scrollPane.setViewportView(textPane); 

     getContentPane().add(scrollPane); 

     btResetStyle.setText("Reset style"); 
     btResetStyle.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent evt) { 
       btResetStyleActionPerformed(evt); 
      } 
     }); 
     getContentPane().add(btResetStyle); 

     pack(); 

     // The default style, the problem happens when we reset the full document 
     // to it: 
     defaultStyle = textPane.addStyle("default", null);   
    } 

    private void btResetStyleActionPerformed(java.awt.event.ActionEvent evt) { 

     // When the button is pressed we reset the full document to the default 
     // style. In the original application this was periodically done as 
     // part of the spell checking 
     textPane.getStyledDocument().setCharacterAttributes(0, textPane.getStyledDocument().getLength(), defaultStyle, true); 
    } 

    public static void main(String args[]) {     
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new DemoFrame().setVisible(true); 
      } 
     }); 
    }  
} 

문제 재현 : 긴 라인 죄송합니다, 그 예를 들어 텍스트가 버그를 재현하는 것이 중요하다 (무작위로 된)

  1. 컴파일을하고하려고
  2. 위의 클래스를 실행 프레임의 크기를 조정 - 줄 바꿈이
  3. 가 찾아 작품과 내가
  4. 을 눌러 아래 복사 한 세 가지 라인에게 Reset style 삭제 버튼을
  5. ,
  6. 는 줄 바꿈 스타일이 내 문제를 해결하는 대신 하이 라이터를 사용
 
* Onpti edintsy amy ont vayr oto humc 
** Het angre fo the coall ption desitnsei of a igsenl pisnotte nutip ushold eb sallm. Ahtt is: teh orait of het oclla oitnp idsentise oarund any 2 ipnost lsdhou eb lmitied. 
** Hte lcoal noipt deisynt ushlod otn ahencg sdduelyn (gliftyscaiinn ni a hotsr idnsteac). 

편집 2

을 해제,하지만, 난 여전히 원래의 접근 방식에 무엇이 잘못된 것인지 궁금합니다.

+2

은 [SSCCE] (http://sscce.org/)를 게시 한 후 좋은 질문이 될 수 있습니다. 문서 – mKorbel

+0

에 하드 코드 된 텍스트가 포함 된 짧고, 실행 가능한, 컴파일 가능한, 문제가 있음을 입증했습니다. 나중에 하나 나중에 – vigoo

+2

IMHO 맞춤법 검사는 텍스트 속성이 아닌 형광펜을 기반으로해야합니다. 나는 서로 다른 프로젝트에서 두 가지 접근법을 시도했지만 모델에 오정렬을 저장하지 않고 오히려 보여줍니다. 또한 형광펜 기반 접근 방식이 더 빨리 작동합니다. 단지 2 센트. – StanislavL

답변