Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας, προσπαθώ να κάνω ένα 'χαζοπαιχνίδι' στη java. Εκει που έχω κολλήσει είναι ότι έχω ένα JLabel το οποίο του έχω δώσει να έχει για εικόνα μια βάρκα, και θέλω όταν ο χρήστης κάνει κλικ πάνω στη βάρκα η βάρκα να πηγαίνει απο την μία οχθη στην άλλη. Ο κώδικας για το animation της βάρκας είναι ο παρακάτω:
 

 varka.addMouseListener (  // varka=label που εχει για icon τη βαρκα
               
    new MouseListener(){
            int arxi=476; // απο εκει που ξεκιναει η βαρκα
            int telos=300; // εκει που θελω να σταματαει
            @Override
            public void mouseClicked(MouseEvent e) {
                arxi--;
                varka.setBounds(arxi, 308, 93,63);
               try {
                    TimeUnit.MILLISECONDS.sleep(500);
               } catch (InterruptedException ex) {
                   Logger.getLogger(MainLayout.class.getName()).log(Level.SEVERE, null, ex);
               }
                if(arxi>telos){
                    mouseClicked(e);
                }

}

το θέμα είναι πως αν δεν βάλω τον Timer δουλευει κανονικά αλλά χάνεται όλη η κίνηση του animation, διαφορετικά με τον παραπάνω κώδικα η βάρκα δεν κουνιέται καθόλου. Εχει κανείς καμιά ιδέα?

Δημοσ.

Ίσως με μια for. Δηλαδή μετακίνηση της βάρκας κάποια pixel - παύση - μετακίνηση της βάρκας - παύση ώστε να είναι πιο ομαλό στο μάτι. 

Δημοσ.

Το θέμα είναι ότι εκεί στη -παύση-, χαλάει, και με while το δοκιμασα αλλά για κάποιο λόγο ο timer δημιουργει το προβλημα...?

εκτός και αν κάνω κάπως άλλιως τη παυση, αλλά πως?

Δημοσ.

δεν ξέρω αν αυτό που θα σου πω το κάνεις ήδη ή αν σου έχει ξεφύγει, αλλά απο όσο ξέρω για να βλέπεις τις αλλαγές στο swing δεν πρέπει να γίνονται στο ίδιο thread η εμφάνιση του GUI με τους υπολογισμούς. Άρα θα πρέπει να βρεις ένα τρόπο να τα κάνεις ξεχωριστά 

 

 

(επειδή δεν έχω ασχοληθεί πολύ με το συγκεκριμένο, αν λέω καμια βλακεία συγχωρέστε με :P)

Δημοσ.

To swing εχει timers για αυτο το λογο, χωρίς να μπλεξεις με threads, η ακομα χειρότερα "παυσεις/ξε-παυσεις" (Thread.sleep)

https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

 

Ωραίο αυτό μου είχε ξεφύγει, αλλά φαίνεται ότι είναι περισσότερο για "απλά" tasks. Εγώ πάλι σε κάτι που χρειάστηκα το έκανα με SwingWoker, και καλύτερα γιατι έμαθα στην τελική πως δουλεύει, που θέλει λίγο πειραματισμό μέχρι να το "πιάσεις"

 

Note that the Swing timer's task is performed in the event dispatch thread. This means that the task can safely manipulate components, but it also means that the task should execute quickly. If the task might take a while to execute, then consider using a SwingWorker instead of or in addition to the timer.

Δημοσ.

Ενας γενικος κανονας ειναι οτι αν o υπολογισμος διαρκει πανω απο 50ms πρεπει να γινει σε αλλο thread.Τα αποτελεσματα στο gui παλι πρεπει να περαστουν στο gui thread. 

Αν θες να μετακινεις ενα label οι πραξεις ειναι αμελητέες. 

Δημοσ.

χρησιμοποιώντας την Timer δούλεψε! ευχαριστώ! αλλά τώρα προέκυψε νέο πρόβλημα, έχω δύο timers που ο καθένας καλεί ένα γεγονός και κάνει το animation της βαρκας απο τη μια οχθη στη άλλη. Οπότε ελέγχο τη θεση της βάρκας κ ανάλογα καλώ τον timer Που χρειάζομαι, ενώ την πρώτη φορά που θα ξεκινήσω τον καθένα πηγαίνουν όλα καλά, τη 2η φορά που θα πατήσω πάλι start δεν γίνεται τπτ, ισως θα πρέπει κάπως να τους τερματίσω τη πρώτη φορά αφού ολοκληρωθεί η κίνηση και μετά να τους ξαναξεκινήσω?

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...