Mudar a cor de uma string num texto .txt

Srs, boa tarde, como sempre dizem, no meu caso é verdade, sou novo no Java, tenho somente 1 mês que venho estudando , pesquisando e dando murro em ponta de faca no Java. Estou fazendo um programa em java para me ajudar a aprender teclado musical. o que faz até agora o meu programa;

1 - A parte que estou no momento e onde tenho duvida para terminar é a seguinte.

Tenho em um diretório, uma pasta com arquivo .txt que corresponde a músicas com as cifras acima das letras, conforme mostrarei abaixo e uma outra pasta contendo arquivos JPG que corresponde as imagens das posições das cifras no teclado musical.

Arquivo .txt Arquivo
C G/B Am7 Am7/G
Ao único que é digno de receber
F C/E
A honra e a glória …

Arquivo .jpg
Imagem do teclado com a cifra(nota musical)

Bem, o programa joga este arquivo .txt numa JTextPane (um amigo deste grupo, pediu para eu trabalhar com o JTextPane) e depois faz a leitura de linha a linha deste .txt, lendo somente as linhas onde estão as cifras, a letra da musica não me interessa e o programa não as ler.

Por exemplo, o programa leu a cifra “G/B”, além dele colocar esta cifra em uma caixa de texto (txtposicao), ele mostra a imagem da cifra (nota musical), numa label (lblnota), vai mostrando uma a uma e eu programei um tempo que escolho num JtextField da musica e assim posso ver por uns 2,3,4 seg a imagem da posição da cifra.

Hoje o programa esta fazendo isso sem erro e ao contento. Agora vamos ao meu GRANDE problema, que já duram 2 semanas e mesmo pesquisando, meu pouco conhecimento da linguagem, não me deixa prosseguir com o código, talvez tenha encontrado a solução , mas não sei onde encaixar e qual a linha chamar o método visto.

Gostaria que o programa, ao ler cada cifras, que é colocada numa variável chamada de “NOVA” fosse mudando a cor da cifra lida ou colocando em evidencia a cifra lida com uma cor de fundo azul, por exemplo no JTextPane, sei que é possível, ví vários modos de fazer isso, testei vários deles , mas não sei como colocar estes métodos vistos dentro do meu programa, nem em que linha devo fazer a chamada para ele fazer o que quero.

Primeiro, será que fui claro ??? se fui, vcs podem me ajudar ??? Abaixo mando um pedaço do método que usei para isso, somente a parte onde faço a leitura das cifras.

Código :
private void btniniciarActionPerformed(java.awt.event.ActionEvent evt) {
// Cliquei no botão iniciar

new Thread() {
private Object evento;
@Override
public void run() {

File arquivo = new File(“C:\MUSIC PLAY\Musicas\”+txtpmusica.getText()+".txt"); //Abro o arquivo .txt
(minha musica cifrada)
try{
BufferedReader ler = new BufferedReader(new FileReader(arquivo));
String lin = ler.readLine(); //Leio a primeira linha
while (lin !=null) {
String[ ] notas = lin.split("\s"); //Retiro da linha as cifras e não somente um caractere.
for (String nota : notas) {
if (!nota.equals("")) { // se lendo a linha, eu tenho espaço, pulo e só pego as cifras
long l = Long.parseLong(txttempo.getText() + “000”); // coloco num JTextField (txttempo) o tempo
de espera ou o compasso da musica.
try {
Thread.sleep(l); //Paro o programa por 2,3,4,6 seg, dependo do compasso da musica.
} catch (InterruptedException ex) {
Logger.getLogger(FrmMusicaPlay.class.getName()).log(Level.SEVERE, null, ex);
}
String nova = nota.replace("/", ""); //quando uma cifra tem “/” exemplo : C/F eu troco para (),
pois estas cifras são gravadas no Windows com (_), o
windos não aceita gravar por exemplo Cm/G, somente
Cm_G.
nota=nova;

CREIO QUE AQUI SERIA O LUGAR PARA FAZER A CHAMADA PARA MUDAR DE COR A CIFRA, POIS JÁ A TENHO NA VARIÁVEL NOVA, A CIFRA LIDA.

txtposicao.setText (nova); //Coloco a cifra lida neste JTextField (txtposicao)
ImageIcon imageIcon = new ImageIcon(new ImageIcon(“c:/MUSIC PLAY/Notas/”+txtposicao.getText()+
“.jpg”).getImage().getScaledInstance(599,243,Image.SCALE_DEFAULT));
lblnota.setIcon(imageIcon); //Aqui coloco a imagem da cifra em um Label (lblnota)
} // Fim do if
} //Fim do for
lin = ler.readLine();
lin= ler.readLine(); // Aqui pulo uma linha que é a linha da letra da musica que não
me interessa e vou para linha onde estão as próximas cifras.
} //Fim do while
}catch (IOException ex){

}

OBS :
Minha maior dúvida é onde devo colocar no meu programa o método que coloca a cor na cifra e onde chama-lo, pelo meu pouco conhecimento de programação em Java, consegui fazer este programa, pesquisando na internet, nosso pai nosso de todos os dias. Amém !

Srs, espero resolver este problema, porque só falta este método para eu terminar o programa, meu muito obrigado.

Armando

Estudar as bases da linguagem, sintaxe e detalhes, não?

Sim, enquanto decidir por pular etapas, continuará.

Está fazendo isso como?

Amigo, fiz meu programa 98% pesquisando na internet, só falta 2% para meu programa ficar pronto, já estou estudando Java, mas não encontro este tipo de dúvida nos livros, isso eu aposto contigo, venho aqui pedir uma ajuda, se vc puder me ajudar, agradeço muito, caso não possa ou não saiba, deixe para outra pessoa, muito obrigado e fique com Deus.

Obs : Amigo, tenho 65 anos de idade, acho que estou meio grandinho para ficar recebendo perguntas como a sua, vc não acha ??? desculpa e obrigado.

Boa noite Filosi, achei algo similar, e creio que pode ajudar. Ao invés de alterar a cor, ele coloca um highlight no texto, como se fosse um marca texto, entende?

Primeiro testa essa classe avulsa, depois você vai adaptando pra sua necessidade, link:

http://www.java2s.com/Tutorials/Java/Swing_How_to/JEditorPane/Highlight_few_of_the_words_of_a_text_file_in_JEditorPane.htm

No dele, ele coloca o highlight em uma palavra específica, vc pode colocar direto sua String nova

Cara, ví sua resposta agora, amanhã cedinho vou testar, só falta este detalhe para eu terminar meu programa que faz várias coisas para quem quer aprender a tocar teclado musical, mais uma vez, muito obrigado pela ajuda, se este programa esta terminando, tem muito haver com a sua ajuda. Muito obrigado e fique com Deus, quando eu terminar aviso., vlw , Armando.

Amigo, bom dia, já criei a classe conforme arquivo visto, já fiz um “import Classes cifra” para importar a classe criada, troquei na classe, tudo que se referia a JEditionPane por JtextPane, por ser a caixa onde mostro o meu texto, um JTextPane, agora , só não sei fazer a chamada dentro do meu método, que mostra as cifras (notas) lidas, para colocar o Highlight na minha string nova ? Vc pode me ajudar ? Muito obrigado. Armando

Segue a parte do método onde leio as cfras e as coloco na variável nova;

try{
BufferedReader ler = new BufferedReader(new InputStreamReader(
new FileInputStream(“C:\MUSIC PLAY\Musicas\”+txtpmusica.getText()+".txt"), “UTF-8”));
String lin = ler.readLine();
while (lin !=null) {
String[ ] notas = lin.split("\s");
for (String nota : notas) {
if (!nota.equals("")) {
long l = Long.parseLong(txttempo.getText() + “000”);
try {
Thread.sleep(l);
} catch (InterruptedException ex) {
Logger.getLogger(FrmMusicaPlay.class.getName()).log(Level.SEVERE, null, ex);
}
String nova = nota.replace("/", “_”);
nota=nova;

              OBS : A CHAMADA SERIA AQUI ??? COMO FAZER ???
                          
            txtposicao.setText (nova);
            ImageIcon imageIcon = new ImageIcon(new ImageIcon("c:/MUSIC 
             PLAY/Notas/"+txtposicao.getText()+ 
             ".jpg").getImage().getScaledInstance(599,243,Image.SCALE_DEFAULT)); 
             lblnota.setIcon(imageIcon);

Estou sem computador no momento, você testou o código? Tentou rodar ele? (O código do link)

Amigo, quando alguém não tem o conhecimento de uma linguagem ou de algo na vida, fica difícil fazermos certas coisas, eu prometo estudar mais o java e parar de fazer certas perguntas simples como a que vou te fazer, espero ser a última.Fiz o seguinte; copiei aquela Classe que vc me enviou, só troquei o JEditorPane por JTextPane, conforme já havia dito, agora vai a pergunta simples, como eu posso testar o código, como rodar esta classe, onde chamo esta classe no meu programa ??? Sei que tenho que importar a classe com o comando “Import Classe nome da classe” certo ? e depois o que fazer ?? Sinto dizer que não sei e fico até sem jeito de perguntar, melhor eu estudar java. Muito obrigado por tudo, só tenho a te agradecer, fique com Deus. Armando

É normal haver dúvidas no começo, não precisa ter vergonha de perguntar, é bastante comum.

Mas é nesse caminho mesmo:

  1. Cria uma classe Java

  2. Copia o código do link e cola na sua classe

  3. Muda o nome da sua classe pra o nome da Classe do link (Main)
    3.1 é provável que surja erros, como os de importação, nome de classe incorretos e etc.

  4. Rode a classe
    4.1 observe o código e veja que tem

    public static void main(…){
    //Métodos que serão iniciados com a classe
    }

Esse método acima inicia sua classe, como se fosse um programa, em alguns casos só vai aparecer no Output de sua IDE, noutros, pode abrir um frame, depende do que você fizer.

Vc esta usando alguma ide? Se sim? Qual?

Sim, eu uso o NetBeans 8.0.2. A classe que copiei, esta sem erros, coloquei com o nome Main, já fiz as importações, só faltou dizer onde eu chamo esta classe no meu programa e como. Muito obrigado pela força, no inicio realmente é dificil, mas quando vc aprende é algo maravilhoso. Obrigado.

Agora é só apertar SHIFT+F6 dentro da classe

Ok, a classe rodou e funcionou, na frase “Hello to the public” foi colocada a palavra “public” com highlight na cor vermelha, é isso que eu quero fazer no meu método, só não sei ainda como faze-lo.
Obrigado.

Agora é só questão de analizar o código e tentar ver o que cada coisa faz. Exemplo, tem uma parte do código que só está escrito “public”, ela está sozinha? Nao!! Tem algo com ela.

E o que é? É um método, presume-se, pelo o que você mesmo comentou, que apenas a palavra “public” foi pintada.

Então se só está escrito public, e só tem um método nela, BINGO, esse é o método que pinta seu texto.

Copia e cola esse código abaixo no seu projeto e faz a adaptação.

Obs, nesse mesmo código, você vai ver que tem o método pra remover o highlight, você pode usá-lo pra remover o highlight antigo e depois usar o método highlight pra colocar na String nova.

Pra usar o método de adicionar é só chamar:

highlight(jep, "public");
public static void highlight(JTextComponent textComp, String pattern)
      throws Exception {
    removeHighlights(textComp);

    Highlighter hilite = textComp.getHighlighter();
    Document doc = textComp.getDocument();
    String text = doc.getText(0, doc.getLength());
    int pos = 0;

    while ((pos = text.indexOf(pattern, pos)) >= 0) {
      hilite.addHighlight(pos, pos + pattern.length(), myHighlightPainter);
      pos += pattern.length();
    }

  }

  public static void removeHighlights(JTextComponent textComp) {
    Highlighter hilite = textComp.getHighlighter();
    Highlighter.Highlight[] hilites = hilite.getHighlights();

    for (int i = 0; i < hilites.length; i++) {
      if (hilites[i].getPainter() instanceof MyHighlightPainter) {
        hilite.removeHighlight(hilites[i]);
      }
    }
  }
}

class MyHighlightPainter extends DefaultHighlighter.DefaultHighlightPainter {

  public MyHighlightPainter(Color color) {
    super(color);
  }

Obs, sua idade não interfere no seu aprendizado, muito menos em receber perguntas que o @darlan_machado disse.

Você pulou etapas e isso vai dificultar o seu aprendizado, se você tivesse estudo um pouco, bem básico mesmo, sobre o que ele falou, saberia que é método e não função. O que um método faz, o que um construtor faz, como executar uma classe…

Enfim, você pulou todo o conceito pra ir direto pra criação de software, o que torna tudo mais complicado.

Entendo que fez bastante coisa pesquisando, o que é muito bom, mas o que não pode acontecer é ser tudo a base de Ctrl C e V.

Se eu te perguntar agora se você sabe me explicar o seu código, e o que cada método faz, vc saberia dizer? Ou saberia dizer o que é um ArrayList? Uma Thread? Um implement? As perguntas dele foram apenas para te alertar sobre o básico de Java

Sei que vc esta certo, concordo com vc, só achei o Darian Machado poderia ter falado de outra maneira, quanto a sua pergunta, sim, sei te explicar o que cada comando que os meus métodos fazem, até agora, porque além de copiar e colar, eu vou procurar saber o que faz cada comando dentro dos meus métodos, pesquisando na internet, lendo dois livros que comprei e aprendendo com vcs.

Vejam o meu problema, já importei a classe, import Classes.Main; import static Classes.Main.highlight; já instanciei a classe, Main cor = new Main(); coloquei o comando JTextPane jep = new JTextPane(); já fiz o comando cor.highlight(jep,nova); mas não esta funcionando, estou fazendo algo de errado.

Tudo bem, concordo , deixo um abç para o Dariam Machado, vcs são 10 !. Figuem com Deus.

Armando

Não era necessário importar a classe Main. Faz o seguinte:

Pega os códigos que eu te passei e cópia pra o seu JFrame. E exclui a classe Main.

Tira o static dos dois métodos, não é necessário:

public static void highlight
public static void removeHighlights

Ao invés de chamar isso

JTextPane jep = new JTextPane();

Você vai chamar assim

 highlight(nome_do_seu_textpane, nova);

Amigo, sinto dizer , mas não funcionou, fiz exatamente como vc mandou, não esta acusando nenhum erro, até o ponto onde insiro a linha highlight(txtareamus, nova); o programa ao ler esta linha, não lê as cifras, quando coloco um comentário nesta linha, volta ao normal, o problema creio estar nesta linha.

Deve ser pq não tem texto, tenta escrever algo so pra teste msmo

Caro amigo, fiz o teste aqui, escrevendo um texto e mandei mandei o mesmo comando, o programa para de rodar, dando erro nesta linha de chamada highlight(nome_do_meu_textpane, nova); não sei ainda o motivo, mas esta chamada não esta dando certo, ai eu te pergunto ??? Será que eu encontro a resposta de um livro ??? Te asseguro que não, na internet, talvez , com outro método e chamada. Fico chateado porque só falta isso para eu terminar o programa e não quero desistir. Mesmo não conseguindo , obrigado.