Página Inicial do Fórum > GUI - (Applets, Swing, SWT, etc)

Localizar palavras em JTextPane



Criar novo tópico   Responder tópico


  1. Yoshimitsu
    Posts:20


    Comment Arrow

    Publicado em: 24/12/2011 20:02:00

    Fala galera!

    Eu consigo usar o localizar em um JTextArea normalmente, mas quando vou usar no JTextPane ele não funciona direito porque ele conta a quebra de linha '\n' com caractere alterando a parte que deveria ser selecionada.
    eu já usei o indexOf, tentei percorrer o texto com substring num loop, e tentei diminuir o numero da linha da area selecionada mas não adiantou. Tem algum jeito de não contar o '\n' como caractere assim como no JTextArea?
    Tem que ser um JTextPane porque quero mudar a cor do texto em palavras especificas o que não seria possivel com o JTestArea.




  1. RogerCF
    Posts:305


    Comment Arrow

    Publicado em: 25/12/2011 00:34:51

    O q é "usar o localizar"? Não entendi tbm o q quer dizer com contar o \n como caractere (o '\' e o 'n' são caracteres e sempre são contados), alterar parte q deveria ser selecionada...? seu post não diz muita coisa

    Vou supor q tudo isso seja apenas pra dizer q vc ta procurando ocorrencia de uma String dentro de outra String. Não vejo problema em ter alguns \n pela String, isso não deve mudar o resultado da pesquisa. Se for extremamente necessário basta remover os \n da String (gambiarra) antes de procurar ocorrencias de outra String (se é q é isso mesmo q vc quer). Ou se vc ta pesquisando com expressão regular, faça uma q aceite ocorrencias \n dentro da String pesquisada, deve ser mais rapido q remover todos os \n




  1. sekkuar
    Posts:5998


    Comment Arrow

    Publicado em: 25/12/2011 16:27:58

    Eu só queria entender, desde quando JTextArea não usa \n como quebra de linha.
    _________________
    Sekkuar ~ Ex-Catador Executivo do Javafree - (Não mais) Catando os tópico tudo.
    "The mod javafree deserves, but not the one it needs right now."


    Stack Traces existem pra ajudar e não para trazer uma mensagem de satã dizendo que seu computador será destruído.


    Peça seu Código Pronto para o seu Dever de Casa aqui
    You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.




  1. Yoshimitsu
    Posts:20


    Comment Arrow

    Publicado em: 24/12/2011 20:02:00

    Eu achei esse código na internet:

    ele funciona perfeitamente em um JTextArea, mas em um JTextPane não.
    o único motivo que eu pude deduzir, é a formatação do JTextPane. Pode não ser mas eu pensei que fosse.
    E eu em momento algum disse que o JTextArea não utilizava o '\n' como quebra linha.
    Agradeço se me ajudarem.




  1. RogerCF
    Posts:305


    Comment Arrow

    Publicado em: 25/12/2011 00:34:51

    Testei aqui e o comportamenteo, como esperado, foi igual pra String vinda do JTextArea e pra String vinda do JTextPane. Inclusive o select() funcionou igual em ambos

    Imagino que seu problema seja pesquisar por uma frase que tenha uma quebra de linha no meio. Repare q o fato de vc escrever um texto maior q a largura do componente e ele exibir em linhas diferentes não significa que tem quebra de linha realmente (é apenas visual).

    Veja se vc não ta testando coisas diferentes: num vc ta dando paragrafo pressionando enter e no outro a quebra de linha é apenas visual por falta de espaço (no segundo caso a String não tem \n)




  1. Yoshimitsu
    Posts:20


    Comment Arrow

    Publicado em: 24/12/2011 20:02:00

    Na primeira linha ele funciona direito, mas a partir da segunda ele seleciona a partir da segunda letra e na terceira linha a partir da terceira letra e assim por diante.
    Como posso resolver isso?




  1. kbianchi
    Posts:195


    Comment Arrow

    Publicado em: 25/12/2011 19:40:13

    Yoshimitsu
    Na primeira linha ele funciona direito, mas a partir da segunda ele seleciona a partir da segunda letra e na terceira linha a partir da terceira letra e assim por diante.
    Como posso resolver isso?



    Bom cara, como o nosso amigo falou, foi testado com ambos e em todos funcionou, provavelmente o problema não é com quebra de linha, o problema está no seu código.
    Vai ajudar bastante, se você postar o seu código completo.




  1. Yoshimitsu
    Posts:20


    Comment Arrow

    Publicado em: 24/12/2011 20:02:00

    Eu uso o NetBeans para gerar a interface gráfica e implemento esse código em um botão.
    funciona no JTextArea mas não funciona no JTextPane a partir da segunda linha, ele seleciona mas seleciona errado.
    Tentem procurar uma mesma palavra que esteje em linhas diferentes, se for só uma palavra no exto inteiro funciona, mas quando há palavras iguais em linhas diferentes ele seleciona errado.




  1. sekkuar
    Posts:5998


    Comment Arrow

    Publicado em: 25/12/2011 16:27:58

    Seu JTextPane *deve* estar usando um texto com tags html

    ou seja, se o seu texto aparece assim


    na verdade, a String é



    Se você usar o seu código de busca para procurar a frase


    Ele não vai encontrar, porque, enquanto o JTextPane reconhece as tags html, o seu código de pesquisa não, e para ele, as tags fazem parte da frase.
    _________________
    Sekkuar ~ Ex-Catador Executivo do Javafree - (Não mais) Catando os tópico tudo.
    "The mod javafree deserves, but not the one it needs right now."


    Stack Traces existem pra ajudar e não para trazer uma mensagem de satã dizendo que seu computador será destruído.


    Peça seu Código Pronto para o seu Dever de Casa aqui
    You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.




  1. Yoshimitsu
    Posts:20


    Comment Arrow

    Publicado em: 24/12/2011 20:02:00

    Não é esse o problema, eu já verifiquei o JTextPane está em
    text/plain
    eu já tentei usar com html só pra testar mesmo mas ficou ainda mais errado.




  1. simu
    Posts:9416


    Comment Arrow

    Publicado em: 25/12/2011 20:36:40

    Yoshimitsu
    Na primeira linha ele funciona direito, mas a partir da segunda ele seleciona a partir da segunda letra e na terceira linha a partir da terceira letra e assim por diante.
    Como posso resolver isso?



    Ahhh, uma explicação que descreve bem o problema.

    Como resolver: muda para Linux! [:-)

    A documentação do JTextPane explica, ou pelo menos aponta para a explicação:

    JTextPane JTextPane

    Newlines
    For a discussion on how newlines are handled, see DefaultEditorKit">http://docs.oracle.com/javase/7/docs/api/javax/swing/text/DefaultEditorKit.html"">DefaultEditorKit



    Newlines
    There are two properties which deal with newlines. The system property, line.separator, is defined to be platform-dependent, either "\n", "\r", or "\r\n". There is also a property defined in DefaultEditorKit, called EndOfLineStringProperty, which is defined automatically when a document is loaded, to be the first occurrence of any of the newline characters. When a document is loaded, EndOfLineStringProperty is set appropriately, and when the document is written back out, the EndOfLineStringProperty is used. But while the document is in memory, the "\n" character is used to define a newline, regardless of how the newline is defined when the document is on disk. Therefore, for searching purposes, "\n" should always be used. When a new document is created, and the EndOfLineStringProperty has not been defined, it will use the System property when writing out the document.

    Note that EndOfLineStringProperty is set on the Document using the get/putProperty methods. Subclasses may override this behavior.



    Resumo: internamente é usado "\n" (1 caracter) para marcar a mudança de linha, mas, no texto obtido pelo getText(), é usado a seqüência do sistema operacional, "\r\n" (2 caracteres) para Windows.
    A procura é feita no texto obtida pelo getText que usa duas posições para cada mudança de linha, mas quando faz a marcação, as mudanças de linha ocupam apenas uma posição - para cada linha a discrepância aumenta de 1!

    Solução (multiplataforma):
    Pegue o texto diretamente do Documento (do JTextArea) em vez de indiretamente do JTextArea:

    []

    PS: e, como se trata de GUI, tópico movido de Java">http://javafree.uol.com.br/f-1-Java-Basico.html"">Java Básico para GUI">http://javafree.uol.com.br/f-8-GUI-Applets-Swing-SWT-etc.html"">GUI - (Applets, Swing, SWT, etc)!
    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.




  1. simu
    Posts:9416


    Comment Arrow

    Publicado em: 25/12/2011 20:36:40

    kbianchi
    Yoshimitsu
    Na primeira linha ele funciona direito, mas a partir da segunda ele seleciona a partir da segunda letra e na terceira linha a partir da terceira letra e assim por diante.
    Como posso resolver isso?



    Bom cara, como o nosso amigo falou, foi testado com ambos e em todos funcionou, provavelmente o problema não é com quebra de linha, o problema está no seu código.
    Vai ajudar bastante, se você postar o seu código completo.



    Esse erro só vai aparecer no Windows (ou outra plataforma que usa dois caracteres como mudança de linha)!

    acabei de testar e consegui reproduzir o erro (sem usar a solução postada anteriormente, mas antes do seu post)!

    Para facilitar a visualização do problema:

    textpane.jpg



    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.




  1. Yoshimitsu
    Posts:20


    Comment Arrow

    Publicado em: 24/12/2011 20:02:00

    Perfeito simu!
    Agora tá funcionando como eu queria valeu mesmo.
    Hoje você me ensinou três coisas novas !!!!




  1. simu
    Posts:9416


    Comment Arrow

    Publicado em: 25/12/2011 20:36:40

    Yoshimitsu
    Perfeito simu!
    Agora tá funcionando como eu queria valeu mesmo.
    Hoje você me ensinou três coisas novas !!!!



    quarta?!

    temos uma área específica para "Discussão sobre interfaces gráficas [...]": GUI">http://javafree.uol.com.br/f-8-GUI-Applets-Swing-SWT-etc.html"">GUI - (Applets, Swing, SWT, etc)
    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.




  1. RogerCF
    Posts:305


    Comment Arrow

    Publicado em: 25/12/2011 00:34:51

    Yoshimitsu
    Na primeira linha ele funciona direito, mas a partir da segunda ele seleciona a partir da segunda letra e na terceira linha a partir da terceira letra e assim por diante.
    Como posso resolver isso?


    Seria mais facil ter dito isso desde o inicio

    simu
    Resumo: internamente é usado "\n" (1 caracter) para marcar a mudança de linha, mas, no texto obtido pelo getText(), é usado a seqüência do sistema operacional, "\r\n" (2 caracteres) para Windows.


    Putz!
    O pessoal sempre pega o texto direto pelo getText() do componente grafico. Se fosse eu teria testado aqui (Linux) e depois nunca ia saber por q não funciona direito num Windows. Nunca imaginei que um getText() seria dependente de plataforma Ou o problema é o select() que não se baseia no texto retornado pelo getText() Ja q o select() é um metodo do componente grafico, ele deveria se basear no texto retornado pelo mesmo




  1. sekkuar
    Posts:5998


    Comment Arrow

    Publicado em: 25/12/2011 16:27:58

    RogerCF
    Yoshimitsu
    Na primeira linha ele funciona direito, mas a partir da segunda ele seleciona a partir da segunda letra e na terceira linha a partir da terceira letra e assim por diante.
    Como posso resolver isso?


    Seria mais facil ter dito isso desde o inicio

    simu
    Resumo: internamente é usado "\n" (1 caracter) para marcar a mudança de linha, mas, no texto obtido pelo getText(), é usado a seqüência do sistema operacional, "\r\n" (2 caracteres) para Windows.


    Putz!
    O pessoal sempre pega o texto direto pelo getText() do componente grafico. Se fosse eu teria testado aqui (Linux) e depois nunca ia saber por q não funciona direito num Windows. Nunca imaginei que um getText() seria dependente de plataforma Ou o problema é o select() que não se baseia no texto retornado pelo getText() Ja q o select() é um metodo do componente grafico, ele deveria se basear no texto retornado pelo mesmo



    Culpa do Bill Gates.

    (qualquer dia ele vai me processar por ficar falando isso! D: )
    _________________
    Sekkuar ~ Ex-Catador Executivo do Javafree - (Não mais) Catando os tópico tudo.
    "The mod javafree deserves, but not the one it needs right now."


    Stack Traces existem pra ajudar e não para trazer uma mensagem de satã dizendo que seu computador será destruído.


    Peça seu Código Pronto para o seu Dever de Casa aqui
    You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.




  1. simu
    Posts:9416


    Comment Arrow

    Publicado em: 25/12/2011 20:36:40

    RogerCF

    [...]
    Putz!
    O pessoal sempre pega o texto direto pelo getText() do componente grafico. Se fosse eu teria testado aqui (Linux) e depois nunca ia saber por q não funciona direito num Windows. Nunca imaginei que um getText() seria dependente de plataforma Ou o problema é o select() que não se baseia no texto retornado pelo getText() Ja q o select() é um metodo do componente grafico, ele deveria se basear no texto retornado pelo mesmo



    A diferença entre o formato interno e externo é um grande problema, e a solução adotada pelo Java/SUN é péssima!
    IMHO deveria ter outro método para obter o texto no formato específico da plataforma, ou no mínimo, como você escreveu, o select() ser baseado no texto do getText(). Mas do jeito atual é para enganar o programador mesmo (apesar de documentado (indiretamente)).

    [[]]
    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.




  1. Yoshimitsu
    Posts:20


    Comment Arrow

    Publicado em: 24/12/2011 20:02:00

    Só mais uma coisa, tem mais algum ContentType que eu possa usar alem de text/plain e text/html?




  1. sekkuar
    Posts:5998


    Comment Arrow

    Publicado em: 25/12/2011 16:27:58



    text/plain
    Plain text, which is the default the type given isn't recognized. The kit used in this case is an extension of DefaultEditorKit that produces a wrapped plain text view.

    text/html
    HTML text. The kit used in this case is the class javax.swing.text.html.HTMLEditorKit which provides HTML 3.2 support.

    text/rtf
    RTF text. The kit used in this case is the class javax.swing.text.rtf.RTFEditorKit which provides a limited support of the Rich Text Format.


    _________________
    Sekkuar ~ Ex-Catador Executivo do Javafree - (Não mais) Catando os tópico tudo.
    "The mod javafree deserves, but not the one it needs right now."


    Stack Traces existem pra ajudar e não para trazer uma mensagem de satã dizendo que seu computador será destruído.


    Peça seu Código Pronto para o seu Dever de Casa aqui
    You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility.




  1. Yoshimitsu
    Posts:20


    Comment Arrow

    Publicado em: 24/12/2011 20:02:00

    Obrigado sekkuar.




  1. simu
    Posts:9416


    Comment Arrow

    Publicado em: 25/12/2011 20:36:40

    além desses tipos padrão é possível criar e adicionar uma implementação própria do EditorKit (e de Document) para tratar de outros tipos.

    [[]]
    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.




  1. Relacionados





Novo tópico   Responder tópico     Índice do forum -> GUI - (Applets, Swing, SWT, etc)