Twitter: @grzegg
Kategoria: java, Tagi: - - - .

Java, Swing – textArea i manipulacje na tekście.

Wiemy już jak stworzyć prosty program w Swingu, który umożliwia otwarcie pliku tekstowego, edytowanie go, a następnie zapisanie. Czasem jednak, potrzebujemy dokonać dodatkowych manipulacji z tekstem, na przykład zmienić automatycznie wielkość liter, czy zmienić ciąg znaków. Rozbudujmy więc nieco naszą aplikację.

Spójrzmy teraz do fragmentu  poprzednio utworzonego programu, który wykonuje się gdy klikniemy przycisk „Otwórz„.  Teraz wygląda on tak:

 
	textArea.read( new FileReader( file.getAbsolutePath() ), null ); 
	

Nie wchodząc w szczegóły, tworzymy tu obiekt klasy FileReader, który odczytuje plik i od razu przekazuje go do komponentu textArea (klasy JTextArea) w którym tekst jest wyświetlany i może być edytowany.

Co jednak, jeśli przed przekazaniem tekstu do kontrolki, chcemy go poddać jakiejś wstępnej obróbce? Jedną z możliwości, jest przekazanie wczytanego tekstu do zmiennej typu  String. Jak to zrobić? Można na przykład tak…

Usuńmy powyższy kod, a zamiast niego wstawmy taki:

 
	BufferedReader br = new BufferedReader(new FileReader( file.getAbsolutePath() )); 
	String linia; 
	String tekst = ""; 
	while ((linia = br.readLine()) != null) { 
		tekst = tekst+linia+\n; 
	} 
	br.close(); 
	tekst = tekst.toUpperCase(); 
	textArea.setText(tekst); 
	

Teraz, gdy wczytamy plik, otrzymamy taki obraz:

Voila Capture55

Jak widać, wszystkie litery w tekście, zostały zmienione na wielkie. Przyjrzyjmy się teraz powyższemu kodowi:

W pierwszej linijce tworzymy obiekt br klasy BufferedReader, któremu przekazujemy, jako argument FileReader ze ścieżką do pliku jako argumentem.
Pętla while, która rozpoczyna się w linii nr 4, pobiera z br po kolei linie tekstu z pliku, które sukcesywnie przyłączamy do zmiennej string. Jeśli nie chcemy, żeby cały tekst złączył się w jedną linię, należy pamiętać, żeby po dołączeniu linii do zmiennej, dodać też znak końca linii ("\n").
Następnie znajduje się komenda br.close(), którą należy wykonać po odczytaniu pliku.
Ponieważ w zmiennej tekst znajduje się cały tekst, który został odczytany z pliku, możemy dokonywać na nim wszelkich manipulacji dostępnych na łańcuchach znaków. Sporo przykładów można znaleźć tutaj. W powyższym przykładzie dokonujemy zmiany wszystkich liter na wielkie, za co odpowiedzialny jest kod w linii numer 8.
Teraz, można przekazać zmieniony tekst do kontrolki textArea, wywołujemy więc na niej metodę setText() podając jako argument nasz tekst (linia 9).

Tekst możemy powtórnie pobrać, modyfikować, po czym znów go aktualizować w oknie edycji. Dla przykładu dołóżmy do naszej aplikacji kolejny przycisk, który będzie na zmianę, po każdym naciśnięciu zmieniał wielkość liter. Zacznijmy od utworzenia zmiennej typu boolean, która będzie przechowywała informację o wielkości liter. Znajdź w kodzie źródłowym początek klasy i dopisz linijkę nr. 2


	public class OknoGlowne extends javax.swing.JFrame {
	    boolean wielkie = true;
	...
	

Ponieważ w naszym programie litery w tekście są od razu zmieniane na wielkie, domyślnie zmienna ma wartość true.

Teraz dodajemy do aplikacji przycisk „Zmień” (nazwijmy go buttonZmien) który po naciśnięciu powinien wykonywać taki kod:


private void buttonZmienActionPerformed(java.awt.event.ActionEvent evt) {
    String tekst = textArea.getText();
    if(wielkie) {
        tekst = tekst.toLowerCase();
        wielkie = false;
    }
    else {
        tekst = tekst.toUpperCase();
        wielkie = true;
    }
    textArea.setText(tekst);
}

Po wczytaniu pliku i przyciśnięciu przycisku „Zmień„, wielkość liter w oknie zmienia się.

Aplikacja ze zmniejszonym tekstem

Powyższy kod jest raczej oczywisty, może warto jednak zwrócić uwagę na rolę zmiennej wielkie. Sygnalizuje ona stan wielkości liter w tekście. Jeśli jej wartość wynosi true, oznacza to, że litery są wielkie. W takim przypadku po wciśnięcia klawisza „Zmień” uruchamiany jest kod tekst = tekst.toLowerCase(), litery są zmieniane na małe, a wartość zmiennej wielkie ustawiona jest na false. Dlatego przy kolejnym naciśnięciu klawisza uruchamia się kod tekst = tekst.toUpperCase(); a zmienna przybiera ponownie wartość false.

Leave a Reply