Seja bem vindo ao Fórum do JavaFree.org
Aqui você irá encontrar respostas para TUDO o que você precisa sobre java.
Deseja participar? Crie sua conta ou efetue seu login
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.
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
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.
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)
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?
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.
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.
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."
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:
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:
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!
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!
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!
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
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
[...]
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!
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.
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!
YoshimitsuPosts:20
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.
RogerCFPosts:305
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
sekkuarPosts:5998
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."