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

Java - object και classes ερώτηση (static)


Aristeidisp

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

Δημοσ.

Χαιρετώ και μπαίνω στο θέμα,

 

Java:

Έχω μια κλάση (Client) που δημιουργεί ένα αντικείμενο trayicon και παρέχει και μια μέθοδο (incoming() )για τη μεταβολή της κατάστασης του trayicon.

Θέλω από τη μέθοδο notice() μιας άλλης κλάσης (ClientImpl) να καλέσω την incoming() και να μεταβάλω το status του trayicon αντικειμένου που δημιουργήθηκε νωρίτερα.

Το πρόβλημα που αντιμετωπίζω είναι ότι από άλλη κλάση δεν μπορώ να μεταβάλλω το αρχικό αντικείμενο (non-static).

 

Δοκίμασα να διαγράφω το αρχικό trayicon και να δημιουργώ άλλο. Εκτός από το ότι είναι overkill σαν τεχνική δεν λειτουργεί κιόλας η εντολή "tray.remove(trayIcon);"

 

Εν κατακλείδι, ξέρει κάποιος αν υπάρχει τρόπος να μεταβάλλω την κατάσταση ενός αντικειμένου από μέθοδο άλλης κλάσης από αυτήν που δημιουργήθηκε το αντικείμενο?

 

Ελπίζω να ήμουν σαφής

Ευχαριστώ

Δημοσ.

καλύτερα θα ήταν αν έστελνες ένα μικρό παράδειγμα σε java

και πάνω εκεί να ρωτήσεις συγκεκριμμένα ,ώστε να καταλάβουμε τι θες

ακριβώς.

Δημοσ.

Ήθελα να το κρατήσω σε απλό επίπεδο αλλά οκ.

 

Τα σχετικά κομμάτια της κλάσης 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 από άλλη κλάση. Τώρα που τα έγραψα έτσι, πάλι έχω πρόβλημα.

Δημοσ.

O μόνος τρόπος για να αλλάξεις ένα attribute μια κλάσης απο μία άλλη είναι να δημιουργήσεις ένα instance της κλάσης που θέλεις να αλλάξεις. Απο αυτό το instance καλείς τον mutator (function για να αλλάξει attributes σε μια κλάση - στη περιπτωση σου: incoming()).

 

Αλλιώς σπας τους κανόνες encapsulation. Τώρα υπάρχει και η περίπτωση στην οποία ένα attribute είναι static.

 

Σε αυτήν την περίπτωση δεν χρειάζεται να δημιουργήσεις instance της κλάσης. Τα static attributes ειναι προσβάσιμα από παντού καλώντας ClassName.attributeName.

Δημοσ.

Θα σας απασχολήσω ξανά:

 

Δεν φαίνεται να είναι αυτό το πρόβλημα - θα γίνω πιο συγκεκριμένος.

 

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() όμως όχι.

 

Μπορεί να καταλάβει κανείς το γιατί?

Δημοσ.

δοκίμασε μετά από κάθε εντολή που λες ότι δεν εκτελείται

να βάζεις ένα System.out.println("yes");

 

αν το εμφανίσει εκτελείται απλά κάνεις κάτι λάθος αλλού

π.χ. δεν βρίσκει το image εκει που του λες να ψάξει.

Δημοσ.
δοκίμασε μετά από κάθε εντολή που λες ότι δεν εκτελείται

να βάζεις ένα 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.

 

Τι κάνω λάθος άραγε?!?!?!

Δημοσ.

Ευχαριστώ ΠΑΡΑ ΠΟΛΥ τον virxen75 για την βοήθεια και την λύση που βρήκε στο πρόβλημα που είχα!

 

Θα επανέλθω με νέες απορίες στην java!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...