Kapws Δημοσ. 3 Απριλίου 2011 Δημοσ. 3 Απριλίου 2011 Καλησπέρα παιδιά, έχω μία εργασία για τη σχολή , θεωρητικά αρκετά εύκολη , αλλά πρακτικά κάπου έχω σκαλώσει. Το project έχεις ως εξής.... Θέλουμε ο χρήστης να εισάγει σε ένα από τα 3 "κουτάκια" , ακτίνα , περίμετρο, εμβαδόν (προφανώς ένα από τα 3 κάθε φορά) και να του βρίσκει τα άλλα 2. Αυτό που έχω φτιάξει ως τώρα είναι : > package javaapplication4; /** Inner Class - eponimi * * @author metro */ import java.awt.*; import javax.swing.*; import java.awt.event.*; class CircleCalc extends JFrame { JTextField akt1 = new JTextField("0", 5); JTextField emb1 = new JTextField("0", 5); JTextField per1 = new JTextField("0", 5); JButton akt2 = new JButton("Aktina"); JButton emb2 = new JButton("Embadon"); JButton per2 = new JButton("Perimetros"); JLabel akt = new JLabel("Aktina"); JLabel emb = new JLabel("Embadon"); JLabel per = new JLabel("Perimetros"); ActionListener handler =new ButtonHandler(); public CircleCalc() { super("Circle Calc"); super.setResizable(false); setSize(400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container pane = getContentPane(); FlowLayout flow = new FlowLayout(); pane.setLayout(flow); akt1.addActionListener(handler); emb1.addActionListener(handler); per1.addActionListener(handler); pane.add(akt); pane.add(akt1); pane.add(emb); pane.add(emb1); pane.add(per); pane.add(per1); pane.add(akt2); pane.add(emb2); pane.add(per2); setContentPane(pane); setVisible(true); } public static void main(String[] arguments) { CircleCalc frame = new CircleCalc(); } class ButtonHandler implements ActionListener { public void actionPerformed(ActionEvent evt) { try { int value1 = Integer.parseInt(akt1.getText()); int value2 = Integer.parseInt(emb1.getText()); int value3 = Integer.parseInt(per1.getText()); if (evt.getSource()==akt2) { emb1.setText("" + (3*value1*value1)); per1.setText("" + (2*3*value1)); } else if (evt.getSource()==per2) { akt1.setText("" + (value3/(2*3))); emb1.setText("" + ((value3*value3)/(4*3))); } else if (evt.getSource()==emb2) { akt1.setText("" + (sqrt(value2/3))); per1.setText("" + (sqrt(4*value2*3))); } } catch (NumberFormatException exc) { akt1.setText("0"); per1.setText("0"); emb1.setText("0"); } } private String sqrt(double d) { throw new UnsupportedOperationException("Not yet implemented"); } } } Το πρόβλημα που έχω με την άσκηση αυτή είναι ότι ενώ βάζω τιμή στο αντίστοιχο κουτάκι και πατάω το κουμπί για να κάνει την πράξη και να μου εμφανίζει το αποτέλεσμα , τα κουτάκια συνεχίζουν να έχουν μηδενική τιμή , σαν να μην έγινε τίποτε απολύτως. Τί μπορεί να φταίει, δώστε μου τα φώτα σας. Ευχαριστώ εκ των προτέρων! Edit: Στις πράξεις το "π" το έκανα 3 στρογγυλο ώστε να αποκλείσω τυχόν άλλα προβλήματα.
Kapws Δημοσ. 3 Απριλίου 2011 Μέλος Δημοσ. 3 Απριλίου 2011 Tελικά αφού ξεστραβώθηκα βρήκα το πρόβλημα το οποίο ήτα εδώ: > akt1.addActionListener(handler); emb1.addActionListener(handler); per1.addActionListener(handler); Όπου αντί για 1 που έχω τώρα , έπρεπε να βάλω 2. Το θέμα όμως τώρα είναι ότι τα αποτελέσματα που μου βγάζει είναι λίγο ό,τι να ναι. Πως θα το κάνω να βγάζει 2 δεκαδικά ψηφία (δοκίμασα να το κάνω double αλλά δεν έβγαλα άκρη).
santeron Δημοσ. 4 Απριλίου 2011 Δημοσ. 4 Απριλίου 2011 Κατ' αρχάς όπου έχεις διαίρεση μεταβλητής με ακέραιο να χρησιμοποιείς τελεία μηδέν (δλδ. 2.0 αντί 2) γιατί αλλιώς μπορεί να σου κόψει τα δεκαδικά. Για να κάνεις format του αριθμού δες εδώ. Αν χρειαστείς κάτι άλλο που μπορώ να βοηθήσω πες... Tελικά αφού ξεστραβώθηκα βρήκα το πρόβλημα το οποίο ήτα εδώ: > akt1.addActionListener(handler); emb1.addActionListener(handler); per1.addActionListener(handler); Όπου αντί για 1 που έχω τώρα , έπρεπε να βάλω 2. Το θέμα όμως τώρα είναι ότι τα αποτελέσματα που μου βγάζει είναι λίγο ό,τι να ναι. Πως θα το κάνω να βγάζει 2 δεκαδικά ψηφία (δοκίμασα να το κάνω double αλλά δεν έβγαλα άκρη). Επίσης συμβουλή για την δική σου ψυχική ηρεμία να χρησιμοποιείς καλύτερο ονοματολογία στα αντικείμενα/μεταβλητές σου. Αν έχεις όρεξη ρίξε μία ματιά εδώ http://java.about.com/od/javasyntax/a/nameconventions.htm. Απλά αν ακολουθείς αυτές τις συμβουλές δεν θα είχες το πρόβλημα που σου έτυχε με το actionListener...
santeron Δημοσ. 4 Απριλίου 2011 Δημοσ. 4 Απριλίου 2011 Διαφοροποίησα λίγο τον κώδικα σου για να είναι πιο καθαρός. Δεν είναι η σωστότερη υλοποίηση που υπάρχει σε Java αλλά νομίζω θα είναι πιο ξεκάθαρη στο τι κάνει. Αρχικά δεν χρησιμοποίησα διαφορετική class για τον ActionListener αλλά το έκανα implement στην ίδια. Άλλαξα τα ονόματα των μεταβλητών σε κάτι πιο κατανοητό. Σου έβαλα το decimalFormat που ήθελες και έχω βάλει ένα σχόλιο αν δεις που είναι αρκετά σημαντικό για να μην χτυπάει Double.valueof(). Χρησιμοποίησα τις έτοιμες μεθόδους τις Java για την ρίζα (Math.sqrt()), το τετράγωνο (Math.pow()) και για το "π" (Math.PI). Αν θέλεις κάποια βοήθεια με τον κώδικα πες μου. Τρέχει κανονικά το έχω δοκιμάσει. Αν ήθελες να το κάνεις πιο "σωστό" αντί για τρία κουμπιά θα έβαζα jRadioButtons και ένα jButtonGroup επιτρέποντας κάθε φορά στον χρήστη να γράφει μόνο στο jTextbox που αντιστοιχεί στο jRadioButton κάνοντας disable το editable των άλλων δύο ή σε κάτι πιο "extreme" να έβαζες actionListeners πάνω στα jTextBoxes και να κάνει για κάθε keyTyped άμεσα τον υπολογισμό των άλλων δύο. >package javaapplication4; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; import javax.swing.*; /** Inner Class - eponimi * * @author metro */ public class CircleCalc extends JFrame implements ActionListener { JTextField txtAktina = new JTextField("0", 5); JTextField txtEmvadon = new JTextField("0", 5); JTextField txtPerimetros = new JTextField("0", 5); JButton btnAktina = new JButton("Ακτίνα"); JButton btnEmvadon = new JButton("Εμβαδόν"); JButton btnPerimetros = new JButton("Περίμετρος"); JLabel lblAktina = new JLabel("Ακτίνα"); JLabel lblEmvadon = new JLabel("Εμβαδόν"); JLabel lblPerimetros = new JLabel("Περίμετρος"); public CircleCalc() { super("Circle Calc"); super.setResizable(false); setSize(400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container pane = getContentPane(); FlowLayout flow = new FlowLayout(); pane.setLayout(flow); btnAktina.addActionListener(this); btnEmvadon.addActionListener(this); btnPerimetros.addActionListener(this); pane.add(lblAktina); pane.add(txtAktina); pane.add(lblEmvadon); pane.add(txtEmvadon); pane.add(lblPerimetros); pane.add(txtPerimetros); pane.add(btnAktina); pane.add(btnEmvadon); pane.add(btnPerimetros); setContentPane(pane); setVisible(true); } public static void main(String[] args) { CircleCalc frame = new CircleCalc(); } public void actionPerformed(ActionEvent evt) throws NumberFormatException { try { double aktina = 0, emvadon = 0, perimetros = 0; //Used an English locale because the Double.valueOf("").getText() //needs a "." for decimal point. NumberFormat nf = NumberFormat.getNumberInstance(Locale.ENGLISH); DecimalFormat df = (DecimalFormat) nf; if (evt.getSource() == btnAktina) { aktina = Double.valueOf(txtAktina.getText()); emvadon = Math.PI * Math.pow(aktina, 2); perimetros = 2.0 * Math.PI * aktina; txtEmvadon.setText(df.format(emvadon)); txtPerimetros.setText(df.format(perimetros)); } else if (evt.getSource() == btnEmvadon) { emvadon = Double.valueOf(txtEmvadon.getText()); aktina = Math.sqrt(emvadon / Math.PI); perimetros = 2.0 * Math.PI * aktina; txtAktina.setText(df.format(aktina)); txtPerimetros.setText(df.format(perimetros)); } else if (evt.getSource() == btnPerimetros) { perimetros = Double.valueOf(txtPerimetros.getText()); aktina = perimetros / (2.0 * Math.PI); emvadon = Math.PI * Math.pow(aktina, 2); txtAktina.setText(df.format(aktina)); txtEmvadon.setText(df.format(emvadon)); } } catch (NumberFormatException e) { System.out.println(e); txtAktina.setText("0"); txtPerimetros.setText("0"); txtEmvadon.setText("0"); } } }
Kapws Δημοσ. 5 Απριλίου 2011 Μέλος Δημοσ. 5 Απριλίου 2011 Σε ευχαριστώ πάρα πολύ τόσο για το χρόνο σου όσο και για τις συμβουλές/λύσεις που μου έδωσες!! Που θα πάει θα τη συνηθίσω τη ριμάδα τη java Μελέτη θέλει και άγιος ο Θεός!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.