Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Sabi

Pomoc z programem tworzacym wykresy w języku Java

Polecane posty

Witajcie.

Piszę do Was z prośbą o pomoc z napisaniem programu w języku Java, który rysowałby wykresy na podstawie podanych danych. Muszę wykonać go na laboratorium, a w pewnym momencie zorientowałem się, że nie jestem w stanie poradzić sobie z najbardziej podstawowymi problemami, jak odczyt podawanych przez użytkownika. Do chwili obecnej pomysł zakładał odczytywanie wartości z poszczególnych okienek tekstowych, obliczanie współrzędnych w wątku i rysowanie na ich podstawie wykresu. Problem polega na tym, że nie bardzo jestem w stanie wymyślić, jak "wyciągnąć" to, co jest aktualnie w okienku wpisane, aby stanowiło to zmienną, na której mogę operować, czy też operację odwrotną - "wpisania" w okienko wartości danej zmiennej.

Nie jestem zbytnio sprawny w programowaniu, dlatego bardzo prosiłbym o pomoc lub sugestie. Dołączam też archiwum z samym programem, gdyby ktoś chciał go podejrzeć.

Od razu dziękuję za wszelką pomoc, porady i poświęcony mi czas.

prog.zip

Link do komentarza
Udostępnij na innych stronach

Okienko tekstowe jest "zmienną", a konkretniej to obiektem, który posiada pewne właściwości. Jedną z nich jest tekst wpisany w okienku. Możesz go odczytać i zapisać do zmiennej, np typu Float:

Float i = Float.parseFloat(textBox1->getText());

W podobny sposób możesz zapisać wartość w okienku:

textBox1->setText("jakis tekst, moze byc tez liczba");

Link do komentarza
Udostępnij na innych stronach

Cześć

Ponieważ popełniłeś niejaki błąd przy eksportowaniu programu do pliku (nie ma plików źródłowych .java, są tylko pliki .class) to za bardzo nie mogę skomentować twojego kodu.

Teraz trochę o twoim problemie.

Z tego co widzę to używasz Swinga. Moja propozycja jest więc taka - dorób przycisk, nazwany na przykład "Rysuj", którego naciśnięcie spowoduje odczytanie wartości z okienek. Jeśli nie wszystkie okienka są wypełnione - to należy po prostu wyrzucać błąd, ale po kolei.

Z pola tekstowego typu JTextField lub JTextArea zmienną da się wyłuskać prawie tak samo jak kolega gus napisał. Prawie, bo nie używa się wskaźnikowania (->) tylko po prostu kropki (chyba za dużo C++ :)), czyli:

JTextArea a = new JTextArea();

...

String text = a.getText();

Żeby uzyskać jakąś konkretną zmienną, a nie obiekt klasy String, należy po prostu ją skonwertować tak:

double d = Double.parseDouble(a.getText());

Spowoduje to odczytanie tego, co wpisano w pole a (metoda a.getText()) i dalszą konwersję tego Stringa do double.

Link do komentarza
Udostępnij na innych stronach

Dzięki, właśnie o taką komendę mi chodziło. Tylko trzeba będzie pewnie jeszcze dodać jakiś wyjątek, na wypadek, gdyby odczytana wartość nie była liczbą (dajmy na to, że ktoś wpisze "dużo" zamiast, np 14).

Jeszcze jedno pytanie, jeżeli można - jeżeli chcę dorobić dodatkową klasę typu Thread, to jak umożliwić jej operowanie na zmiennych w innej klasie, skoro Thread nie akceptuje polecenia "return"? Czy też może zrobić to w inny sposób? Chodzi o to, żeby nie robić wszystkiego w jednej klasie, tylko oddzielić od siebie kod wykonujący przeliczanie współrzędnych ze wzorów i rysujących wykres. Przy okazji znowu dorzucam program, tym razem pliki .java - ale jeszcze przed wprowadzeniem Twojego rozwiązania.

Jeżeli nie sprawi to kłopotu, to byłbym bardzo wdzięczny za pomoc.

pr1_2.zip

Link do komentarza
Udostępnij na innych stronach

Pytanie - czy potrzebujesz, żeby program rysował ci wykresy na bieżąco, czy tylko masz *klik* i pojawia się wykres?

Tak czy inaczej:

Przede wszystkim potrzebujesz rozdzielić tzw. warstwę prezentacji od warstwy, w której de facto liczysz. Dlatego sugerowałbym stworzenie oddzielnej klasy (niekoniecznie rozszerzającej Thread, ba, nawet bym powiedział, żeby nie rozszerzała Thread), która będzie miała następujące metody:

- settery dla parametrów (metody ustawiające parametry)

- settery dla poszczególnych datasetów

- metodę pozwalającą na dodanie wyniku do konkretnego datasetu (w zależności od podanego argumentu)

No i teraz zależnie od scenariusza na początku:

a) Albo po prostu po kliknięciu program:

- odczytuje wartości z pól

- przekazuje je do wyżej wspomnianej klasy

- tworzy się pętlę która dodaje żądaną ilość punktów do datasetu co - w razie dobrze zaimplementowanego wykresu - spowoduje nałożenie punktów na wykres

b) Lub:

- odczytuje wartości z pól

- przekazuje je do wyżej wspomnianej klasy

- tworzy i uruchamia nowy wątek, który będzie co pewien dany czas dodawał punkt do wykresu w sposób analogiczny do powyższego

PS. Co do threadów (czyli wątków właśnie) to je stosuje się nieco inaczej niż normalne klasy. No i nie są one zbytnio polecane nawet przez twórców Javy, lepiej implementować interfejs Runnable.

Jak to powinno wyglądać mniej/więcej:

public class MyThread implements Runnable {
    private boolean running = true;

    public boolean isRunning() {
        return running;
    }

    public void setRunning(boolean running) {
        this.running = running;
    }

    @Override
    public void run() {
        while(running){
            // tu wpisz co ci się żywnie podoba
        }
    }

A uruchamia się toto poprzez:

MyThread mt = new MyThread(); // stworzenie wątku
new Thread(mt).start();

Link do komentarza
Udostępnij na innych stronach

Ok, dzięki wielkie za pomoc.

Co do programu, to generalnie ma on wykonywać wykres po naciśnięciu klawisza, a ewentualnie również umożliwić przesuwanie za pomocą suwaka punku po wykresie (czyli, że będzie musiał też umieć rysować go na bieżąco, ale tylko jeden punkt na raz).

Z tym mogę jakoś sobie dać radę, ale pojawił się tylko niewielki problem z wypełnianiem pól. Po prostu chciałem stworzyć osobną klasę, która będzie w stanie wypełniać pola wartościami odczytanymi z podanego pliku tekstowego. Problem w tym, że nie widziała ona tego pliku, mimo iż znajdował się on w tym samym katalogu src.

Podpatrzyłem możliwe rozwiązanie i próbowałem zastosować je w klasie "getdatafromfile", ale dalej nie działało. Starsza, prostsza wersja tej klasy nosi w załączonym pliku nazwę "getdatafromfile2".

Jeżeli nie sprawiałoby to kłopotu, to bardzo byłbym wdzięczny za poradę, jak ten problem zlikwidować.

EMmove1.zip

Link do komentarza
Udostępnij na innych stronach

Za bardzo nie rozumiem w czym problem ale wadliwy kod zawsze da się zastąpić czymś innym.

Są dwie możliwości: albo zastosujesz absolutną ścieżkę do pliku czyli jeśli masz plik w katalogu

C:\Java\Projekty\EMmovie\def.txt

to używasz:

String path = "c:\\Java\\Projekty\\EMmovie\\def.txt"

Albo po prostu stworzysz metodę, która pozwoli ci na wybieranie pliku z dysku, np:

private String selectFile(){
        JFileChooser jc = new JFileChooser("Wybierz plik");
        jc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        jc.showOpenDialog(null);
        if(jc.getSelectedFile()!=null) return jc.getSelectedFile().getAbsolutePath();
        else return null;
    }
        ...
        String path = selectFile();

Albo:

private File selectFile(){
        JFileChooser jc = new JFileChooser("Wybierz plik");
        jc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        jc.showOpenDialog(null);
        if(jc.getSelectedFile()!=null) return jc.getSelectedFile();
        else return null;
    }
        ...
        File f = selectFile();

Wywołanie tej metody spowoduje pojawienie się okienka w którym wybiera się plik. Po jego wybraniu dostaniesz ten plik w pożądanej postaci. W przypadku naciśnięcia "Anuluj"/"Cancel", zostanie zwrócona wartość null.

Link do komentarza
Udostępnij na innych stronach

Jeżeli nie stanowi to problemu, chciałbym, zamiast zakładać nowy temat, wykorzystać stary.

W programie nagle zaistniała potrzeba rysowania wykresu z trzema osiami. I tu pojawił się problem, bowiem biblioteka ?jfreechart?, z której korzystałem do tej pory, najwyraźniej nie pozwala jeszcze na tworzenie takich wykresów. W sieci znalazłem jeszcze "jzy3d" ( http://code.google.com/p/jzy3d/ ), ale wydaje się trochę zbyt skomplikowany jak na moje niskie umiejętności. Gdyby ktoś mógłby mi polecić bardziej przystępną bibliotekę (nie musi mieć olbrzymich możliwości, wystarczy, że będzie w stanie tworzyć wykresy (x,y,z)) albo w jakikolwiek inny sposób poradzić, jak tego dokonać, byłbym bardzo wdzięczny.

Od razu dziękuję za ewentualną pomoc, sugestie i poświęcony mi czas.

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...