nik324 Δημοσ. 9 Ιανουαρίου 2014 Δημοσ. 9 Ιανουαρίου 2014 Ο κωδικας ειναι ο εξής //Class A public class A extends JFrame implements ActionListener{ private JPanel contentPane; JButton aButton; JButton bButton; public A() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); aButton = new JButton("A"); aButton.addActionListener(this); aButton.setBounds(57, 94, 97, 25); contentPane.add(aButton); bButton = new JButton("B"); bButton.addActionListener(this); bButton.setBounds(289, 94, 97, 25); contentPane.add(bButton); setVisible(true); } @Override public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if( src == aButton ){ System.out.println("Button A"); } } } //------------------------- // Class B public class B extends A{ B(){ } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if( src == bButton ){ System.out.println("Button B from class B"); } } } //-------------------- //class C public class C extends A{ C(){ } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if( src == bButton ){ System.out.println("Button B from class C"); } } } Αυτο που κανω ειναι να δημιουργω 2 κουμπια στην class Α η οποια κληρονομειται απο την B και C. Αυτο που θελω να κανω ειναι η υλοποιηση της actionPerformed στην κλαση Α να ειναι μονο για το button A και επομενος και για new B και new C το button A συμπεριφερεται με τον ιδιο τροπο. Η υλοιποιηση της actionPerformed για τον Button B να ειναι διαφορετικη και αναλογη με το αν εχουμε κανει new B η new C. Το προβλημα ειναι οτι γινεται override απο τα actionPerformed των υποκλασεων και επομενος το actionPerformed της κλασης Α "χανεται". Σκεφτηκα να δημιουργω το button b σε καθε υποκλαση ξεχωριστα αλλα αυτο ειναι ενα απλοποιησμενο παραδειγμα ενος μεγαλυτερου project που εχουμε 40 κουμπια και επομενος θα επαναλαμβανεται τεραστιος κωδικας χωρις λογο - εκτος και αν ειναι αναγκαιο. Ευχαριστω πολυ και ελπιζω αν μην μπερδεψα .
Timonkaipumpa Δημοσ. 9 Ιανουαρίου 2014 Δημοσ. 9 Ιανουαρίου 2014 Βάλε μία μέθοδο για το button A και αναλόγως ποιος κάνει το action θα καλείς είτε την μέθοδο για το button A είτε την μέθοδο για το button B. Δηλαδή: if (src == aButton) methodForAButton; else methodForbButton;
nik324 Δημοσ. 10 Ιανουαρίου 2014 Μέλος Δημοσ. 10 Ιανουαρίου 2014 Αποτελεί όμως αυτο σωστή προγραμματιστικη τεχνικη η υπαρχει καλυτερος τροπος;
georgemarios Δημοσ. 10 Ιανουαρίου 2014 Δημοσ. 10 Ιανουαρίου 2014 class C extends A{ C(){ } public void actionPerformed(ActionEvent e) { Object src = e.getSource(); if( src == bButton ){ System.out.println("Button B from class C"); } else{ super.actionPerformed(e); } } } To ιδιο και για το Β, ουσιαστικα αν δεις πως δεν κανεις τιποτα στην overriden μεθοδο, πασαρεις τον ελεγχο στη μεθοδο του μπαμπα μηπως και θελει αυτη να κανει κατι (στη περιπτωση σου, να ελεγξει το κουμπι Α)
Timonkaipumpa Δημοσ. 10 Ιανουαρίου 2014 Δημοσ. 10 Ιανουαρίου 2014 Αποτελεί όμως αυτο σωστή προγραμματιστικη τεχνικη η υπαρχει καλυτερος τροπος; Μία χαρά είναι. Εφόσον η κλάση A ακούει για ένα event και εξετάζει το source του event, είναι αρκετά σωστό να κάνει handle του action που θα κάνει αναλόγως το source. Ακόμα πιο σωστό θα ήταν να χρησιμοποιήσεις interface, μιας η κλάση σου θα έχει κάποιες μεθόδους για interface στην κυριολεξία. Επίσης, consider να κάνεις χρήση κανενός pattern.. π.χ. servant ή visitor (που όπως το βλέπω, μάλλον το visitor θες).
nik324 Δημοσ. 15 Ιανουαρίου 2014 Μέλος Δημοσ. 15 Ιανουαρίου 2014 Για να μη ανοιγω αλλο θεμα, καμια ιδιεα για το τι μπορει να ειναι το παρακατω error? Το προτζεκτ που κανω ειναι μπερδεμενο και δεν μπορω να ρωτησω κατι πιο συγκεκριμενο...Τ error εχει να κανει με serialization java.io.InvalidClassException: my_package.my_class; local class incompatible: stream classdesc serialVersionUID = -8421120321119169144, local class serialVersionUID = 2833535179733956769 at java.io.ObjectStreamClass.initNonProxy(Unknown Source) at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) at java.io.ObjectInputStream.readClassDesc(Unknown Source) at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at my_package.my_class.my_function_name(my_class.java:112) at my_packege2.my_class.actionPerformed(MMC.java:276) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.setPressed(Unknown Source) at javax.swing.AbstractButton.doClick(Unknown Source) at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source) at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEventImpl(Unknown Source) at java.awt.EventQueue.access$200(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα