Title: 2-Δ Γραφικά στη Java Post by: Faidon on October 10, 2007, 20:38:02 pm Καταρχήν να δηλώσω πλήρη άγνοια... Δεν ξέρω πως κάνεις Γραφικά στη Java. Προσπαθώ με την κλάση Graphics μέσα σε ένα Frame, αλλά αντιμετωπίζω το εξής πρόβλημα:
Μόλις το παράθυρο του Frame χαθεί από την οθόνη ότι έχω ζωγραφίσει χάνεται... Παρακάτω είναι ο κώδικας... Και επισυνάπτω το πρόγραμμα σε μορφή JAR. Όποιος γνωρίζει!! Βοήθεια!! Μήπως υπάρχει άλλος τρόπος για δημιουργία γραφικών; package test; import java.awt.*; import java.awt.event.*; public class PaintDemo { Graphics geg; public static void main(String[] args) { PaintDemo paintdemo=new PaintDemo(); paintdemo.init(); } void init(){ Frame f = new Frame("PaintDemo!"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.setSize(500,500); f.show(); geg=f.getGraphics(); geg.drawLine(50,50,100,200); f.addMouseMotionListener(new MouseMotionHandler()); } class MouseMotionHandler extends MouseMotionAdapter { public void mouseDragged(MouseEvent e) { int x = e.getX(); int y = e.getY(); geg.setColor(Color.black); geg.drawArc(x,y,2,2,0,360); } } } Title: Re: 2-Δ Γραφικά στη Java Post by: Aurelius on October 10, 2007, 20:41:48 pm Γιατι το κανεις στην java? Δεν πιστευω για καμια εργασια της σχολης?
Title: Re: 2-Δ Γραφικά στη Java Post by: Faidon on October 10, 2007, 20:50:59 pm Όχι δεν το κάνω για εργασία. Και πού να το κάνω; PHP δεν ξέρω...
Title: Re: 2-Δ Γραφικά στη Java Post by: eeVoskos on October 10, 2007, 21:28:20 pm Χμ... δοκίμασα να το κάνω με jpanel μέσα στο frame, αλλά ούτε αυτό δούλεψε.
Βρήκα όμως με λίγο ψάξιμο αυτό (http://forum.java.sun.com/thread.jspa?threadID=5223582) το thread στο forum της Java με παρόμοιο πρόβλημα. Ελπίζω να σε βοηθήσει. Αν δε βρεις άκρη, από αύριο θα το ψάξω. Title: Re: 2-Δ Γραφικά στη Java Post by: Aurelius on October 10, 2007, 21:32:32 pm Αν ηταν σε εργασια και ηθελες κατι απλο θα μπορουσες στο Ματλαμπ. Γι αυτο σε ρωτησα.
Title: Re: 2-Δ Γραφικά στη Java Post by: Faidon on October 10, 2007, 21:37:46 pm Χμ... δοκίμασα να το κάνω με jpanel μέσα στο frame, αλλά ούτε αυτό δούλεψε. Βρήκα όμως με λίγο ψάξιμο αυτό (http://forum.java.sun.com/thread.jspa?threadID=5223582) το thread στο forum της Java με παρόμοιο πρόβλημα. Ελπίζω να σε βοηθήσει. Αν δε βρεις άκρη, από αύριο θα το ψάξω. Ο.Κ. θα το κοιτάξω. Ευχαριστώ!! Αν ηταν σε εργασια και ηθελες κατι απλο θα μπορουσες στο Ματλαμπ. Γι αυτο σε ρωτησα. Α, όχι. Απλά θέλω να μάθω να δημιουργώ γραφικά! Title: Re: 2-Δ Γραφικά στη Java Post by: kostas578 on October 10, 2007, 21:42:31 pm Για Java2D: http://java.sun.com/docs/books/tutorial/2d/TOC.html
Δεν έχω ασχοληθεί με 2D αλλά μάλλον το κάνει repaint() και γι αυτό χάνονται τα σημεία. Με μια γρήγορη ματιά στον κώδικα: Το JFrame.show() είναι deprecated και έχει αντικατασταθεί με το setVisible(true) Για να κάνει exit το πρόγραμμα με το κλείσιμο του παραθύρου αρκεί το: setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Title: Re: 2-Δ Γραφικά στη Java Post by: Faidon on October 11, 2007, 00:08:09 am Εντάξει! Μάλλον το βρήκα. Aπό το link του eeVoskos κατάλαβα ότι ούτως ή άλλως πρέπει να κάνεις repaint ολόκληρο το component κάθε φορά που θες να αλλάξεις κάτι. Έτσι και εγώ δημιούργησα ένα Image, αλλάζω πάνω του ότι θέλω και το κάνω repaint στο Component και όλα ωραία και καλά (ελπίζω)!
Ευχαριστώ!!! Title: Re: 2-Δ Γραφικά στη Java Post by: eeVoskos on October 11, 2007, 09:49:11 am Δηλαδή (ενημερωτικά) αυτό που δείχνει στην ουσία το frame είναι ένα "στατικό" Image το οποίο συνεχώς αλλάζει όταν ζωγραφίζεις;;
Αλλά παραμένει στατικό και όταν δεν ζωγραφίζεις (αλλά π.χ. μετακινείς το παράθυρο) οπότε το frame εξακολουθεί να περιέχει το Image, ε; Title: Re: 2-Δ Γραφικά στη Java Post by: Faidon on October 11, 2007, 13:57:12 pm Όχι. Δεν είναι ακριβώς έτσι. Το πρόβλημα δηλαδή είναι στο "στατικό". Για να γίνει στατικό αυτό που θα ζωγραφίσεις πρέπει να το ζωγραφίσεις στο Component χρησιμοποιώντας την συνάρτηση repaint. Όλα τα άλλα που θα ζωγραφίσεις θα χάνονται μόλις χαθεί το παράθυρο. Οπότε ορίζεις το Component ως εξής:
p = new JPanel(){ public void paintComponent(Graphics g){ g.drawImage(image,0,0,this); } }; Και μετά καλείς κάπου την: p.repaint(); Οπότε εσύ αλλάζεις το Graphics του Image και το κάνεις repaint για να πάρει τη θέση του στο JPanel. Αυτό δηλαδή το χρησιμοποιείς επειδή για να αλλάξεις κάτι στο Graphics του JPanel (και να μείνει) πρέπει να το κάνεις μέσα στην paintComponent() και επειδή δε συμφέρει να βάλεις ένα σωρό ελέγχους μέσα στην paintComponent() για να εκτυπώνεται αντίστοιχά αυτό που θες το κάνεις έτσι. Τέλος δεν ξέρω γιατί αλλά πρέπει να ορίζεις την main() ως εξής: public static void main(String[] args){ SwingUtilities.invokeLater(new Runnable(){ public void run(){ new PaintDemo().init(); } }); } Αλλιώς βγαίνει ένα NullPointerException. Επισυνάπτω ένα παράδειγμα σε java και jar. |