Swing Programming question.
Swing Programming question.
Σε προηγουμενες εργασιες που εκανα java gui παρατηρησα οτι ελυνα καποια προσωρινα προβλημα με ασχημο τροπο.Οχι τελειως ασχημο ,χρηση Singleton πολυ.Καποιοι αλλες λυσεις που εδινα βγαζουν ματι οτι ερασιτεχνικες και εκτος κλιματος με το swing το οποιο δουλευει με πιο σοφιστικε τροπο.
Εχω τη εξης απορια.Ξεκινωντας απο την απαιτηση μου να ΜΗΝ φτιαχνω δικες μου κλασεις για panels ,ή οτιδηποτε αλλο θελω, για να τους περναω πχ σε κατασκευαστη τα components που θα μπορουν να εππηρεαζουν (πχ ενα status label στην τρεχα γυρευε κατω δεξια γωνια που ειναι μελος αλλου container), ΠΟΙΟΣ ειναι ο σωστος τροπος ΟΛΑ να εχουν access σε ΟΛΑ?
Μια σκεψη μου ειναι να σωζω τα models (πχ DefaultListModel ή ποιο απλα το text ενος Label) ολων των components που μπορουν να αλλαζουν σε μια Singleton κλαση.Σαν προεκταση σκεφτηκα (επειδη τα components που τους σωζω τα models δεν χρειαζεται να πηγαινουν στη singleton κλαση και να περνουν την τιμη τους καθε φορα μιας και αλλαγη στο model σημαινει και invokation μεθοδου fireContentsChanged η κατι παρομοιο) για τα components που σωζω την τιμη τους ξερα (πχ ενα String και οχι model) να κανω την singleton κλαση και Observable (observer pattern) και αυτα observers και να τους καλω την update.
Ειναι λογικο σαν σκεψη?Συμβαδιζει καθολου με τον τροπο προγραμματισμου που προτασει το swing η ειναι τελειως μπακαλικο?Αν ναι ποια λυση ενδυκνειται για μενα?
Thanx
Y.Γ : Για components που δεν εχει defaultmodel implemented η java πως να φτιαξω δικο μου model?Το ρωταω διοτι ετσι αποφευγω να παιξω με oberver pattern και γλυτωνω κωδικα στη singleton κλαση αλλα ΚΑΙ κωδικα να φτιαξω δικες μου κλασεις για αυτα components ωστε να τους κανω implement το Observer Interface.
Y.Γ 2 : Αλλη μια αναγκη ειναι να γινονται disabled καποια menuitems αναλογα με την κατασταση που βρισκεται η εφαρμογη.Να τα κανω ενα ενα πρεπει να ειναι ασχημη υλοποιηση.
Εχω τη εξης απορια.Ξεκινωντας απο την απαιτηση μου να ΜΗΝ φτιαχνω δικες μου κλασεις για panels ,ή οτιδηποτε αλλο θελω, για να τους περναω πχ σε κατασκευαστη τα components που θα μπορουν να εππηρεαζουν (πχ ενα status label στην τρεχα γυρευε κατω δεξια γωνια που ειναι μελος αλλου container), ΠΟΙΟΣ ειναι ο σωστος τροπος ΟΛΑ να εχουν access σε ΟΛΑ?
Μια σκεψη μου ειναι να σωζω τα models (πχ DefaultListModel ή ποιο απλα το text ενος Label) ολων των components που μπορουν να αλλαζουν σε μια Singleton κλαση.Σαν προεκταση σκεφτηκα (επειδη τα components που τους σωζω τα models δεν χρειαζεται να πηγαινουν στη singleton κλαση και να περνουν την τιμη τους καθε φορα μιας και αλλαγη στο model σημαινει και invokation μεθοδου fireContentsChanged η κατι παρομοιο) για τα components που σωζω την τιμη τους ξερα (πχ ενα String και οχι model) να κανω την singleton κλαση και Observable (observer pattern) και αυτα observers και να τους καλω την update.
Ειναι λογικο σαν σκεψη?Συμβαδιζει καθολου με τον τροπο προγραμματισμου που προτασει το swing η ειναι τελειως μπακαλικο?Αν ναι ποια λυση ενδυκνειται για μενα?
Thanx
Y.Γ : Για components που δεν εχει defaultmodel implemented η java πως να φτιαξω δικο μου model?Το ρωταω διοτι ετσι αποφευγω να παιξω με oberver pattern και γλυτωνω κωδικα στη singleton κλαση αλλα ΚΑΙ κωδικα να φτιαξω δικες μου κλασεις για αυτα components ωστε να τους κανω implement το Observer Interface.
Y.Γ 2 : Αλλη μια αναγκη ειναι να γινονται disabled καποια menuitems αναλογα με την κατασταση που βρισκεται η εφαρμογη.Να τα κανω ενα ενα πρεπει να ειναι ασχημη υλοποιηση.
- Einherjar
- Venus Project Founder
- Posts: 3751
- Joined: Tue Jan 27, 2004 4:42 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Washington DC, USA
- Contact:
Για άλλη μια φορά φίλε Tomahawk είσαι χείμαρος
Πιστεύω ότι δε μπορεί να υπάρχει μια γενική λύση στο πρόβλημά σου, το οποίο δε μπορώ να πω ότι κατανόησα πλήρως. Κάθε εφαρμογή έχει τις απαιτήσεις της, ειδικά στις εργασίες της σχολής.Οι εταιρίες συνήθως έχουν τα δικά τους patterns.
Για να πάμε στην ουσία τώρα, πιστεύω ότι η διαδικασία που περιλαμβάνει Observers/Observables είναι πολύ καλή αν και ίσως λίγο απαιτητική σε ποσότητα κώδικα.
Μια άλλη προσέγγιση που θα μπορούσες να δοκιμάσεις θα ήταν μέσω χρήσης properties και property files.
Σου λέω όμως πάντα εξαρτάται από αυτό που φτιάχνεις. Αν κατάλαβα κάτι λάθος, u know the drill

Πιστεύω ότι δε μπορεί να υπάρχει μια γενική λύση στο πρόβλημά σου, το οποίο δε μπορώ να πω ότι κατανόησα πλήρως. Κάθε εφαρμογή έχει τις απαιτήσεις της, ειδικά στις εργασίες της σχολής.Οι εταιρίες συνήθως έχουν τα δικά τους patterns.
Για να πάμε στην ουσία τώρα, πιστεύω ότι η διαδικασία που περιλαμβάνει Observers/Observables είναι πολύ καλή αν και ίσως λίγο απαιτητική σε ποσότητα κώδικα.
Μια άλλη προσέγγιση που θα μπορούσες να δοκιμάσεις θα ήταν μέσω χρήσης properties και property files.
Σου λέω όμως πάντα εξαρτάται από αυτό που φτιάχνεις. Αν κατάλαβα κάτι λάθος, u know the drill

[Better to understand a little than to misunderstand a lot]
ΧεχεEinherjar wrote:Για άλλη μια φορά φίλε Tomahawk είσαι χείμαρος![]()
Βασικα σκεψου το εξης.Χρειαζεσαι 5 panels τα οποια εχουν το ιδιο layout απο δομη και ολα.Το μονο που αλλαζει ειναι κανα label κτλ.Οποτε μπορεις να κανεις μια κλαση με παραμετρους για αυτες τις διαφορες στο κατασκευαστη.Δημιουργεις διαφορετικα instances της κλασης αυτης για καθε ενα απο τα panels και περνας το καταλληλο field αναλογα (πχ για το Game search panel θελεις να εχει ονομα στο Label του "Game Search" ενω για το Film seach panel θελεις label "Film Search").Επειδη ολα εχουν τον ιδιο σχεδιασμο και την ιδια λειτουργια ειναι κριμα να σχεδιαζεις το ιδιο πραγμα στο IDE 5 φορες.
Αυτη η κλαση ομως ,που θελεις να τη σχεδιασεις εκτος του mainFrame, θα σχεδιαστει μια φορα και ολα instances της θα εχουν την ιδια μορφη με ελαχιστες διαφορες (αναλογα το ορισμα που περναμε στην αρχικοποιηση).
Αυτη επισης,αφου θα το κανουμε ετσι , θα εχει ΕΝΑ ΣΩΡΟ components και containers τα οποια ,αφου ΔΕΝ ειναι δηλωμενα μεσα στη mainFrame (εμεις απλως κανουμε 5 αντικειμενα MyPanel) , ΔΕΝ θα εχουμε αμεση προσβαση ωστε να τα αλλαζουμε κατα βουληση.Ενα button δηλωμενο στη mainFrame δεν μπορει να κανει hide για παραδειγμα ενα βαθια χωμενο label στο MyPanel.Τι θα γραψεις? this.MyPanel.acontainer.anothercontainer.targetLabel.setText("something") ??Δεν γινεται.Ουτε με επαναλαμβανομενα getComponents για καθε ενα μεχρι να φτασεις στο targetLabel το οποιο ειναι πολυ ασχημο.
Αρα πως εχει access το κουμπι στο label?
Πιο γενικα πως εξασφαλιζεις οτι τα παντα εχουν access στα παντα?Ωστε ανα πασα στιγμη να μπορεις απο το καθε component να αλλαξεις οποιοδηποτε component οσο μακρια/βαθια να υπαρχει αυτο?
Τι λυση προτεινει το swing για αυτο το προβλημα?
//---Αν σε μπερδεψαν τα παραπανω τοτε μην
//---διαβασεις τα παρακατω
Η σκεψη μου ειναι να σωζεις το model καθε component (label,list) υποψηφιου για αλλαγη καπου αποκεντρωμενα και προσβασιμα απο ολους.Σε μια singleton κλαση δηλαδη.Το component διαβαζει τη τιμη του απο εκει και οποιος θελει να το αλλαξει αλλαζει την καταλληλη τιμη στη singleton κλαση (static μεταβλητες).Εδω μπαινει και η αναγκη για observer αν θελουμε το component που αλλαζει να ενημερωνεται μολις υπαρξει αλλαγη της τιμης του στη κλαση.Για να το περιπλεξω λιγο παραπανω να πω επισης οτι αν παιζεις με models δεν χρειαζεται να κανεις το component observer μιας και αλλαγη στο model ειναι ομορφα υλοποιημενο απο τη java ωστε να ενημερωνεται αμεσως.Δεν χρειαζεται να παει να ψαξει τη τιμη του.Μολις αλλαξει τοτε αυτο το ξερει και κανει οτι πρεπει.
Οταν ομως δεν παιζεις με models τοτε θελει να το κανεις καπως μονο σου.
Προσπαθεια εξηγησης νουμερο 2:
Σχεδιαζεις ενα frame με δυο panels.Ενα πανω ενα κατω.Το πανω panel το σχεδιαζεις μεσα στη frame και εχει ενα κουμπι.Το κατω panel δεν θελεις να το σχεδιασεις στη frame αλλα φτιαχνεις μια αλλη κλαση που κανει extend το jpanel και το σχεδιαζεις εκει.Αυτο το panel εχει ενα label.
Μεσα στη frame θελεις το κατω panel να ειναι το καινουργιο panel που εφιαξες.Οποτε φτιαχνεις ενα αντικειμενο MyPanel μεσα στη frame και το τοποθετεις στην κατω θεση.ΟΚ?
Προσεξε οτι το label του MyPanel δεν ειναι ορισμενο μεσα στη frame οποτε το button του πανω panel πως μπορει να του αλλαξει τη τιμη?
- Einherjar
- Venus Project Founder
- Posts: 3751
- Joined: Tue Jan 27, 2004 4:42 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Washington DC, USA
- Contact:
Αν καταλαβαίνω καλά αυτό που θες και με το φοβο ότι αυτό που θα σου πω θα σε τσαντίσει (η εμπειρία της συνεργασία μας με έχει διδάξει
), γιατί δε φτιάχνεις public συναρτήσεις στην MyPanel που να κάνουν τη δουλειά που θες, π.χ. MyPanel.hideLabel();
Εσύ θες να αλλάζει κάτι κάπου (π.χ. μια τιμή) και να γίνεται αυτόματα μια ενέργεια?
Δε πιστεύω ότι το swing ορίζει ένα συγκεκριμένο τρόπο για να το κάνεις αυτό αλλιώς (λογικά) θα είχε ενσωματώσει τον μηχανισμό αυτό στο api. Αντίθετα, πιστεύω ότι εξαρτάται απόλυτα από το στυλ που επιλέγεις να ακολουθήσεις

Εσύ θες να αλλάζει κάτι κάπου (π.χ. μια τιμή) και να γίνεται αυτόματα μια ενέργεια?
Δε πιστεύω ότι το swing ορίζει ένα συγκεκριμένο τρόπο για να το κάνεις αυτό αλλιώς (λογικά) θα είχε ενσωματώσει τον μηχανισμό αυτό στο api. Αντίθετα, πιστεύω ότι εξαρτάται απόλυτα από το στυλ που επιλέγεις να ακολουθήσεις
[Better to understand a little than to misunderstand a lot]
Γιατι το λες αυτο ρε συ?Ποτε τσαντιστικα?Το μονο μου παραπονο ηταν οτι δεν εκανα τιποτα αν εννοεις τα κατανεμημενα.Εχω τσαντιστει ποτε μαζι σου?Einherjar wrote:Αν καταλαβαίνω καλά αυτό που θες και με το φοβο ότι αυτό που θα σου πω θα σε τσαντίσει (η εμπειρία της συνεργασία μας με έχει διδάξει)
Αυτο που λες με τις μεθοδους ειναι οντως μια λυση.Την χρησιμοποιησα αλλα γινοταν χαμος.Και ξερεις καλα πως βγαζει ματι οταν γινεται σπαγγετι ο κωδικας σου.
Ναι οντως ψαχνω μια λυση που να γινονται τα πραγματα αυτοματα και με την μεγαλυτερη αοριστια.Να μην χρειαζεται πχ το button να ξερει την υπαρξη αλλων components.Να μην αρχιζει να καλει μεθοδους σαν τρελο για οτι θελει να αλλαξει.Το μονο που πρεπει να ξερει ,οπως το σκεφτομαι,ειναι να αλλαξει καπου μια τιμη και ασε τους αλλους (οσοι και να ειναι αυτοι που την θελουν τη τιμη) να κανουν οτι θελουν.
Και εσενα δεν σου φαινεται πολυ προφανες?Τοσο που να σκεφτεις οτι πιθανον να σου δινει τη δυνατοτητα το api?
Αλλα απο οτι λες δεν υπαρχει.Cool.Γιατι αισθανομουν οτι δεν γνωριζω κατι βασικο σε τετοιου ειδους προγραμματισμο ορισμενο απο τα παλικαρια στη java.
Εσενα στη εταιρια τι γραμμη υπαρχει σε αυτο το θεμα?
Σας λενε πως να το λυσεις το συγκεκριμενο?
Thanx Man :D
P.S Δεν εχω τσαντιστει ποτε.Αν φαινεται ετσι σορρυ.
- Einherjar
- Venus Project Founder
- Posts: 3751
- Joined: Tue Jan 27, 2004 4:42 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Washington DC, USA
- Contact:
Με παρεξήγησες... εννοούσα ότι θα έλεγες [anargyros_style]τι @@ μου λες τώρα... με δουλεύεις???[/anargyros_style] 
Σου λέω πάντως ότι θα μπορούσες να χρησιμοποιήσεις properties (System.get/setProperty()) και κάθε component σου να κοιτάζει κάθε τόσο (με ένα thread) την τιμή ενός ή περισσοτέρων properties, αλλά οι αλλαγές δε θα ήταν τόσο άμεσα εμφανείς.
Όπου έχω προγραμματίσει επαγγελματικά δεν έχω κάνει κάτι σε gui παρά μόνο net/db/mobile programming οπότε δεμπορώ να σε βοηθήσω στον τομέα αυτό.
good luck!

Σου λέω πάντως ότι θα μπορούσες να χρησιμοποιήσεις properties (System.get/setProperty()) και κάθε component σου να κοιτάζει κάθε τόσο (με ένα thread) την τιμή ενός ή περισσοτέρων properties, αλλά οι αλλαγές δε θα ήταν τόσο άμεσα εμφανείς.
Όπου έχω προγραμματίσει επαγγελματικά δεν έχω κάνει κάτι σε gui παρά μόνο net/db/mobile programming οπότε δεμπορώ να σε βοηθήσω στον τομέα αυτό.
good luck!
[Better to understand a little than to misunderstand a lot]