Βιβλία για Java και συμβουλές γiα Swing

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Βιβλία για Java και συμβουλές γiα Swing

Post by papo2 » Fri Dec 16, 2005 9:14 pm

Γειά σας!!! Μήπως ξέρει κανείς κάποιο καλό εισαγωγικό βιβλίο για το Swing της Java ???
Last edited by papo2 on Tue Dec 20, 2005 10:52 pm, edited 1 time in total.
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
theo_
Venus Project Founder
Venus Project Founder
Posts: 488
Joined: Wed Apr 21, 2004 12:00 am
Location: a world without time

Post by theo_ » Sat Dec 17, 2005 1:38 am

Καταρχήν Καλωσόρισες!!!
βιβλίο δεν ξέρω αλλά δεν νομίζω να χρειάζεται.. κ ειδικά για το Swing
δοκίμασε αυτό
και παίξε με κάποιο IDE όπως NetBeans ή JBuilder γιατί προσφέρουν πολλές ευκολίες κ δεν χρειάζεται να γράψεις pure κώδικα
People are never more insecure than when they become obsessed with their fears at the expense of their dreams
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Sat Dec 17, 2005 10:47 pm

Τώρα κάτι άσχετο... ένα σφάλμα που μου εμφανίζεται αρκετά συχνα κατα τη μετάφραση του κώδικα είναι "cannot resolve symbol" τι ακριβώς είναι και τι κάνουμε για να το διορθώσουμε
Last edited by papo2 on Tue Dec 20, 2005 10:52 pm, edited 1 time in total.
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
User avatar
Tomahawk
Mbyte level
Mbyte level
Posts: 536
Joined: Tue May 18, 2004 1:50 pm

Post by Tomahawk » Sat Dec 17, 2005 11:35 pm

Σημαινει οτι χρησιμοποιεις μεταβλητη που δεν εχεις ορισει καπου πιο πανω στο κωδικα.
User avatar
MyTHoS_
byte level
byte level
Posts: 64
Joined: Wed Oct 12, 2005 12:20 am
Location: Wondering In The Dead FoReSt..
Contact:

Post by MyTHoS_ » Sun Dec 18, 2005 2:37 am

Μιας και ο τιτλος ειναι βιβλιο για Java να προτεινω το java network programming απο o'reilly για οσους ενδιαφερονται περι socket programming :)
Image
In DaRk Forests I wonder
where Silence lives
and darkness devours the sun..
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Mon Dec 19, 2005 3:42 pm

Λοιπόν.. αφού ξεφύγαμε από το θέμα να ρωτήσω και κάτι άλλο... Έχω γράψει ένα πρόγραμμα και ενώ μου κάνει κανονικά compile, όταν πάω να το τρέξω μου βγάζει το εξής :
" Exception in thread "main" java.lang.NullPointerException "
Τι πρέπει να κάνω ???
Last edited by papo2 on Tue Dec 20, 2005 10:53 pm, edited 1 time in total.
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Mon Dec 19, 2005 4:03 pm

papo2 wrote:Λοιπόν.. αφού ξεφύγαμε από το θέμα να ρωτήσω και κάτι άλλο... Έχω γράψει ένα πρόγραμμα και ενώ μου κάνει κανονικά compile, όταν πάω να το τρέξω μου βγάζει το εξής :
" Exception in thread "main" java.lang.NullPointerException "
Τι πρέπει να κάνω ???
DEBUG


(γιούπι, αυτή είναι η τεσσαρακοστή μου δημοσίευση!!!) :smt041
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Mon Dec 19, 2005 4:15 pm

Μήπως θα μπορούσες να γίνεις λίγο πιο συγκεκριμένος???
Last edited by papo2 on Tue Dec 20, 2005 10:54 pm, edited 1 time in total.
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
User avatar
Tomahawk
Mbyte level
Mbyte level
Posts: 536
Joined: Tue May 18, 2004 1:50 pm

Post by Tomahawk » Mon Dec 19, 2005 4:42 pm

Η χρησιμοποιησε καποιο 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
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Mon Dec 19, 2005 10:20 pm

Βρήκα τι έφταιγε όμως έπρεπε να διαγράψω το πρώτο 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);
}
}
};
}
}
Last edited by papo2 on Tue Dec 20, 2005 10:51 pm, edited 1 time in total.
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
User avatar
Tomahawk
Mbyte level
Mbyte level
Posts: 536
Joined: Tue May 18, 2004 1:50 pm

Post by Tomahawk » Mon Dec 19, 2005 10:45 pm

Το προβλημα ειναι οτι καλεις την 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("Αφαίρεση");
} 
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Mon Dec 19, 2005 11:11 pm

Όταν το άλλαξα, κατα την εκτέλεση μου πετάει πάλι την εξαίρεση NullPointerException. Τώρα τι κάνω???
Ακριβώς λέει: Exception in thread "main" java.lang.NullPointerException
at Arithmetic.<init>(Arithmetic.java:34)
at Arithmetic.main(Arithmetic.java:20)
Last edited by papo2 on Tue Dec 20, 2005 10:54 pm, edited 1 time in total.
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
User avatar
Tomahawk
Mbyte level
Mbyte level
Posts: 536
Joined: Tue May 18, 2004 1:50 pm

Post by Tomahawk » Tue Dec 20, 2005 1:06 am

Αυτο ειναι γιατι καλεις μεθοδο σε αντικειμενο που ειναι null οπως ειπα και παραπανω οτι ειναι το συνηθες λαθος .Το b1 αρχικοπειται αργοτερα στο κωδικα.Εσυ καλεις την setText στο b1 και αυτο ειναι null.Βαζε ολες τις αρχικοποιησεις μαζι με τις δηλωσεις στην αρχη αρχη της κλασης.Μην αφηνεις κανενα null.Μετα μεσα στον κατασκευαστη αρχιζεις να κατασκευαζεις το frame σου.
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Tue Dec 20, 2005 9:47 am

Ευχαριστώ!!! Τωρα δουλεύει κανονικά.Όταν όμως του δώσω τους αριθμούς και πατήσω να γίνει η πράξη μου πετάει μια εξαίρεση NumberFormatException ,η οποία είναι για λάθος μετατροπή αλφαριθμητικού δελομένου σε αριθμητικό. Εμένα μου φαίνεται σωστή η μετατροπή, εσείς βλέπετε κάποιο λάθος???
Last edited by papo2 on Tue Dec 20, 2005 10:55 pm, edited 1 time in total.
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
User avatar
Tomahawk
Mbyte level
Mbyte level
Posts: 536
Joined: Tue May 18, 2004 1:50 pm

Post by Tomahawk » Tue Dec 20, 2005 12:00 pm

Πρεπει να προστατεψεις τις integer.parseInt κλησεις οι οποιες και πετανε το numberformatexception.Με try catch blocks.
Επισης ΔΕΝ χρειαζεται να γραψεις String.valueOf οταν περνεις τη τιμη απο το textfield.Αυτη ειναι ουτως η αλλως string ("" αν δενεχει βαλει τπτ).Πετα αυτη τη τιμη κατευθειαν στην integer.parseint και προσπαθησε να πιασεις το exception που ειπαμε παραπανω το οποιο πεταγετε οταν...
Δες στο src.zip την κλαση Integer.java στο java.lang φακελο.
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Tue Dec 20, 2005 1:34 pm

Ευχαριστώ!!! Τώρα δουλεύει κανονικά. Πιο πάνω όμως είχα ρωτήσει πώς γίνεται αν έχω ένα κουμπί και ένα πλαίσιο ελέγχου, να ρυθμίσω το πρόγραμμα έτσι ώστε για να γίνει ότι είναι προγραμματισμένο να κάνει το πλαίσιο ελέγχου, είτε είναι επιλεγμένο είτε όχι, να πρέπει να πατήσω το κουμπί, αλλιώς, μέχρι να το πατήσω, το πλαάσιο ελέγχου να μην εκτελεί το event που είναι να κάνει.??
Last edited by papo2 on Tue Dec 20, 2005 10:56 pm, edited 1 time in total.
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Tue Dec 20, 2005 7:49 pm

Επειδή μάλλον φαίνεται περίπλοκο όπως το είπα πριν ας δώσω ένα παράδειγμα: Στο πλαίσιο διαλόγου Γραμματοσειρά υπάρχουν λίστες, πλαίσια ελέγχου κτλ... όλα αυτά, που έχεις επιλέξει, για να εφαρμοστούν στο κείμενο θα πρέπει να πατήσεις το κουμπί ΟΚ.Αυτό που θέλω να μάθω είναι,πώς γίνεται αυτό, δηλαδή για να εφαρμοστεί ό,τι λέει το πλαίσιο ελέγχου, να πρέπει να πατήσω το κουμπί...???
Last edited by papo2 on Tue Dec 20, 2005 10:56 pm, edited 1 time in total.
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
User avatar
Tomahawk
Mbyte level
Mbyte level
Posts: 536
Joined: Tue May 18, 2004 1:50 pm

Post by Tomahawk » Tue Dec 20, 2005 9:27 pm

Εγω παντως θελω λιγο παραπανω εξηγηση για να καταλαβω ακριβως τη κατασταση.Αν θες ξανακανε μια πιο αναλυτικη προσπαθεια.
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Tue Dec 20, 2005 10:28 pm

Ωραία... Ας αναφέρω ξανά το παράθυρο διαλόγου Γραμματοσειρά που υπάρχει στα Windows. Αυτό το παράθυρο έχει κουμπιά, πλαίσια ελέγχου, λίστες κτλ... Εκεί κάνεις τις ρυθμίσεις που θέλεις για το κείμενο. Ό,τι επιλέξεις από τις λίστες, τα πλαίσια ελέγχου και τα άλλα, δεν εφαρμόζονται απευθείας στο κείμενο. Πρέπει πρώτα να πατήσεις ένα κουμπί (ΟΚ), αλλιώς ό,τι και αν έχεις επιλέξει δεν πρόκειται να εφαρμοστεί.
Αυτό που ρωτάω εγώ είναι: τι πρέπει να κάνουμε εμείς σε ένα δικό μας πρόγραμμα έτσι ώστε να γίνεται το ίδιο με αυτό στη Γραμματοσειρά.
Δηλαδή να έχω ένα κουμπί το οποίο να το πατάω και έτσι να εκτελείται ότι είναι προγραμματισμένο να κάνει το πλαίσιο ελέγχου,η λίστα κτλ...???
Last edited by papo2 on Tue Dec 20, 2005 10:59 pm, edited 1 time in total.
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
User avatar
Tomahawk
Mbyte level
Mbyte level
Posts: 536
Joined: Tue May 18, 2004 1:50 pm

Post by Tomahawk » Tue Dec 20, 2005 10:54 pm

Μα οτι κανεις ο αλλος στη λιστα και στα αλλα δεν εχουν αμεση εφαρμογη απο μονα τους.Εκτος αν βαλεις 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();
}
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Tue Dec 20, 2005 11:04 pm

Το κουμπί όμως έχει ActioListener ενώ το CheckBox έχει ItemListener.
Πώς μπορώ να τα συνδυάσω???
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Wed Dec 21, 2005 7:55 am

Επειδή μάλλον το είπα λάθος, εννοώ ότι δεν γίνεται να γράψουμε
public void actionPerformed(ActionEvent e)
και μετά
if(itemStateChanged==checkbox)
Πώς όμως πρέπει να το γράψουμε???
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
Post Reply

Return to “Προγραμματισμός”