Edytor Tekstu nie kasuje

0

Witam!

Utworzyłem prosty notatnik w javie ale po pierwszych testach pojawił się znaczący problem. Z poziomu programu gdy usuwam wpisany tekst wszystko działa lecz gdy zapiszę plik a następnie próbuję go wczytać pojawia się tak jak w załączniku. Napisałem Ala ma koga po czym skasowałem 2 ostatnie litery i poprawiam na Ala ma kota Proszę o pomoc

Pozdrawiam

0

Masz błąd w linijce 666 - paragraf szósty kodeksu karnego.

0

Bez kodu raczej nikt ci nie napisze co jest źle, bo i skąd mamy to wiedzieć? ;) Można podejrzewać, że to problem z kodowaniem znaków.

0

Te znaczki to właśnie backspace. Jeśli użyjesz delete, strzałek itp to pewnie zestaw dziwnych znaków znacznie się rozbuduje.
@Wizzie - problemem jest nie kodowanie znaków, a IMHO zapisywanie śmieci - całej historii wciśniętych przycisków.

0

Wybaczcie, nie dodałem linku, źródlo jest tutaj : http://www.speedyshare.com/VfyxW/EdytorGUI.java

0

O co chodzi z tablicą tablic stringów (page)?
Wewnątrz saveFile masz bardzo dziwny zapis danych wiążący się z tą równie dziwną strukturą zmiennej page.
Zewnętrzna pętla jest po bóg wie czym, wewnętrzna jest po linijkach, Ty w komentarzu twierdzisz, że to zewnętrzna pętla jest po linijkach, a to nie jest prawdą. Zresztą z tego co dokumentacja (https://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html) twierdzi, to BufferedWriter.write() nie ma wersji zapisującej string, która za argument przyjmowałaby tylko string.

Dla osób, którym nie chce się ściągać pliku: https://ideone.com/n7noK8

0

A sam błąd jest tutaj:

        line.add(String.valueOf(evt.getKeyChar())); //dodanie pojedynczego znaku do listy, rzutowanie na String
        if(evt.getKeyChar()=='\n'){ //jesli znak nowej linii
            page.add(new ArrayList(line));

Dopisujesz w tym miejscu wszystkie znaki specjalne. Naucz się debugować swoje programy, to takie problemy będziesz rozwiązywać samodzielnie.

Przemyśl poważnie listę list stringów.

0

Niestety lista list stringów być musi. To wymóg odgórny-mają być listy. Dziękuje za pomoc,ale chyba nadal nie wiem jak to naprawić :)

0

To zrób listę list znaków, a nie stringów, będących samych w sobie takimi listami znaków, przez co masz strukturę 3D znaków, a potrzebujesz 2D albo wręcz 1D. Zresztą skoro masz wymaganie, że ma być lista, to zrób listę stringów, a nie listę list oO

Co do znaków - napisałem, że łapiesz i dopisujesz do listy wszystkie znaki, w tym delete, backspace, insert, pewnie też shifty itp. Musisz je obsługiwać w inny sposób - nie zapisywać wciśnięcia backspace (#8 albo #9, już nie pamiętam, bodajże '\b'), tylko efekt jego działania - usunięcie poprzedniego znaku. Ponadto musisz zastanowić się nad tym, jak obsłużyć kliknięcie w dowolnym miejscu tekstu lub przesunięcie się tam kursorami i usunięcie/dopisane/wklejenie tekstu oraz zaznaczenie tekstu klawiaturą/myszką i usunięcie/nadpisanie/wklejenie.

Podsumowując: wymyślasz koło na nowo. Pokaż treść polecenia od nauczyciela/ćwiczeniowca.

0

Zdaję sobie sprawę z wymyślania koła na nowo. Poleceniem jest edytor który opiera się na listach,ale kazdy znak elementem listy, linijka listą, a strona listą list..

0

Jesteś pewien, że masz (możesz) użyć JTextArea? Wymagania dotyczące list są wtedy absurdalne. Te wymagania są zrozumiałe dla edytora z interfejsem tekstowym (konsola).

0

Grupie,która miała tylko konsole polecił zrobić tryb graficzny.. Nie zapisuje mi backspace, ale nadal nie usuwa słów.

1

Nie usuwa słów, bo nie dość, że nie rozumiesz tego, co napisałem, a co wyjaśnia zachowanie Twojego kodu, to nawet nie rozumiesz swojego kodu.
Nie wiem, jak to prościej napisać...

  • naciskasz backspace;
  • edytor (tj. JTextArea) obsługuje to prawidłowo, więc wydaje Ci się, że jest ok, ale nie jest. Zapomnij o edytorze, skup się na swoim kodzie, albo jeszcze lepiej, zrób tak, żeby co naciśnięcie klawisza edytor wyświetlał zawartość tej Twojej tablicy 3D, wtedy będziesz widział jak bardzo źle Twój kod działa;
  • więc naciskasz backspace -> naiwnie dorzucałeś do swojej tablicy 3D znaczek 8; edytor prawidłowo usuwał, Ty przyjąłeś, że każdy znaczek to tekst; teraz pewnie ignorujesz backspace, co jest równie kiepskim rozwiązaniem; a co z delete, strzałkami, klawiszami funkcyjnymi - czy je wszystkie też traktujesz jako tekst?
  • powinieneś obsłużyć w swoim kodzie wciśnięcie tego backspace, czyli naciśnięcie go będzie wymagało usunięcia znaku przed kursorem z Twojej magicznej tablicy;
  • czyli wciskasz backspace i myślisz, że usunięcie ostatniego znaku będzie ok, tymczasem to nieprawda, przecież mogłeś się przesunąć w lewo lub górę kursorem klawiaturą albo myszką; kursorem mogłeś zrobić to na wiele sposobów - strzałki, home, end, page up/down oraz ctrl + wszystkie wymienione;
  • więc wciskasz backspace, pobierasz z JTextArea położenie kursora tekstowego, na jego podstawie znasz położenie znaku (tfu, stringa z jednym znakiem - co za marnotrawstwo pamięci) w Twojej tablicy, usuwasz znak przed kursorem, z uwzględnieniem pustej linijki (backspace ją skasuje), pustego tekstu, kursora na początku tekstu;
  • to samo dla delete oraz wklejania ze schowka (Ctrl+V ORAZ obsługa wklejania myszką!!!);
  • musisz też obsłużyć zaznaczony tekst! Zaznaczony tekst można usunąć wciskając cokolwiek, można go też zastąpić wklejając coś ze schowka lub naciskając jakąś literę. Tekst można zaznaczyć myszką i klawiaturą, można też dotykowo, ale to ostatnie chyba możesz olać. Tekst można odznaczyć. Musisz to obsługiwać! Być może będziesz mógł skorzystać z metod udostępnianych przez JTextArea, ale wtedy dopiero pokazuje się bezsens tego zadania - częściowo będziesz duplikować funkcjonalności tej klasy, a częściowo będziesz z nich korzystać.

To zadanie jest tak bez sensu (jest bardzo pracochłonne i jednocześnie duplikuje działanie klasy, z której i tak korzystasz), że mam wrażenie, że źle je zrozumiałeś. Wklej treść zadania.

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