Aristeidisp Δημοσ. 7 Ιανουαρίου 2010 Δημοσ. 7 Ιανουαρίου 2010 Χαιρετώ και μπαίνω στο θέμα, Java: Έχω μια κλάση (Client) που δημιουργεί ένα αντικείμενο trayicon και παρέχει και μια μέθοδο (incoming() )για τη μεταβολή της κατάστασης του trayicon. Θέλω από τη μέθοδο notice() μιας άλλης κλάσης (ClientImpl) να καλέσω την incoming() και να μεταβάλω το status του trayicon αντικειμένου που δημιουργήθηκε νωρίτερα. Το πρόβλημα που αντιμετωπίζω είναι ότι από άλλη κλάση δεν μπορώ να μεταβάλλω το αρχικό αντικείμενο (non-static). Δοκίμασα να διαγράφω το αρχικό trayicon και να δημιουργώ άλλο. Εκτός από το ότι είναι overkill σαν τεχνική δεν λειτουργεί κιόλας η εντολή "tray.remove(trayIcon);" Εν κατακλείδι, ξέρει κάποιος αν υπάρχει τρόπος να μεταβάλλω την κατάσταση ενός αντικειμένου από μέθοδο άλλης κλάσης από αυτήν που δημιουργήθηκε το αντικείμενο? Ελπίζω να ήμουν σαφής Ευχαριστώ
virxen75 Δημοσ. 7 Ιανουαρίου 2010 Δημοσ. 7 Ιανουαρίου 2010 καλύτερα θα ήταν αν έστελνες ένα μικρό παράδειγμα σε java και πάνω εκεί να ρωτήσεις συγκεκριμμένα ,ώστε να καταλάβουμε τι θες ακριβώς.
Aristeidisp Δημοσ. 8 Ιανουαρίου 2010 Μέλος Δημοσ. 8 Ιανουαρίου 2010 Ήθελα να το κρατήσω σε απλό επίπεδο αλλά οκ. Τα σχετικά κομμάτια της κλάσης Client: >public class Client extends javax.swing.JFrame { final TrayIcon trayIcon =new TrayIcon(createImage("/MyTray.jpg", "tray icon")); final SystemTray tray = SystemTray.getSystemTray(); //private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {...} //public static void main(String args[]) {...} //protected void createAndShowGUI() {...} protected static Image createImage(String path, String description) { URL imageURL = Client.class.getResource(path); if (imageURL == null) { System.err.println("Resource not found: " + path); return null; } else { return (new ImageIcon(imageURL, description)).getImage(); } } public void incoming(){ if (trayIcon != null) { trayIcon.setImage(createImage("/MyTray1.png", "tray icon1")); trayIcon.displayMessage("Ready", "started", TrayIcon.MessageType.INFO); }else{ } } Τα σχετικά κομμάτια της κλάσης ClientImpl: >public class ClientImpl extends Client implements ClientInterface{ public ClientImpl()throws RemoteException{ super(); } public void notice(){ incoming(); } } H notice() καλείται από απομακρυσμένη πηγή μέσω rmi. Θέλω όταν δημιουργείται ένα event να καλείται η Notice και να 1) αλλάζει το trayicon, 2) εμφανίζει ειδοποίηση. Αρχικά έφτιαξα την incoming() μέσα στο desktop application επειδή δεν μπορούσα να αλλάξω το trayIcon από άλλη κλάση. Τώρα που τα έγραψα έτσι, πάλι έχω πρόβλημα.
fotisman Δημοσ. 8 Ιανουαρίου 2010 Δημοσ. 8 Ιανουαρίου 2010 O μόνος τρόπος για να αλλάξεις ένα attribute μια κλάσης απο μία άλλη είναι να δημιουργήσεις ένα instance της κλάσης που θέλεις να αλλάξεις. Απο αυτό το instance καλείς τον mutator (function για να αλλάξει attributes σε μια κλάση - στη περιπτωση σου: incoming()). Αλλιώς σπας τους κανόνες encapsulation. Τώρα υπάρχει και η περίπτωση στην οποία ένα attribute είναι static. Σε αυτήν την περίπτωση δεν χρειάζεται να δημιουργήσεις instance της κλάσης. Τα static attributes ειναι προσβάσιμα από παντού καλώντας ClassName.attributeName.
Aristeidisp Δημοσ. 8 Ιανουαρίου 2010 Μέλος Δημοσ. 8 Ιανουαρίου 2010 Ενδιαφέρον ακούγεται, θα το ψάξω περισσότερο Ευχαριστώ!
Aristeidisp Δημοσ. 9 Ιανουαρίου 2010 Μέλος Δημοσ. 9 Ιανουαρίου 2010 Θα σας απασχολήσω ξανά: Δεν φαίνεται να είναι αυτό το πρόβλημα - θα γίνω πιο συγκεκριμένος. H κλάση Client του desktop application δημιουργεί ένα αντικείμενο TrayIcon και παρέχει τις μεθόδους: -createAndShowGUI(): που καθορίζει το μενού και εμφανίζει το trayicon στο system tray -incoming(): που μεταβάλλει την εικόνα του trayicon και εμφανίζει ένα μήνυμα. Μέσα από την κλάση ClientImpl και συγκεκριμένα την μέθοδο notice() καλώ την incoming() (προηγούμενο post). Παρόλο που καλείται η μέθοδος, ΔΕΝ αλλάζει την εικόνα, δηλαδή δεν εκτελούνται όλες οι εντολές: >public void incoming(){ System.out.println("Ekteloymai apo thn incoming"); //Εκτελείται trayIcon.setImage(createImage("/Mytray1.png", "tray icon1")); //Δεν Εκτελείται trayIcon.displayMessage("Ready", "started", TrayIcon.MessageType.INFO);//Δεν Εκτελείται } Οι εντολές είναι σωστά γραμμένες - αν τις μεταφέρω σε άλλο σημείο του κώδικα (πχ. στην createAndShowGUI() ) εκτελούνται κανονικά. Μέσα από την incoming() όμως όχι. Μπορεί να καταλάβει κανείς το γιατί?
virxen75 Δημοσ. 9 Ιανουαρίου 2010 Δημοσ. 9 Ιανουαρίου 2010 δοκίμασε μετά από κάθε εντολή που λες ότι δεν εκτελείται να βάζεις ένα System.out.println("yes"); αν το εμφανίσει εκτελείται απλά κάνεις κάτι λάθος αλλού π.χ. δεν βρίσκει το image εκει που του λες να ψάξει.
Aristeidisp Δημοσ. 9 Ιανουαρίου 2010 Μέλος Δημοσ. 9 Ιανουαρίου 2010 δοκίμασε μετά από κάθε εντολή που λες ότι δεν εκτελείταινα βάζεις ένα System.out.println("yes"); To έχω κάνει χωρίς επιτυχία. Τα system.out εκτελούνται, οι άλλες εντολές όχι. αν το εμφανίσει εκτελείται απλά κάνεις κάτι λάθος αλλούπ.χ. δεν βρίσκει το image εκει που του λες να ψάξει. Το βρίσκει το image, αν βάλω αλλού την εντολή λειτουργεί κανονικά με το ανανεωμένο image. Εμφανίζει και το Notification. Δεν μπορώ να καταλάβω γιατί δεν λειτουργεί... Νομίζω ότι δεν κάνω κάτι σωστά με τα declarations των μεταβλητών και των συναρτήσεων. Έχω δοκιμάσει ένα σωρό παραλαγές, static/non-static, private, synchronized, αλλά δεν βλέπω φως για αυτό είπα να στείλω! Σε ένα παράδειγμα κλάσης που διάβασα για trayicons έλεγε ο προγραμματιστής "Προσοχή: κάντε initialize ένα thread για την μεταβολή της κατάστασης του trayicon." Το δοκίμασα χωρίς αποτέλεσμα αν και έχω την εντύπωση ότι αυτό ήτανε απαραίτητο μόνο επειδή δεν ήταν Main class file αλλά java class. Τι κάνω λάθος άραγε?!?!?!
Aristeidisp Δημοσ. 14 Ιανουαρίου 2010 Μέλος Δημοσ. 14 Ιανουαρίου 2010 Ευχαριστώ ΠΑΡΑ ΠΟΛΥ τον virxen75 για την βοήθεια και την λύση που βρήκε στο πρόβλημα που είχα! Θα επανέλθω με νέες απορίες στην java!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.