SpirosG86 Δημοσ. 12 Μαΐου 2008 Δημοσ. 12 Μαΐου 2008 Έχω ένα πρόβλημα σε μια εργασία που παραδίδω, έχω ένα έτοιμο applet που κάνει μία εργασία αλλά θέλω να το "περιορίσω" σε ένα παραθυράκι συγκεκριμένων διαστάσεων ώστε να βάλω στο παράθυρο από δίπλα κουμπιά και επιλογές που θα διαμορφώνουν διαφορετικό αποτέλεσμα στο δίπλα παράθυρο (της εργασίας). Συγκεκριμένα ο κώδικας είναι ο εξής: >/* This applet lets the user draw colored polygons. The user inputs a polygon by clicking a series of points. Clicking near the starting point (within 2 pixels) or right-clicking (or Command-clicking) will complete the polygon, so the user can begin a new one. Shift-clicking will clear the screen. Up to 500 points are allowed in a polygon. This applet does not keep a copy of the image on the screen, so it will not reappear if the applet is covered and then uncovered. */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class test1 extends JApplet { public void init() { // This simple init() method just creates a drawing surface // belonging to the nested class Display and uses it for // the content pane of the applet. (This is one case where // it is rather silly to use a JApplet rather than a plain // old Applet!) setContentPane( new Display() ); } class Display extends JPanel implements MouseListener { /* Variables for implementing polygon input. */ private int[] xCoord, yCoord; // Arrays containing the points of // the polygon. Up to 500 points // are allowed. private int pointCt; // The number of points that have been input. private Color polygonColor = Color.red; // Color that is used to draw the polygons. public Display() { // Initialize the applet. The applet listens for mouse events. // Arrays are created to hold the points. A drawing surface // belonging to the nested class Display is created and // used as the drawing surface for the applet. setBackground(Color.white); addMouseListener(this); xCoord = new int[500]; yCoord = new int[500]; pointCt = 0; } public void paintComponent(Graphics g) { // The paintComponent() routine just draws a 1-pixel black // border around the applet. Polygons drawn on the applet // are not permanent. super.paintComponent(g); // Fills with background color, white. g.setColor(Color.black); g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); g.drawRect(1, 1, getWidth() - 3, getHeight() - 3); } private void putLine(int x1, int y1, int x2, int y2) { // Draw a line from (x1,y1) to (x2,y2) directly onto this // component, without going through the paintComponent() // method. Graphics g = getGraphics(); g.drawLine(x1,y1,x2,y2); g.dispose(); } private void putPolygon() { // Draw the polygon described by the arrays xCoord and yCoord // and the integer pointCt. A filled polygon with a black // outline is drawn. If pointCt is 0 or 1, nothing is drawn. // If pointCt is 2, only a black line is drawn. if (pointCt < 2) return; Graphics g = getGraphics(); if (pointCt == 2) { g.drawLine(xCoord[0], yCoord[0], xCoord[1], yCoord[1]); } else { g.setColor(Color.red); g.fillPolygon(xCoord, yCoord, pointCt); g.setColor(Color.black); g.drawPolygon(xCoord, yCoord, pointCt); } g.dispose(); } public void mousePressed(MouseEvent evt) { // Process a user mouse-click. if (evt.isShiftDown()) { // Clear the applet. (This only requires a repaint.) // Also, set pointCt to zero to start a new polygon. pointCt = 0; repaint(); } else if ( pointCt > 0 && (Math.abs(xCoord[0] - evt.getX()) <= 2) && (Math.abs(yCoord[0] - evt.getY()) <= 2) ) { // User has clicked near the starting point. // Draw the polygon and reset pointCt so that the // user can start a new polygon. putPolygon(); pointCt = 0; } else if (evt.isMetaDown() || pointCt == 500) { // Draw the polygon and reset pointCt so that the // user can start a new polygon. Note that there // is a limit of 500 points for one polygon. putPolygon(); pointCt = 0; } else { // Add the point where the user clicked to the list of // points in the polygon, and draw a line between the // previous point and the current point. A line can // only be drawn if there are at least two points. xCoord[pointCt] = evt.getX(); yCoord[pointCt] = evt.getY(); pointCt++; if (pointCt >= 2) { putLine(xCoord[pointCt-2], yCoord[pointCt-2], xCoord[pointCt-1], yCoord[pointCt-1]); } } } // end mousePressed() public void mouseReleased(MouseEvent evt) { } public void mouseClicked(MouseEvent evt) { } public void mouseEntered(MouseEvent evt) { } public void mouseExited(MouseEvent evt) { } } // end nested class Display } // end class SimplePolygons Επειδή δεν έχω καταλάβει πώς ακριβώς λειτουργούν τα applets και παρουσιάζω την εργασία την Παρασκευή(τον παραπάνω κώδικα τον έχω καταλάβει), δεν έχω το περιθώριο χρόνου να ασχοληθώ αποκλειστικά μόνος μου(δυστυχώς τα σημερινά πανεπιστήμια δεν φροντίζουν να μας μάθουν προγραμματισμό, προτιμούν να αναλώνονται σε θεωρητικά υπόβαθρα και περιμένουν από εμάς να μαθαίνουμε προγραμματισμό μέσω της θείας φώτισης - ή της φουσκωμένης τσέπης...) μπορεί κάποιος να βοηθήσει; Πρέπει να ενσωματώσω το applet κάπου που θα υπάρχουν και οι επιλογές ή οι επιλογές πρέπει να ενσωματωθούν μέσα στο applet; Πώς θα μπορούσα να κάνω κάτι τέτοιο; Για να βοηθήσω όσους θέλουν να βοηθήσουν, το αποτέλεσμα θέλω να είναι έτσι: Επειδή οποιαδήποτε άλλη προσπάθεια από μέρους μου έχει αποβεί αδιέξοδη, οποιαδήποτε βοήθεια που θα με βάλει τουλάχιστον σε ένα σκεπτικό για να δουλέψω είναι ευπρόσδεκτη. Είναι απαράδεκτο σε ολόκληρο πανεπιστήμιο να "μαθαίνουμε" Java με slides σε προβολέα ΧΩΡΙΣ εργαστήρια και να περιμένουν αποτελέσματα από τους φοιτητές, θα μπορούσα να επεκταθώ πολύ για την κατάσταση της επιστήμης της πληροφορικής σε ακαδημαϊκό επίπεδο στην Ελλάδα, αλλά θα βγω εκτός θέματος...
Bspus Δημοσ. 12 Μαΐου 2008 Δημοσ. 12 Μαΐου 2008 Πρεπει υποχρεωτικα να φαινεται μεσα απο browser η αρκει να δουλευει και stand-alone? Δηλαδη να την τρεχεις ετσι απλως και να δουλευει. Για τη δευτερη περιπτωση ο πιο απλος τροπος ειναι να προσθεσεις ενα frame στην applet σου σαν attribute και μια main() που να το δημιουργει, εμφανιζει και τοποθετει την applet πανω στο ιδιο. Καταλαβαινω οτι δεν ειναι και πολυ ευκολο να το φανταστεις αυτο .Το frame να ανηκει, δηλαδη να ειναι κομματι της applet και ομως η applet να τοποθετειται πανω του, ακουγεται παραδοξο αλλα λειτουργει. Ενα παραδειγμα υπαρχει εδω http://www.wutka.com/hackingjava/ch13.htm Εννοειται οτι στο κομματι του frame που δεν ειναι αφιερωμενο στην applet βαζεις ο,τι θες οποτε λυνεται το προβλημα σου Αν θες τα κουμπια να ειναι μεσα στην applet ομως απλως τα βαζεις μεσα και φροντιζεις να μην "ζωγραφιζεις" πανω τους. Ενα αλλο παραδειγμα με κουμπια ειναι εδω http://www.java2s.com/Code/Java/Swing-JFC/Puttingbuttonsonanapplet.htm Το βαζει και αυτος ολο το applet σε frame αλλα δεν ειναι υποχρεωτικο.
Γηρυόνης Δημοσ. 12 Μαΐου 2008 Δημοσ. 12 Μαΐου 2008 Θα πρέπει να χωρίσεις την applet χρησιμοποιώντας έναν layout manager (o εξ ορισμού είναι ο FlowLayout) και μετά να προσθέσεις τουλάχιστον δύο διαφορετικά panels πάνω στον layout manager. Το ένα θα περιέχει το γράφημα και το άλλο θα περιέχει τα κομβία που θέλεις. http://java.sun.com/docs/books/tutorial/uiswing/layout/using.html
SpirosG86 Δημοσ. 14 Μαΐου 2008 Μέλος Δημοσ. 14 Μαΐου 2008 Ευχαριστώ για τις απαντήσεις... @ Bspus, πρεπει να δουλευει stand-alone. Να τρέχει δηλαδή σαν ξεχωριστό προγραμματάκι, όχι μέσα από browser. Από τις δύο αυτές απαντήσεις κατάλαβα πως υπάρχουν διάφοροι τρόποι υλοποίησης... Δεν θέλω τα κουμπιά να είναι μέσα στο Applet, αλλά να επηρεάζουν οι τιμές τους την εκτέλεσή του. Κατέβασα το Netbeans 6.1, που είναι κάτι σαν visual editor της java από όσο βλέπω.. θα το κοιτάξω και θα σας πω. ----Λοιπόν εφτιαξα κάτι σαν JFrame και έχω βάλει ένα JPanel μέσα. Έχω και το JApplet με τον παραπάνω κώδικα σε ένα JApplet Form χωριστό. Αυτό που θέλω να κάνω είναι να το βάλω μέσα στο JPanel, ώστε να φαίνεται μέσω του JFrame.
SpirosG86 Δημοσ. 16 Μαΐου 2008 Μέλος Δημοσ. 16 Μαΐου 2008 Έπιασα σήμερα τον καθηγητή και κατάλαβα μερικά πράγματα σχετικά με την ιεραρχία των αντικειμένων της Java... Έφτιαξα λοιπόν ένα JFrame με 2 JPanels, στο ένα έβαλα τον προηγούμενο κώδικα προσαρμοσμένο σε διαφορετική class, και στο άλλο τον κώδικα με τις επιλογές (JRadioButtons, JButtons). Όσο ο κώδικας του δεύτερου JPanel ήταν στην main class του JFrame, όλα λειτουργούσαν καλά, θέλοντας όμως να χωρίσω και αυτό το JPanel σε δική του class, αντιμετωπίζω το παρακάτω πρόβλημα: Όταν τρέχω την εφαρμογή, προβάλλεται το JFrame με το JPanel του σχεδιασμού, ενώ το δεύτερο δεν προβάλλεται κανονικά (στη θέση του υπάρχει γκρι φόντο). Τί κάνω λάθος, τί πρέπει να προσθέσω στον κώδικα του δεύτερου JPanel? Παραθέτω παρακάτω τα κομμάτια του κώδικα. Main class JPanels (Το JFrame που περιέχει τα 2 JPanels) > import java.awt.*; import javax.swing.*; public class JPanels extends JFrame { public static void main(String[] args) { new JPanels(); } public JPanels() { super("Line and Polygon Design"); Container content = getContentPane(); content.setBackground(Color.lightGray); JPanel Display = new JPanel(); [color="Green"]//Display είναι το JPanel σχεδιασμού[/color] content.add(new Display(), BorderLayout.WEST); JPanel ControlArea = new JPanel(); [color="Green"]//ControlArea είναι το JPanel επιλογών[/color] content.add(new ControlArea(), BorderLayout.EAST); setSize(800,600); setVisible(true); } } class ControlArea (Το JPanel επιλογών που εμφανίζεται λανθασμένο) >import java.awt.*; import javax.swing.*; public class ControlArea extends JPanel { public ControlArea() { [color="Green"] // εδώ προσπάθησα να βάλω έναν Container αντί της επόμενης εντολής, // αλλά δεν εφαρμόζεται το getContentPane (μου λέει να το // αντικαταστήσω με το getRootPane που βγάζει το ίδιο αποτέλεσμα)...[/color] JPanel ControlArea = new JPanel(new GridLayout(6, 1)); JButton Cut = new JButton("Cut"); ControlArea.add(Cut); String[] backcolors = { "Red", "Green", "Blue", "Black", "White", "Gray" }; ControlArea.add(new SixChoicePanel("Background Color", backcolors)); String[] fillcolors = { "Red", "Green", "Blue", "Black", "White", "Gray" }; ControlArea.add(new SixChoicePanel("Fill Color", fillcolors)); String[] colors = { "Red", "Green", "Blue", "Black", "White", "Gray" }; ControlArea.add(new SixChoicePanel("Line Color", colors)); String[] thicknesses = { "1", "2", "3", "4", "5", "6" }; ControlArea.add(new SixChoicePanel("Line Thickness", thicknesses)); JButton Clear = new JButton("Clear"); ControlArea.add(Clear); setPreferredSize(new Dimension(200,0)); setVisible(true); } } Για να βοηθήσω περισσότερο, είχα αυτόν τον κώδικα και αυτό που δεν μπόρεσα να κάνω είναι να "χωρίσω" το JPanel από το JFrame και να το βάλω στη δική του class, ώστε να το καλέσω από το JFrame όπως καλώ και το JPanel του σχεδιασμού. Ορίστε και ο κώδικας με το JPanel επιλογών ενσωματωμένο στο JFrame. SixChoicePanel είναι ένα επιπλέον JPanel που δημιουργεί κουτιά επιλογών με έναν "αλγοριθμικό" τρόπο. >import java.awt.*; import javax.swing.*; public class JPanels extends JFrame { public static void main(String[] args) { new JPanels(); } public JPanels() { super("Using JPanels with Borders"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); content.setBackground(Color.lightGray); JPanel controlArea = new JPanel(new GridLayout(3, 1)); String[] colors = { "Red", "Green", "Blue", "Black", "White", "Gray" }; controlArea.add(new SixChoicePanel("Color", colors)); String[] thicknesses = { "1", "2", "3", "4", "5", "6" }; controlArea.add(new SixChoicePanel("Line Thickness", thicknesses)); String[] fontSizes = { "10", "12", "14", "18", "24", "36" }; controlArea.add(new SixChoicePanel("Font Size", fontSizes)); content.add(controlArea, BorderLayout.EAST); JPanel drawingArea = new JPanel(); // Preferred height is irrelevant, since using WEST region drawingArea.setPreferredSize(new Dimension(400, 0)); drawingArea.setBorder(BorderFactory.createLineBorder (Color.blue, 2)); drawingArea.setBackground(Color.white); content.add(drawingArea, BorderLayout.WEST); pack(); setVisible(true); } }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.