Page 1 of 4
Βιβλία για Java και συμβουλές γiα Swing
Posted: Fri Dec 16, 2005 9:14 pm
by papo2
Γειά σας!!! Μήπως ξέρει κανείς κάποιο καλό εισαγωγικό βιβλίο για το Swing της Java ???
Posted: Sat Dec 17, 2005 1:38 am
by theo_
Καταρχήν Καλωσόρισες!!!
βιβλίο δεν ξέρω αλλά δεν νομίζω να χρειάζεται.. κ ειδικά για το Swing
δοκίμασε
αυτό
και παίξε με κάποιο IDE όπως NetBeans ή JBuilder γιατί προσφέρουν πολλές ευκολίες κ δεν χρειάζεται να γράψεις pure κώδικα
Posted: Sat Dec 17, 2005 10:47 pm
by papo2
Τώρα κάτι άσχετο... ένα σφάλμα που μου εμφανίζεται αρκετά συχνα κατα τη μετάφραση του κώδικα είναι "cannot resolve symbol" τι ακριβώς είναι και τι κάνουμε για να το διορθώσουμε
Posted: Sat Dec 17, 2005 11:35 pm
by Tomahawk
Σημαινει οτι χρησιμοποιεις μεταβλητη που δεν εχεις ορισει καπου πιο πανω στο κωδικα.
Posted: Sun Dec 18, 2005 2:37 am
by MyTHoS_
Μιας και ο τιτλος ειναι βιβλιο για Java να προτεινω το java network programming απο o'reilly για οσους ενδιαφερονται περι socket programming

Posted: Mon Dec 19, 2005 3:42 pm
by papo2
Λοιπόν.. αφού ξεφύγαμε από το θέμα να ρωτήσω και κάτι άλλο... Έχω γράψει ένα πρόγραμμα και ενώ μου κάνει κανονικά compile, όταν πάω να το τρέξω μου βγάζει το εξής :
" Exception in thread "main" java.lang.NullPointerException "
Τι πρέπει να κάνω ???
Posted: Mon Dec 19, 2005 4:03 pm
by tsilochr
papo2 wrote:Λοιπόν.. αφού ξεφύγαμε από το θέμα να ρωτήσω και κάτι άλλο... Έχω γράψει ένα πρόγραμμα και ενώ μου κάνει κανονικά compile, όταν πάω να το τρέξω μου βγάζει το εξής :
" Exception in thread "main" java.lang.NullPointerException "
Τι πρέπει να κάνω ???
DEBUG
(γιούπι, αυτή είναι η τεσσαρακοστή μου δημοσίευση!!!)

Posted: Mon Dec 19, 2005 4:15 pm
by papo2
Μήπως θα μπορούσες να γίνεις λίγο πιο συγκεκριμένος???
Posted: Mon Dec 19, 2005 4:42 pm
by Tomahawk
Η χρησιμοποιησε καποιο ide να κανεις debug το οποιο θα σου δειξει ακριβως σε ποια γραμμη του κωδικα πεταχτηκε το exception.
Αλλιως κοιτα το stacktrace που σου τυπωνει στη κονσολα και πηγαινε στη κομματι του κωδικα που σου δειχνει η πρωτη γραμμη στη κονσολα μετα απο αυτη που σου λεει οτι το excepption ειναι nullpointer.Εκει πρεπει να κοιταξεις καλα τη γραφεις και να καταλαβεις τι πεταει το exception και γιατι.Συνηθως καλεις μεθοδο σε αντικειμενο που ειναι null.Η προσθετεις σε δομη που χρησιμοποιεις νεο αντικειμενο που ειναι null.Ψαξε στο source αρχειο αυτης της κλασης (τη κλαση της δομης δηλαδη πχ HashMap) και δες ποια μεθοδο πεταει nullpointerexception.Τα source αρχεια (.java) ολης της βιβλιοθηκης της java βρισκεται στο φακελο του jdk (πχ c:\program files\java\jdk1.5.0_04\src.zip) και λεγεται src.zip.
Αν δεν μπορεις να δεις απο τη κονσολα σε ποιο σημειο πεταγετε το exception μπορεις να κανεις το πιο πρωτογονο debugging που ειναι να βαζεις εντολες system.out.println("something to make you understand"); παντου στο κωδικα σου και ετσι να καταλαβεις που κολλησε.
Πιο συγκεκριμενα με χρηση IDE εδω :
http://www.netbeans.org/kb/41/using-netbeans/debug.html
Posted: Mon Dec 19, 2005 10:20 pm
by papo2
Βρήκα τι έφταιγε όμως έπρεπε να διαγράψω το πρώτο if και όταν το έτρεξα (χωρίς το if) δεν έκανε τις πράξεις, έβζαζε ένα κατεβατό με το σφάλμα NumberFormatException. Τι πρέπει να κάνω για να τρέξει κανονικά και να μην το αλλάξω πολύ.
Έχω όμως να ρωτήσω και κάτι άλλο, συγνώμη που γίνομαι κουραστικός, τι πρέπει να κάνω αν σε μία εφαρμογή έχω ένα κουμπί και ένα πλαίσιο ελέγχου ώστε να του πω, πως για να εκτελεστεί ότι είναι προγραμματισμένο να κάνει το πλαίσιο ελέγχου θα πρέπει να πατήσω το κουμπί, δηλαδή μέχρι να το πατήσω δεν θα εκτελείται ότι λέει το πλαίσιο ελέγχου, είται είναι επιλεγμένο, είτε όχι.
Αυτός είναι ο κώδικας του προγράμματος πιο είναι το λάθος και πώς διορθώνεται? επίσης αν κάνεις compile όπως είναι θα βγάλει αυτό
"Note: Arithmetic.java uses or overrides a deprecated API.
Note: Recompile with -deprecation for details"
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Arithmetic extends JFrame
{
Container cp;
JTextField tf,tf1,tf2;
JCheckBox b;
JLabel l,l1,l2,l3;
JPanel p,p1;
boolean flag=true;
String s,s1,s2,s3;
int sum,dif,dim;
GridLayout g;
JButton b1;
public static void main(String args[])
{
Arithmetic app=new Arithmetic();
app.setSize(300,200);
app.setVisible(true);
}
public Arithmetic()
{
super("Πράξεις");
CheckRadioHandler handler=new CheckRadioHandler();
cp=getContentPane();
g= new GridLayout(3,1);
cp.setLayout(g);
if(flag)
{
flag=true;
b1.setLabel("Πρόσθεση");
}
else
{
flag=false;
b1.setLabel("Αφαίρεση");
}
p=new JPanel();
l=new JLabel("Δώστε έναν αριθμό ");
tf=new JTextField(20);
l1=new JLabel("Δώστε έναν άλλο αριθμό ");
tf1=new JTextField(20);
l2=new JLabel("Το αποτέλεσμα είναι ");
tf2=new JTextField(20);
b1=new JButton("Πρόσθεση");
p.add(l);
p.add(tf);
p.add(l1);
p.add(tf1);
p.add(l2);
p.add(tf2);
p.add(b1);
p1=new JPanel();
l3=new JLabel("Η πράξη που θα γίνει είναι ");
b=new JCheckBox("Πρόσθεση",false);
b.addItemListener(handler);
p1.add(l3);
p1.add(b);
}
private class CheckRadioHandler implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
if(e.getStateChange()==ItemEvent.SELECTED)
{
s=String.valueOf(tf);
s1=String.valueOf(tf1);
sum=Integer.parseInt(s);
dif=Integer.parseInt(s1);
dim=sum-dif;
s2=String.valueOf(dim);
tf2.setText(s2);
}
else
{
if(e.getStateChange()==ItemEvent.DESELECTED)
{
s=String.valueOf(tf);
s1=String.valueOf(tf1);
sum=Integer.parseInt(s);
dif=Integer.parseInt(s1);
dim=sum+dif;
s2=String.valueOf(dim);
tf2.setText(s2);
}
}
};
}
}
Posted: Mon Dec 19, 2005 10:45 pm
by Tomahawk
Το προβλημα ειναι οτι καλεις την setLabel στα buttons.Αυτες οι μεθοδοι ειναι deprecated.Αλλαξε τις κλησεις αυτες με την setText().
Επισης παρακατω λες "αν το flag ειναι true -> καντο true"
Code: Select all
if(flag)
{
flag=true;
b1.setLabel("Πρόσθεση");
}
else
{
flag=false;
b1.setLabel("Αφαίρεση");
}
αλλαξε το με αυτο :
Code: Select all
if(flag)
{
b1.setLabel("Πρόσθεση");
}
else
{
b1.setLabel("Αφαίρεση");
}
Posted: Mon Dec 19, 2005 11:11 pm
by papo2
Όταν το άλλαξα, κατα την εκτέλεση μου πετάει πάλι την εξαίρεση NullPointerException. Τώρα τι κάνω???
Ακριβώς λέει: Exception in thread "main" java.lang.NullPointerException
at Arithmetic.<init>(Arithmetic.java:34)
at Arithmetic.main(Arithmetic.java:20)
Posted: Tue Dec 20, 2005 1:06 am
by Tomahawk
Αυτο ειναι γιατι καλεις μεθοδο σε αντικειμενο που ειναι null οπως ειπα και παραπανω οτι ειναι το συνηθες λαθος .Το b1 αρχικοπειται αργοτερα στο κωδικα.Εσυ καλεις την setText στο b1 και αυτο ειναι null.Βαζε ολες τις αρχικοποιησεις μαζι με τις δηλωσεις στην αρχη αρχη της κλασης.Μην αφηνεις κανενα null.Μετα μεσα στον κατασκευαστη αρχιζεις να κατασκευαζεις το frame σου.
Posted: Tue Dec 20, 2005 9:47 am
by papo2
Ευχαριστώ!!! Τωρα δουλεύει κανονικά.Όταν όμως του δώσω τους αριθμούς και πατήσω να γίνει η πράξη μου πετάει μια εξαίρεση NumberFormatException ,η οποία είναι για λάθος μετατροπή αλφαριθμητικού δελομένου σε αριθμητικό. Εμένα μου φαίνεται σωστή η μετατροπή, εσείς βλέπετε κάποιο λάθος???
Posted: Tue Dec 20, 2005 12:00 pm
by Tomahawk
Πρεπει να προστατεψεις τις integer.parseInt κλησεις οι οποιες και πετανε το numberformatexception.Με try catch blocks.
Επισης ΔΕΝ χρειαζεται να γραψεις String.valueOf οταν περνεις τη τιμη απο το textfield.Αυτη ειναι ουτως η αλλως string ("" αν δενεχει βαλει τπτ).Πετα αυτη τη τιμη κατευθειαν στην integer.parseint και προσπαθησε να πιασεις το exception που ειπαμε παραπανω το οποιο πεταγετε οταν...
Δες στο src.zip την κλαση Integer.java στο java.lang φακελο.
Posted: Tue Dec 20, 2005 1:34 pm
by papo2
Ευχαριστώ!!! Τώρα δουλεύει κανονικά. Πιο πάνω όμως είχα ρωτήσει πώς γίνεται αν έχω ένα κουμπί και ένα πλαίσιο ελέγχου, να ρυθμίσω το πρόγραμμα έτσι ώστε για να γίνει ότι είναι προγραμματισμένο να κάνει το πλαίσιο ελέγχου, είτε είναι επιλεγμένο είτε όχι, να πρέπει να πατήσω το κουμπί, αλλιώς, μέχρι να το πατήσω, το πλαάσιο ελέγχου να μην εκτελεί το event που είναι να κάνει.??
Posted: Tue Dec 20, 2005 7:49 pm
by papo2
Επειδή μάλλον φαίνεται περίπλοκο όπως το είπα πριν ας δώσω ένα παράδειγμα: Στο πλαίσιο διαλόγου Γραμματοσειρά υπάρχουν λίστες, πλαίσια ελέγχου κτλ... όλα αυτά, που έχεις επιλέξει, για να εφαρμοστούν στο κείμενο θα πρέπει να πατήσεις το κουμπί ΟΚ.Αυτό που θέλω να μάθω είναι,πώς γίνεται αυτό, δηλαδή για να εφαρμοστεί ό,τι λέει το πλαίσιο ελέγχου, να πρέπει να πατήσω το κουμπί...???
Posted: Tue Dec 20, 2005 9:27 pm
by Tomahawk
Εγω παντως θελω λιγο παραπανω εξηγηση για να καταλαβω ακριβως τη κατασταση.Αν θες ξανακανε μια πιο αναλυτικη προσπαθεια.
Posted: Tue Dec 20, 2005 10:28 pm
by papo2
Ωραία... Ας αναφέρω ξανά το παράθυρο διαλόγου Γραμματοσειρά που υπάρχει στα Windows. Αυτό το παράθυρο έχει κουμπιά, πλαίσια ελέγχου, λίστες κτλ... Εκεί κάνεις τις ρυθμίσεις που θέλεις για το κείμενο. Ό,τι επιλέξεις από τις λίστες, τα πλαίσια ελέγχου και τα άλλα, δεν εφαρμόζονται απευθείας στο κείμενο. Πρέπει πρώτα να πατήσεις ένα κουμπί (ΟΚ), αλλιώς ό,τι και αν έχεις επιλέξει δεν πρόκειται να εφαρμοστεί.
Αυτό που ρωτάω εγώ είναι: τι πρέπει να κάνουμε εμείς σε ένα δικό μας πρόγραμμα έτσι ώστε να γίνεται το ίδιο με αυτό στη Γραμματοσειρά.
Δηλαδή να έχω ένα κουμπί το οποίο να το πατάω και έτσι να εκτελείται ότι είναι προγραμματισμένο να κάνει το πλαίσιο ελέγχου,η λίστα κτλ...???
Posted: Tue Dec 20, 2005 10:54 pm
by Tomahawk
Μα οτι κανεις ο αλλος στη λιστα και στα αλλα δεν εχουν αμεση εφαρμογη απο μονα τους.Εκτος αν βαλεις listeners και κανεις κατι μολις αλλαξει καποιος κατι η επιλεξει απο τη λιστα κτλ.Εσυ απλα δεν κανεις τιποτα το ουσιαστικο.Αυτο που κανεις ειναι μονο οταν πατησει το ΟΚ.Τοτε πηγαινεις και περνεις απο τη λιστα πιο ειναι επιλεγμενο,απο το texfeild τι ειναι τυπωμενο,απο το checkbox πιο ειναι τικ-αρισμενο κτλ κτλ και κανεις συνολικα οτι θες.
Αυτο που θελω να πω ειναι οτι το να πειραξεις κατι απο τις λιστες ,η όποιο απο τα αλλα, ΕΧΟYΝ εφαρμογη ΜΟΝΟ αν τους πεις εσυ να κανουν κατι.Οποτε δεν τους λες και τα κανεις ολα στον listener του OK.
Αλλη σκεψη ειναι να εχεις μια global boolean μεταβλητη.Αρχικα ειναι false.Οι λιστες και τα αλλα που κανουν καποια δουλεια τι κανουν ΜΟΝΟ αν η τιμη ειναι true.Αρα οσο η τιμη ειναι false δεν κανουν τιποτα.Εδω μπαινει το κουμπι ΟΚ.Βαλε αυτο να αλλαζει την boolean τιμη σε true.Οποτε μετα οταν τρεξει αυτο που κανει η λιστα για παραδειγμα θα βρει την τιμη true και ολα οκ.
Ακομα μπορεις πατωντας το ΟΚ και αλλαζοντας την τιμη να κανεις fire/invoke τις μεθοδους που τρεχουν η λιστα κτλ.
Η λιστα πχ να λεει:
List_Listener(event e){
if ( canDoMyWork ) callMyMethodThatDoesMyListStuff();
}
ControlPanel_Listener(event e){
if ( canDoMyWork ) callMyMethodThatDoesMyPanelStuff();
}
OkButtonListener_mousePressed(mouseevent e){
//button was pressed so change flag to true and call methods
canDoMyWork = true;
callMyMethodThatDoesMyListStuff();
callMyMethodThatDoesMyPanelStuff();
}
Posted: Tue Dec 20, 2005 11:04 pm
by papo2
Το κουμπί όμως έχει ActioListener ενώ το CheckBox έχει ItemListener.
Πώς μπορώ να τα συνδυάσω???
Posted: Wed Dec 21, 2005 7:55 am
by papo2
Επειδή μάλλον το είπα λάθος, εννοώ ότι δεν γίνεται να γράψουμε
public void actionPerformed(ActionEvent e)
και μετά
if(itemStateChanged==checkbox)
Πώς όμως πρέπει να το γράψουμε???