Co robię źle przy przekazywaniu wartości zmiennej do JTextArea?

0

Siema, mam problem z tym kodem (działający bez żadnych modyfikacji) :P

public class TProstaInstrukcja {

    String nazwaZmiennej;
    TWyrazenie wyrazenie = null;
    ListaZmiennych listaZmiennych = null;

    public TProstaInstrukcja(String nazwaZmiennej, TWyrazenie wyrazenie,
            ListaZmiennych listaZmiennych) {
        //System.out.println("Wstawiam ASSIGN:");
        this.nazwaZmiennej = nazwaZmiennej;
        this.wyrazenie = wyrazenie;
        this.listaZmiennych = listaZmiennych;
    }

    public TProstaInstrukcja(TWyrazenie wyrazenie) {
        //System.out.println("Wstawiam PISZ:");
        this.wyrazenie = wyrazenie;
    }

    public void wykonaj() {

        if (nazwaZmiennej != null) {

            int wartosc = wyrazenie.wykonaj();

            Zmienna zmienna = listaZmiennych.pobierzWedlugNazwy(nazwaZmiennej);

            if (zmienna != null) {
                zmienna.zmienWartosc(wartosc);

                //System.out.println("Przypisanie wartosci "+wartosc+" dla zmiennej "+zmienna.pobierzNazwa());
            } else {
                listaZmiennych.piszZmienne();
                throw new Error("Nie moge znalezc zmiennej o nazwie: " + nazwaZmiennej);

            }

        } else if (wyrazenie != null) {
            int wartosc = wyrazenie.wykonaj();
            System.out.println("PRINT: " + wartosc);
        }
    }
}

Problem pojawia się gdy próbuję wyświetlić tekst w polu tekstowym jTextArea w sposób identyczny jak w tym temacie: http://4programmers.net/Forum/Newbie/246434-jtextarea_-_dostep_z_poziomu_innej_klasy

To powinienem dostać na wyjściu po odpaleniu programu:

PRINT: 1
PRINT: 3
PRINT: 5
PRINT: 7
PRINT: 9
PRINT: 25

A jak w tym miejscu...:

 else if (wyrazenie != null) {
            int wartosc = wyrazenie.wykonaj();
            System.out.println("PRINT: " + wartosc);
         
            a.tekst.setText("PRINT: " + wartosc);
            
        }

... próbuję przekazać cokolwiek do pola tekstowego to na wyjściu (za System.out.println()) dostaję tylko:

PRINT: 1

A w polu tekstowym nic się nie wyświetla, nawet z innych "miejsc".

Co mogę robić źle? Proszę o jakieś wskazówki... Sposób wykonania jest nieistotny byle tylko działało.

Link do całego projektu w NetBeans w załączniku.

Ogólnie chodzi o to by zrobic do tego GUI (gui mam już częściowo zrobione, ale nie umieściłem go w załączonym projekcie, bo jest mi to na zaliczenie potrzebne, a nie chcę być posądzony, że wszystko skopiowałem).

`dodanie znaczników i ``` - @furious programming

0

Metoda a.tekst.setText("NowyTekst") wymazuje cały tekst i wstawia podany tekst do kontrolki.

Jeżeli już, to najprościej uzyć a.tekst.setText(a.tekst.getText() + "DalszyTekst").

A najlepiej bedzie utworzyć StringBuilder, do niego wpisywać wszystko, co po kolei chcesz wypisać, a na koniec jedno wywołanie setText(Sb).

0

Głównym problemem jest samo wstawienie:

a.tekst.setTexT("Nieważne co tu jest");

co zresztą opisałem wyżej... po tym na wyjściu za pomocą System.out.println()

 jest wyświetlany "zły wynik", że tak to ujmę najprościej, już pomijając te wyświetlanie tego w polu tekstowym. Jak tylko wstawię tą jedna linikę kodu to wszystko się sypie... tu nie rozumie właśnie w czym problem.
0

Umieść projekt w jakimś rozsądnym miejscu (bez informacji o wygraniu samochodu i tym podobnych bredni).

0

Mógłby mi ktoś chociaż podpowiedzieć jak mogę pobrać wartość zmiennej z tego fragmentu kodu:

else if (wyrazenie != null) {
            int wartosc = wyrazenie.wykonaj();
            System.out.println("PRINT: " + wartosc);

i przekazać go do innej klasy, bez brania pod uwagę przekazywania tego za pomocą setText() do pola tekstowego (bo tak się nie da, opis sytuacji wyżej)? Chciałbym dopiero w klasie, w której mam gui przekazać ją do pola tekstowego.

Proszę o wskazówki co mogę zastosować itp.

No chyba, że ktoś wie jak przekazać to za pomocą setText(), tak by program działał poprawnie.

Wybaczcie, że tak "żebram", ale jestem zdesperowany, bo zostało mi coraz mniej czasu żeby to zrobić, a wszystko co próbowałem sam zawodzi...

`dodanie znaczników ``` - @furious programming

0

W klasie TProstaInstrukcja nie ma żadnej referencji do klasy z gui. Ten kod

 else if (wyrazenie != null) {
            int wartosc = wyrazenie.wykonaj();
            System.out.println("PRINT: " + wartosc);
 
            a.tekst.setText("PRINT: " + wartosc);
 
        }

nie ma się prawa skompilować. Przekaż referencję w konstruktorze.

0

Zrobiłem to tak w TProstaInstrukcja zanim jeszcze napisałem tego posta:

private Gui a;

...

public TProstaInstrukcja(Gui a) {
        this.a = a;
    }

...

else if (wyrazenie != null) {
            int wartosc = wyrazenie.wykonaj();
            System.out.println("PRINT: " + wartosc);
 
            a.tekst.setText("PRINT: " + wartosc);
 
        }

Ten kod mam zaimplementowany w gui, a konkretnie pod przyciskiem, który uruchamia ten parser:

try {
            //PARSOWANIE
            TProgram result = (TProgram) parser_obj.parse().value;

            System.out.println("Po parsowaniu...");

            //UZYCIE DRZEWA OBLICZEN
            result.wykonaj();

        } catch (Exception e) {
            System.out.println("Tekst wyjatku po parsowaniu: " + e.getMessage());
            System.exit(0);
        }

Efekty są takie jak opisałem w 1 poście.

Próbowałem jeszcze wiele innych "rzeczy" i doszedłem do wniosku, że najprościej będzie jak to zapisze do pliku tekstowego, a potem wczytam do pola tekstowego. Inaczej nie potrafię, a widzę, że tutaj też nikt nie wie albo nie chce pomóc. Siedzę nad tym od czwartku od rana do wieczora i stwierdziłem, że szkoda życia i nerwów. Lepiej zrobić coś na odpier... niż wcale.

0

Masz niepoważne podejście, opisujesz problem, zamieszczasz kawałek kodu, udostępniasz projekt. Ale udostępniony projekt i zamieszczony kod różnią sie od tego kodu na którym występuje problem.
Sposób udostępnienia projektu też pozostawia wiele do życzenia, albo strony wymagające oglądania reklam, albo walnięte archiwum.

0

Nie mam całego dnia żeby znaleźć jakiś mega super hosting, który Tobie przypasuje prosiłem o sugestie to nic nie napisałeś (to co podlinkowałem jakoś działa)... A projekt wrzuciłem taki, bo stwierdziłem, że będzie bardziej "czytelny", a wszystko opisałem (dorobić proste gui i konstruktor to max 2 minuty). Poza tym już nie potrzebuję łaski i założę się, że sam nie wiesz jak to zrobić... Więcej tu już po nic wejdę na to forum, więcej narzekania, robienia łaski, itp. niż pomocy.

0

@witek901 - do przekazywania plików służą załączniki, które możesz dodać do każdego posta; Skorzystaj więc z nich, zamiast podawać linki do jakichś śmieciowych hostingów; Po drugie utrudniasz pomoc potencjalnym chętnym i miotasz się, jak ktoś zwróci uwagę, że coś robisz źle; Poza tym @bogdans napisał już kilka postów z wartościowymi odpowiedziami, więc nie wiem dlaczego podejrzewasz, że odpowiadający nie umie Tobie pomóc;

Zrób z łaski swojej to o co Cię @bogdans prosi i dokończ ten wątek w przyjaznej atmosferze.

0

Dodałem do załącznika nowy projekt z prostym gui. Od razu zaznaczam żeby nie było niedomówień, że interesuje mnie wyświetlenie tylko i wyłącznie w polu tekstowym zaimplementowanym w klasie ProsteGui "tego" (SAM WYNIK) co zaimplementowane jest w klasie TProstaInstrukcja. Fragment poniższej:

else if (wyrazenie != null) {
            int wartosc = wyrazenie.wykonaj();
            System.out.println("PRINT: " + wartosc);
            
            a.tekst.setText("PRINT: " + wartosc);

        }

Pojawiający się w tej chwili problem:

  • Nic się nie wyświetla w polu tekstowym.
  • System.out.println() powinien w oryginalnym projekcie wyświetlić taki wynik:
PRINT: 1
PRINT: 3
PRINT: 5
PRINT: 7
PRINT: 9
PRINT: 25

Niestety gdy tylko wstawię tą jedną linijkę:

a.tekst.setText("PRINT: " + wartosc);

na wyjściu (za System.out.println()) dostaję to:
PRINT: 1
w polu tekstowym nic się nie wyświetla...

Próbowałem wiele innych sposobów, ale każdy zawodził. Może faktycznie wcześniej źle przedstawiłem problem, ale wydawało mi się, że wiadomo o co chodzi...

Mam nadzieję, że nie pisałem tego posta na marne i ktoś może jednak da jakąś wskazówkę.

I nie miotam się tylko wczoraj byłem cały dzień zdenerwowany, bo nie mam ostatnio na nic czasu, każdy akurat coś ode mnie chce, do tego pożyczyłem siostrze nowy samochód, a ona go skasowała, a ja mam tak, że najpierw coś zrobię, a później tego żałuję jak kogoś uraziłem to przepraszam...

1

Na razie bez sprawdzania. W tym wierszu z klasy ProsteGui

parser parser_obj = new parser(new MyLexer(tekstReader));

powinieneś przekazać referencję do klasy ProsteGui, tzn.

parser parser_obj = new parser(new MyLexer(tekstReader),ProsteGui.this);

W konstruktorze klasy parser powinieneś odebrać tę referencje i zapamiętać w jakimś polu.

public class parser extends java_cup.runtime.lr_parser {
  ProsteGui okno; 

  ...
  /** Constructor which sets the default scanner. */
  public parser(java_cup.runtime.Scanner s, ProsteGui okno) {
      super(s);
      this.okno = okno;
  } 
  ...

W dalszej kolejności, referencja powinna być przekazana do klasy TProstaInstrukcja, a w niej (w odpowiednim miejscu) coś takiego

okno.tekst.setText("PRINT: " + wartosc);

Ja już na konsoli widzę

run:
Po parsowaniu...
PRINT: 1
PRINT: 3
PRINT: 5
PRINT: 7
PRINT: 9
PRINT: 25

a w oknie PRINT: 25

0

Dziękuję za pomoc, a właściwie, gotowca. Chciałbym się tego nauczyć, mogę spytać, które książki będą najlepsze dla takich osób jak ja, czyli "ciemnych" i początkujących? W tym roku kończę technikum i planuję pójść na studia o kierunku informatycznym, a konkretnie coś związane z programowaniem. Twoja wiedza mi bardzo imponuje, chciałbym kiedyś tak to ogarniać jak Ty :P Mogę wiedzieć ilu letnie doświadczenie masz jako programista Javy?

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