ALLisCHAOS Δημοσ. 1 Δεκεμβρίου 2014 Δημοσ. 1 Δεκεμβρίου 2014 Γεια σας, προσπαθώ να κάνω ένα 'χαζοπαιχνίδι' στη 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, διαφορετικά με τον παραπάνω κώδικα η βάρκα δεν κουνιέται καθόλου. Εχει κανείς καμιά ιδέα?
CtrlFreak Δημοσ. 1 Δεκεμβρίου 2014 Δημοσ. 1 Δεκεμβρίου 2014 Ίσως με μια for. Δηλαδή μετακίνηση της βάρκας κάποια pixel - παύση - μετακίνηση της βάρκας - παύση ώστε να είναι πιο ομαλό στο μάτι.
ALLisCHAOS Δημοσ. 1 Δεκεμβρίου 2014 Μέλος Δημοσ. 1 Δεκεμβρίου 2014 Το θέμα είναι ότι εκεί στη -παύση-, χαλάει, και με while το δοκιμασα αλλά για κάποιο λόγο ο timer δημιουργει το προβλημα...? εκτός και αν κάνω κάπως άλλιως τη παυση, αλλά πως?
CtrlFreak Δημοσ. 1 Δεκεμβρίου 2014 Δημοσ. 1 Δεκεμβρίου 2014 Ίσως κάτι σαν: Try { Thread.sleep(50); } catch (Exception ex) {} από βιβλίο το βρήκα το παραπάνω και αυτό το έχει μέσα σε for.
Luciddream Δημοσ. 1 Δεκεμβρίου 2014 Δημοσ. 1 Δεκεμβρίου 2014 δεν ξέρω αν αυτό που θα σου πω το κάνεις ήδη ή αν σου έχει ξεφύγει, αλλά απο όσο ξέρω για να βλέπεις τις αλλαγές στο swing δεν πρέπει να γίνονται στο ίδιο thread η εμφάνιση του GUI με τους υπολογισμούς. Άρα θα πρέπει να βρεις ένα τρόπο να τα κάνεις ξεχωριστά (επειδή δεν έχω ασχοληθεί πολύ με το συγκεκριμένο, αν λέω καμια βλακεία συγχωρέστε με )
Xvipes Δημοσ. 1 Δεκεμβρίου 2014 Δημοσ. 1 Δεκεμβρίου 2014 Δοκίμασε να κάνεις repaint() ή revalidate() σε κάθε iteration για να κάνει refresh το παράθυρο.
albNik Δημοσ. 1 Δεκεμβρίου 2014 Δημοσ. 1 Δεκεμβρίου 2014 To swing εχει timers για αυτο το λογο, χωρίς να μπλεξεις με threads, η ακομα χειρότερα "παυσεις/ξε-παυσεις" (Thread.sleep) https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html 1
Luciddream Δημοσ. 1 Δεκεμβρίου 2014 Δημοσ. 1 Δεκεμβρίου 2014 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.
albNik Δημοσ. 1 Δεκεμβρίου 2014 Δημοσ. 1 Δεκεμβρίου 2014 Ενας γενικος κανονας ειναι οτι αν o υπολογισμος διαρκει πανω απο 50ms πρεπει να γινει σε αλλο thread.Τα αποτελεσματα στο gui παλι πρεπει να περαστουν στο gui thread. Αν θες να μετακινεις ενα label οι πραξεις ειναι αμελητέες.
ALLisCHAOS Δημοσ. 1 Δεκεμβρίου 2014 Μέλος Δημοσ. 1 Δεκεμβρίου 2014 χρησιμοποιώντας την Timer δούλεψε! ευχαριστώ! αλλά τώρα προέκυψε νέο πρόβλημα, έχω δύο timers που ο καθένας καλεί ένα γεγονός και κάνει το animation της βαρκας απο τη μια οχθη στη άλλη. Οπότε ελέγχο τη θεση της βάρκας κ ανάλογα καλώ τον timer Που χρειάζομαι, ενώ την πρώτη φορά που θα ξεκινήσω τον καθένα πηγαίνουν όλα καλά, τη 2η φορά που θα πατήσω πάλι start δεν γίνεται τπτ, ισως θα πρέπει κάπως να τους τερματίσω τη πρώτη φορά αφού ολοκληρωθεί η κίνηση και μετά να τους ξαναξεκινήσω?
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα