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

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
User avatar
Tomahawk
Mbyte level
Mbyte level
Posts: 536
Joined: Tue May 18, 2004 1:50 pm

Post by Tomahawk » Wed Dec 21, 2005 10:10 am

Δοκιμασε e.getSource() == checkbox
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Wed Dec 21, 2005 5:42 pm

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

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

Post by Tomahawk » Wed Dec 21, 2005 8:00 pm

Ψαξε στο online javadoc να δεις τι κανει η μεθοδος.Οπως λεει και στις διαφανειες ,που προτεινω να διαβασεις, καθε event εχει και καποιες μεθοδους που μπορεις να καλεσεις για να μαθεις καποια πραγματα για αυτο οπως απο ποιον εγινε fire αυτο το event.Ποιος το προκαλεσε.
Αλλιως γραψε εδω το κωδικα σου και σχολια για το τι θελεις να κανεις να το κοιταξω.Απο τις ερωτησεις που κανεις ειναι δυσκολο.
Επειδή μάλλον το είπα λάθος, εννοώ ότι δεν γίνεται να γράψουμε
public void actionPerformed(ActionEvent e)
και μετά
if(itemStateChanged==checkbox)
Πώς όμως πρέπει να το γράψουμε???
?????
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Wed Dec 21, 2005 10:03 pm

Αυτός είναι ο κώδικας

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Arithmetic extends JFrame implements ActionListener,ItemListener
{
Container cp;
JTextField tf;
JButton b;
JCheckBox c;
GridLayout g;


public static void main(String args[])
{
Arithmetic app=new Arithmetic();
app.setSize(400,300);
app.setVisible(true);
}
public Arithmetic()
{
super("Πράξεις");
cp=getContentPane();
g= new GridLayout(3,1);
cp.setLayout(g);



tf=new JTextField(20);
b= new JButton("Button");
b.addActionListener(this);
c=new JCheckBox("Αφαίρεση",false);
c.addItemListener(this);

cp.add(tf);
cp.add(b);
cp.add(c);
}
}

Τώρα τι πρέπει να κάνω ώστε αν πατήσω το κουμπί και το CheckBox είναι επιλεγμένο, το πλαίσιο κειμένου να γράφει "Είναι επιλεγμένο", ενώ αν δεν είναι να λέει δεν είναι επιλεγμένο.Όλα αυτά να είναι στο Listener του κομπιού (αν έχω κάποιο λάθος διόρθωσέ το)
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

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

Post by Tomahawk » Wed Dec 21, 2005 11:11 pm

Code: Select all

button.addMouseListener(new java.awt.event.MouseAdapter(){

     public void mousePressed(MouseEvent e){
          if(checkBox.isSelected()){
                textField.setText("Is Selected");
          }
          else textField.setText("Not Selected");
     }
});
Κατι τετοιο θες?
Προτιμω να χρησιμοποιησω anonymous class γιατι ειναι καλυτερο.Αν θες ντε και καλα να το κανεις με actionListener πρεπει να υλοποιησεις μια μεθοδο στο Frame (αφου κανει implement το interface) called actionPerformed.Μεσα σε αυτη να κοιταξεις με -> event.getSource() == button <- αν το event προηλθε απο το button και οχι απο κατι αλλο οπως το checkbox για παραδειγμα και τοτε να κανεις οτι γραφω παραπανω.
Αν εισαι σιγουρος οτι το θες ετσι πες μου να σου γραψω κατι χαρακτηριστικο.
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Thu Dec 22, 2005 9:14 pm

Αυτό που έψαχνα είναι αυτό που μου έγραψες, μόνο που όταν το γράφω αυτό εκτός από το mousePressed,μου ζητάει και το mouseReleased, το mouseExited, το mouseEntered και το mouseClicked. Δεν γίνεται να κάνω κάτι, ώστε να μη μου τα ζητάει όλα αυτά, αλλά να χρησιμοποιώ μόνο όποια μου χρειάζεται.??? :?:
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

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

Post by Tomahawk » Thu Dec 22, 2005 9:32 pm

Αποκλειεται να σου τα ζηταει.Ακριβως για αυτο το λογο εβαλα MouseAdapter και οχι MouseListener.Για περαιτερω εξηγησεις περι Adapters δες τις διαφανειες.

Απο το description της κλασης MouseAdapter :
<P>
* Extend this class to create a <code>MouseEvent</code> listener
* and override the methods for the events of interest. (If you implement the
* <code>MouseListener</code> interface, you have to define all of
* the methods in it. This abstract class defines null methods for them
* all, so you can only have to define methods for events you care about.)
* <P>
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Fri Dec 23, 2005 1:36 pm

OK...δικό μου λάθος.Ευχαριστώ πολύ για όλα!!! :-D
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

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

Post by Tomahawk » Fri Dec 23, 2005 2:11 pm

Anytime :P
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Tue Jan 10, 2006 8:40 pm

Λοιπόν έχω άλλη μία απορία. Γράφω

Code: Select all

Container cp=getContentPane();
και μου βγάζει σφάλμα cannot find symbol
symbol: method getContentPane();
location: class Main
Τι να κάνω??? :?:
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

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

Post by papo2 » Tue Jan 10, 2006 9:26 pm

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

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
User avatar
Einherjar
Venus Project Founder
Venus Project Founder
Posts: 3751
Joined: Tue Jan 27, 2004 4:42 pm
Academic status: Alumnus/a
Gender:
Location: Washington DC, USA
Contact:

Post by Einherjar » Tue Jan 10, 2006 11:14 pm

Βασικά δε μπορείς να το κάνεις να σταματήσει να νομίζει ότι είναι μέθοδος γιατί... είναι μέθοδος. Πρέπει να την καλέσεις μέσω ενός αντικειμένου τύπου π.χ. JFrame, JDialog κλπ. Πρέπει βέβαια να κάνεις και import το javax.swing.
Από το post σου διακρίνω μια έντονη επίδραση της c++ πάνω σου :-D
[Better to understand a little than to misunderstand a lot]
User avatar
Tomahawk
Mbyte level
Mbyte level
Posts: 536
Joined: Tue May 18, 2004 1:50 pm

Post by Tomahawk » Wed Jan 11, 2006 1:14 am

papo2 wrote:Λοιπόν έχω άλλη μία απορία. Γράφω

Code: Select all

Container cp=getContentPane();
και μου βγάζει σφάλμα cannot find symbol
symbol: method getContentPane();
location: class Main
Τι να κάνω??? :?:
Αν η κλαση ,μεσα στην οποια καλεις τη μεθοδο αυτη, ειναι JFrame (κανει δηλαδη extend τη JFrame) ,τοτε μπορεις να την καλεσεις ετσι ξερα.Αν κανεις λοιπον extend εχει η κλαση σου ολες τις μεθοδους του πατερα της (δηλαδη της JFrame) και συνεπως και την getContentPane() οποτε την καλεις χυμα (η αλλιως ετσι: this.getContentPane() ).Αν τωρα τον παραπανω κωδικα σου δεν τον εχεις μεσα σε κλαση που την παρεχει (πχ οπως το MyFrame extends JFrame) τοτε προφανως δεν βρισκει καπου τετοια μεθοδο.Οποτε οπως λεει και ο Einherjar πρεπει να την καλεσεις σε αντικειμενο που την παρεχει (px τυπου JFrame).Δηλαδη

Code: Select all

JFrame newFrame = new JFrame();
Container cp = newFrame.getContentPane();
Αν εχεις φτιαξει δικια σου κλαση τυπου JFrame πχ MyFrame τοτε (σε κωδικα ΕΚΤΟΣ της κλασης αυτης) γραφεις

Code: Select all

MyFrame newMyFrame = new MyFrame();
Container cp = newMyFrame.getContentPane();
αλλιως ,οπως ειπα παραπανω, στην ιδια κλαση οταν εισαι ,πχ στον κατασκευαστη του Frame σου γραφεις ειτε

Code: Select all

    public MyFrame(){
         Container cp = getContentPane();
         .......
    }
ειτε

Code: Select all

    public MyFrame(){
         Container cp = this.getContentPane();
         .......
    }
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Wed Jan 11, 2006 8:05 am

Παιδιά το λέω αυτό γιατί προσπαθώ να γράψω αυτό

Code: Select all

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class Main extends JFrame  {
                         
    JLabel picture;
    
    JTextField h;

JTextArea textArea;
 static JPanel buttonPane;

    public Main() {
        super("l");
        
        
        

        String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };

        //Create the combo box, select the item at index 4.
        //Indices start at 0, so 4 specifies the pig.
        JComboBox petList = new JComboBox(petStrings);
        petList.setSelectedIndex(4);
        

        //Set up the picture.
        picture = new JLabel();
        picture.setFont(picture.getFont().deriveFont(Font.ITALIC));
        picture.setHorizontalAlignment(JLabel.CENTER);
    
        picture.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));
       
        
        JPanel buttonPane = new JPanel();
         buttonPane.setLayout(new BoxLayout(buttonPane,
                                           BoxLayout.LINE_AXIS));
                         h=new JTextField(20);
                         add(h);
                        
                         buttonPane.add(h);
                        
                        
        

        //The preferred size is hard-coded to be the width of the
        //widest image and the height of the tallest image + the border.
        //A real program would compute this.
        picture.setPreferredSize(new Dimension(177, 122+10));

        //Lay out the demo.
        add(petList, BorderLayout.PAGE_START);
        add(picture, BorderLayout.PAGE_END);
        
    }

    
  

    

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Make sure we have nice window decorations.
        JFrame.setDefaultLookAndFeelDecorated(true);

        
        

        JFrame frame = new JFrame("ComboBoxDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
        frame.pack();
        frame.setVisible(true);
        contentPane.add(buttonPane);
        
        
       
    }
       

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    
   }
}
και θέλω να μου εμφανίζει ένα παράθυρο με το ComboBox και το Panel, αυτό όμως όταν το τρέχω εμφανίζει ένα άδειο παράθυρο. Τι να κάνω??? :?:
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

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

Post by papo2 » Wed Jan 11, 2006 6:26 pm

Εντάξει το βρήκα το αποπάνω όμως τώρα κολλάω κάπου αλλού. Έχω το εξής Panel

Code: Select all

JPanel buttonPane = new JPanel()
                         JComboBox petList = new JComboBox(petStrings);
                         petList.addItemListener(this);
                        petList.setSelectedIndex(4);
                        buttonPane.add(petList);
                        contentPane.add(buttonPane);


και θέλω όταν πατάω το δεύτερο στοιχείο του ComboBox να μου εμφανίζει ένα άλλο Panel χωρίς να εξαφανίζεται το προηγούμενο και γράφω

Code: Select all

JComboBox cb = (JComboBox)e.getSource();
                       if(cb.getSelectedIndex()==1)
    {
       JPanel Panel = new JPanel(); 
       field=new JTextField(20);
       JTextArea area= new JTextArea(45,4);
       buttonPane.add(h);
       buttonPane.add(o);
       contentPane.add(buttonPane);
    }

όμως ενώ τρέχω το πρόγραμμα όταν επιλέγω το 2ο στοιχείο δεν κάνει τίποτα, αυτό που έγραψα αποπάνω το κάνει μόνο αν εγώ πρώτα επιλέξω το 2ο στοιχείο και μετά απ' αυτό κάνω μεγιστοποίηση στο παράθυρο. Τι πρέπει να κάνω για βγάζει το δεύτερο Panel κανονικά και να μην κάνω την παραπάνω διαδικασία???? :?:
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
User avatar
Einherjar
Venus Project Founder
Venus Project Founder
Posts: 3751
Joined: Tue Jan 27, 2004 4:42 pm
Academic status: Alumnus/a
Gender:
Location: Washington DC, USA
Contact:

Post by Einherjar » Wed Jan 11, 2006 6:29 pm

Thanx για την επισήμανση Tomahawk.

papo2 στον κώδικά σου δε βλέπω να καλείς πουθενά τον κατασκευαστή όπου δημιουργείται το αντικείμενο buttonPane ή τουλάχιστον δε βλέπω την κλήση.

Η πιο ανώδυνη αλλαγή που θα μπορούσες να κάνεις θα ήταν στην μέθοδο createAndShowGUI να γράψεις

Code: Select all

private static void createAndShowGUI() {
        //Make sure we have nice window decorations.
        JFrame.setDefaultLookAndFeelDecorated(true);

       //ΠΡΟΣΘΕΤΕΙΣ ΤΟ ΠΑΡΑΚΑΤΩ
       new Main();

        JFrame frame = new JFrame("ComboBoxDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
        frame.pack();
        frame.setVisible(true);
        contentPane.add(buttonPane);
       
       
       
    } 
[Better to understand a little than to misunderstand a lot]
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Wed Jan 11, 2006 6:50 pm

Το πρόβλημα δεν είναι στο buttonPane αυτό λειτουργεί κανονικά. Το πρόβλημα είναι στο Panel το οποίο υπάρχει μέσα στην if. Αυτό είναι που δεν εμφανίζεται.
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

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

Post by papo2 » Thu Jan 12, 2006 7:26 pm

Καινούργια δυσκολία.... Λοιπόν φτιάχνω ένα JFrame

Code: Select all

fr=new JFrame("Frame");
        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        c=fr.getContentPane();
        text=new JTextField(10);
         JLabel label= new JLabel("Label");
         label.setLabelFor(text);
       fr.getContentPane().add(text);
       fr.getContentPane().add(label);
      fr.setDefaultLookAndFeelDecorated(true);
      fr.setLocation(100,100);
fr.setSize(200,200);
fr.setVisible(true);
fr.pack();
οταν όμως τρέχω το πρόγραμμα μου βγάζει ένα πολύ μικρό Frame (ακριβώς στο μέγεθος της Label) καμία σχέση με το μέγεθος που του δίνω,
και εμφανίζει μόνο τη Label, ενώ δεν υπάρχει πουθενά το textField. Τι να κάνω για να εμφανίζεται κανονικά??? :?:
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
User avatar
silegav
Venus Project Founder
Venus Project Founder
Posts: 2098
Joined: Tue Mar 09, 2004 4:03 pm
Academic status: Alumnus/a
Location: The Center of the World -> Piraeus

Post by silegav » Fri Jan 13, 2006 12:39 am

δες το layout. Νομίζω πως το default layout είναι αυτό που εμφανίζει σε μια σειρά ότι βάλεις. Δεν θυμάμαι τώρα ακριβώς ποια layouts είναι τι αλλά μπορείς να τα βρείς εδώ
User avatar
Einherjar
Venus Project Founder
Venus Project Founder
Posts: 3751
Joined: Tue Jan 27, 2004 4:42 pm
Academic status: Alumnus/a
Gender:
Location: Washington DC, USA
Contact:

Post by Einherjar » Fri Jan 13, 2006 12:52 am

Βγάλε το

Code: Select all

fr.pack();
[Better to understand a little than to misunderstand a lot]
papo2
byte level
byte level
Posts: 57
Joined: Fri Dec 16, 2005 9:03 pm
Location: Αθήνα

Post by papo2 » Fri Jan 13, 2006 8:43 pm

Εντάξει το βρήκα. Τελικά ο Layout Manager έφταιγε. Ευχαριστώ!!!!!!!! :-D
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

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

Post by papo2 » Mon Jan 16, 2006 11:50 pm

Well... now something new... Λοιπόν μια καινούργια απορία. Ψάχνω να βρω ένα τρόπο, για να μπορώ να συγκρίνω όσα γράφονται σε ένα PasswordField με το κείμενο που θα έχει μέσα μια μεταβλητή τύπου String.
Εγώ έχω δοκιμάσει μέχρι στιγμής το εξής : να βάλω ένα κουμπί και όταν το πατάω να κάνει τη σύγκριση

Code: Select all

JButton button=new JButton("button");
JPasswordField passwordField=new JPasswordField(10);
passwordField.addActionListener(this);
String s="something";
String string=String.valueOf(passwordField);

public void actionPerformed(ActionEvent e)
{
......................................
else if(e.getSource()==button)
{
if(string==s)
{
System.out.println("something");
}
else
{
System.out.println("something else");
}
}
και ενώ το μεταφράζει κανονικά όταν πατάω το κουμπί δεν κάνει τίποτα. Τι να κάνω για να δουλέψει κανονικά??? :?:
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»

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

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