Zaznaczanie w tekście podanej frazy - błędne wyszukiwanie

0

Witam serdecznie! Jestem tu nowy i ogólnie Javy uczę się od dwóch tygodni. Postanowiłem założyć tutaj konto, ponieważ od wczoraj myślę jak rozwiązać problem z moim programem i chyba będę musiał poprosić o pomoc osoby, które mają już pewne doświadczenie.

A mianowicie... Chciałbym dodać do aplikacji notatnika funkcję wyszukiwania danej frazy. Po części mi się to udało, ponieważ wyszukiwana jest i zakreślana dana fraza, ale tylko, jeśli zapisana ona jest w jednej linijce. W załączniku nr.1 pokazane jest co mam na myśli.
notatnik1.png
Problem zaczyna się, gdy mam tekst z enterami(nowymi linijkami). Nagle nie wiedzieć czemu program źle wyszukuje - a raczej zaczyna przesuwać sobie w prawo zakreślenie.
notatnik2.png

W czym jest tutaj błąd? Bardzo proszę o pomoc w rozwiązaniu problemu :).

 String fraza = tfFraza.getText(); //to wyszukujemy i pobieramy z JTextField tfFraza
			fraza.toLowerCase();
			String tekst = notatnik.getText(); //to jest nasz tekst pobrany z JTextPane, tego głównego
			tekst.toLowerCase();

			try
			{
				Highlighter podswietl = notatnik.getHighlighter();
				StyledDocument doc = (StyledDocument) notatnik.getDocument();
				DefaultHighlighter.DefaultHighlightPainter hp = new DefaultHighlighter.DefaultHighlightPainter(Color.RED);
				int index = tekst.indexOf(fraza);
				
				while(index >= 0)
				{
					lista.add(index);
					podswietl.addHighlight(index, index+fraza.length(), hp);
					index = tekst.indexOf(fraza,index+1);
				}	
			}
			catch(Exception e1)
			{
				e1.printStackTrace();
			}
			
	
1

Takie objawy mogą wynikać z faktu, że w pliku są dwuznakowe (windowsowe) symbole końca wiersza "\r\n", a metoda getText zwraca tekst z jednoznakowymi symbolami końca wiersza "\n". Wypróbuj działanie swojego programu na plikach z jednoznakowymi symbolami końca wiersza. Windowsowym notatnikiem takiego pliku nie utworzysz, napisz programik w Javie do tworzenia takich plików lub użyj Notepad++.

0

Plik .txt utworzony zarówno w Notepad++, jak i w tym notatniku Javowym daje taki sam efekt co w systemowym notatniku :(.

0

Jak masz ustawione preferencje w Notepad++?
pref.png
Jak zapisujesz do pliku w tym programie Javy?

...writeLine("baobab"+???);
0

W Notepadzie mam ustawione dokładnie tak jak na załączonym obrazku. W tym programie zapisuję przez metodę PrintWriter'a .println().

JFileChooser fc = new JFileChooser();
			fc.setCurrentDirectory(new File("C:\\Users\\Do pracy\\Desktop"));
			fc.setSelectedFile(new File(".txt"));
			if(fc.showSaveDialog(null)==JFileChooser.APPROVE_OPTION)
			{
				try
				{
					PrintWriter pw = new PrintWriter(fc.getSelectedFile());
					Scanner input = new Scanner(notatnik.getText());
					while(input.hasNextLine())
					{
						pw.println(input.nextLine());
					}

					pw.close();
				}
				catch(Exception b)
				{
					System.out.println("Plik o tej nazwie już istnieje!");
				}
			} 
1

Czy przy tych ustawieniach Notepad++ stworzyłeś nowy plik i go zbadałeś w swoim programie?

Kod jest nieprzydatny, pod windowsem metoda println wstawia windowsowy (dwuznakowy) symbol końca wiersza.

0

Dziękuję za bardzo cenną wskazówkę. Wcześniej nie zdawałem sobie sprawy z istnienia tego Carriage Return (\r). Udało mi się rozwiązać ten problem poprzez dodanie w funkcji, która ma podkreślać:
notatnik.setText(notatnik.getText().replaceAll("\r\n", "\n"));
Zdaję sobie sprawę, że zapewne nie jest to najskuteczniejsza metoda. Dlatego też, jeśli mógłbyś to napisz jakie może być inne, skuteczniejsze obejście tego problemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1