Βιβλία για Java και συμβουλές γiα Swing
Ψαξε στο online javadoc να δεις τι κανει η μεθοδος.Οπως λεει και στις διαφανειες ,που προτεινω να διαβασεις, καθε event εχει και καποιες μεθοδους που μπορεις να καλεσεις για να μαθεις καποια πραγματα για αυτο οπως απο ποιον εγινε fire αυτο το event.Ποιος το προκαλεσε.
Αλλιως γραψε εδω το κωδικα σου και σχολια για το τι θελεις να κανεις να το κοιταξω.Απο τις ερωτησεις που κανεις ειναι δυσκολο.
Αλλιως γραψε εδω το κωδικα σου και σχολια για το τι θελεις να κανεις να το κοιταξω.Απο τις ερωτησεις που κανεις ειναι δυσκολο.
?????Επειδή μάλλον το είπα λάθος, εννοώ ότι δεν γίνεται να γράψουμε
public void actionPerformed(ActionEvent e)
και μετά
if(itemStateChanged==checkbox)
Πώς όμως πρέπει να το γράψουμε???
Αυτός είναι ο κώδικας
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 του κομπιού (αν έχω κάποιο λάθος διόρθωσέ το)
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 του κομπιού (αν έχω κάποιο λάθος διόρθωσέ το)
«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
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 για παραδειγμα και τοτε να κανεις οτι γραφω παραπανω.
Αν εισαι σιγουρος οτι το θες ετσι πες μου να σου γραψω κατι χαρακτηριστικο.
Αυτό που έψαχνα είναι αυτό που μου έγραψες, μόνο που όταν το γράφω αυτό εκτός από το mousePressed,μου ζητάει και το mouseReleased, το mouseExited, το mouseEntered και το mouseClicked. Δεν γίνεται να κάνω κάτι, ώστε να μη μου τα ζητάει όλα αυτά, αλλά να χρησιμοποιώ μόνο όποια μου χρειάζεται.??? 

«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
Αποκλειεται να σου τα ζηταει.Ακριβως για αυτο το λογο εβαλα MouseAdapter και οχι MouseListener.Για περαιτερω εξηγησεις περι Adapters δες τις διαφανειες.
Απο το description της κλασης MouseAdapter :
Απο το 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>
Λοιπόν έχω άλλη μία απορία. Γράφω
και μου βγάζει σφάλμα cannot find symbol
symbol: method getContentPane();
location: class Main
Τι να κάνω???
Code: Select all
Container cp=getContentPane();
symbol: method getContentPane();
location: class Main
Τι να κάνω???

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

«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
- Einherjar
- Venus Project Founder
- Posts: 3751
- Joined: Tue Jan 27, 2004 4:42 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Washington DC, USA
- Contact:
Βασικά δε μπορείς να το κάνεις να σταματήσει να νομίζει ότι είναι μέθοδος γιατί... είναι μέθοδος. Πρέπει να την καλέσεις μέσω ενός αντικειμένου τύπου π.χ. JFrame, JDialog κλπ. Πρέπει βέβαια να κάνεις και import το javax.swing.
Από το post σου διακρίνω μια έντονη επίδραση της c++ πάνω σου
Από το post σου διακρίνω μια έντονη επίδραση της c++ πάνω σου

[Better to understand a little than to misunderstand a lot]
Αν η κλαση ,μεσα στην οποια καλεις τη μεθοδο αυτη, ειναι JFrame (κανει δηλαδη extend τη JFrame) ,τοτε μπορεις να την καλεσεις ετσι ξερα.Αν κανεις λοιπον extend εχει η κλαση σου ολες τις μεθοδους του πατερα της (δηλαδη της JFrame) και συνεπως και την getContentPane() οποτε την καλεις χυμα (η αλλιως ετσι: this.getContentPane() ).Αν τωρα τον παραπανω κωδικα σου δεν τον εχεις μεσα σε κλαση που την παρεχει (πχ οπως το MyFrame extends JFrame) τοτε προφανως δεν βρισκει καπου τετοια μεθοδο.Οποτε οπως λεει και ο Einherjar πρεπει να την καλεσεις σε αντικειμενο που την παρεχει (px τυπου JFrame).Δηλαδηpapo2 wrote:Λοιπόν έχω άλλη μία απορία. Γράφωκαι μου βγάζει σφάλμα cannot find symbolCode: Select all
Container cp=getContentPane();
symbol: method getContentPane();
location: class Main
Τι να κάνω???
Code: Select all
JFrame newFrame = new JFrame();
Container cp = newFrame.getContentPane();
Code: Select all
MyFrame newMyFrame = new MyFrame();
Container cp = newMyFrame.getContentPane();
Code: Select all
public MyFrame(){
Container cp = getContentPane();
.......
}
Code: Select all
public MyFrame(){
Container cp = this.getContentPane();
.......
}
Παιδιά το λέω αυτό γιατί προσπαθώ να γράψω αυτό
και θέλω να μου εμφανίζει ένα παράθυρο με το ComboBox και το Panel, αυτό όμως όταν το τρέχω εμφανίζει ένα άδειο παράθυρο. Τι να κάνω??? 
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();
}
});
}
}

«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
Εντάξει το βρήκα το αποπάνω όμως τώρα κολλάω κάπου αλλού. Έχω το εξής Panel
και θέλω όταν πατάω το δεύτερο στοιχείο του ComboBox να μου εμφανίζει ένα άλλο Panel χωρίς να εξαφανίζεται το προηγούμενο και γράφω
όμως ενώ τρέχω το πρόγραμμα όταν επιλέγω το 2ο στοιχείο δεν κάνει τίποτα, αυτό που έγραψα αποπάνω το κάνει μόνο αν εγώ πρώτα επιλέξω το 2ο στοιχείο και μετά απ' αυτό κάνω μεγιστοποίηση στο παράθυρο. Τι πρέπει να κάνω για βγάζει το δεύτερο 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 κανονικά και να μην κάνω την παραπάνω διαδικασία????

«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
- Einherjar
- Venus Project Founder
- Posts: 3751
- Joined: Tue Jan 27, 2004 4:42 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Washington DC, USA
- Contact:
Thanx για την επισήμανση Tomahawk.
papo2 στον κώδικά σου δε βλέπω να καλείς πουθενά τον κατασκευαστή όπου δημιουργείται το αντικείμενο buttonPane ή τουλάχιστον δε βλέπω την κλήση.
Η πιο ανώδυνη αλλαγή που θα μπορούσες να κάνεις θα ήταν στην μέθοδο createAndShowGUI να γράψεις
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]
Καινούργια δυσκολία.... Λοιπόν φτιάχνω ένα JFrame
οταν όμως τρέχω το πρόγραμμα μου βγάζει ένα πολύ μικρό Frame (ακριβώς στο μέγεθος της Label) καμία σχέση με το μέγεθος που του δίνω,
και εμφανίζει μόνο τη Label, ενώ δεν υπάρχει πουθενά το textField. Τι να κάνω για να εμφανίζεται κανονικά???
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();
και εμφανίζει μόνο τη Label, ενώ δεν υπάρχει πουθενά το textField. Τι να κάνω για να εμφανίζεται κανονικά???

«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
- silegav
- Venus Project Founder
- Posts: 2098
- Joined: Tue Mar 09, 2004 4:03 pm
- Academic status: Alumnus/a
- Location: The Center of the World -> Piraeus
δες το layout. Νομίζω πως το default layout είναι αυτό που εμφανίζει σε μια σειρά ότι βάλεις. Δεν θυμάμαι τώρα ακριβώς ποια layouts είναι τι αλλά μπορείς να τα βρείς εδώ
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");
}
}

«Η ευτυχία συνήθως έρχεται σε όσους είναι πολύ απασχολημένοι για να ψάξουν να τη βρουν.»
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ
ΧΕΝΡΙ ΝΤΕΪΒΙΝΤ ΤΟΡΟ