User Tools

Site Tools


swing:text_fields

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
swing:text_fields [2015/05/10 17:23] gthanosswing:text_fields [Unknown date] (current) – external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
-====== Text FieldsText Areas & Scroll Panes (Scroll Bars) ======+====== Text Fields Text Areas ======
  
 <WRAP info 70% round center> <WRAP info 70% round center>
Line 5: Line 5:
 </WRAP> </WRAP>
  
-Ένα text field (υλοποιείται από την κλάση [[http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextField.html|javax.swing.JTextField]]) είναι ένα πεδίο κειμένου, στο οποίο ο χρήστης μπορεί να καταχωρήσει κείμενο. Το text field καταλαμβάνει μόνο μία γραμμή και εκτείνεται σε συγκεκριμένο εύρος χαρακτήρων. Το περιεχόμενο όμως που μπορεί να γραφεί μέσα στο text field μπορεί να είναι πολύ μεγαλύτερο από το εύρος χαρακτήρων το οποίο καταλαμβάνει και είναι ορατό ή μπορεί να περιέχει και κείμενο πολλών γραμμών. Ένα text field ορίζεται όπως παρακάτω+Ένα text field (υλοποιείται από την κλάση [[http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextField.html|javax.swing.JTextField]]) είναι ένα πεδίο κειμένου, στο οποίο ο χρήστης μπορεί να καταχωρήσει κείμενο. Το text field καταλαμβάνει μόνο μία γραμμή και εκτείνεται σε συγκεκριμένο εύρος χαρακτήρων. Το περιεχόμενο όμως που μπορεί να γραφεί μέσα στο text field μπορεί να είναι πολύ μεγαλύτερο από το εύρος χαρακτήρων που είναι ορατό και μπορεί να περιέχει και κείμενο πολλών γραμμών. Ένα //text field// ορίζεται όπως παρακάτω
  
 <code java> <code java>
Line 18: Line 18:
   - Ο 2ος κατασκευαστής δημιουργεί το παραπάνω text field που περιέχει το String **"Default text!"**.   - Ο 2ος κατασκευαστής δημιουργεί το παραπάνω text field που περιέχει το String **"Default text!"**.
  
-Εκτός του component JTextField υπάρχει και το component [[http://docs.oracle.com/javase/7/docs/api/javax/swing/JPasswordField.html|javax.swing.JPasswordField]] που χρησιμοποιείται για καταχώρηση passwords. Η διαφορά με το JTextField είναι ότι αντί για την εμφάνιση των καταχωρούμενων χαρακτήρων εμφανίζονται τελείες πράγμα που κάνουν αδύνατη την ανάγνωση του περιεχομένου με γυμνό μάτι.+Εκτός του component JTextField υπάρχει και το component [[http://docs.oracle.com/javase/7/docs/api/javax/swing/JPasswordField.html|javax.swing.JPasswordField]] που χρησιμοποιείται για καταχώρηση //passwords//. Η διαφορά με το JTextField είναι ότι αντί για την εμφάνιση των καταχωρούμενων χαρακτήρων εμφανίζονται τελείες πράγμα που κάνουν αδύνατη την ανάγνωση του περιεχομένου με γυμνό μάτι.
  
 Σε αναλογία με το text field, ένα text area (υλοποιείται από την κλάση [[http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html|JTextArea]]) είναι ένα text field το οποίο καταλαμβάνει πολλαπλές γραμμές. Ένα text area ορίζεται ως εξής: Σε αναλογία με το text field, ένα text area (υλοποιείται από την κλάση [[http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html|JTextArea]]) είναι ένα text field το οποίο καταλαμβάνει πολλαπλές γραμμές. Ένα text area ορίζεται ως εξής:
Line 31: Line 31:
  
 <WRAP tip 80% center round > <WRAP tip 80% center round >
-Τόσο η κλάση **JTextArea** όσο και η κλάση **JTextField** είναι απόγονοι της κλάσης [[http://docs.oracle.com/javase/7/docs/api/javax/swing/text/JTextComponent.html|JTextComponent]]. Κατά συνέπεια, κληρονομούν πολλές από τις μεθόδους της κλάσης **JTextComponent**. Παρακάτω θα εξετάσουμε κάποιες μεθόδους που είναι κοινές για τις παραπάνω κλάσεις καθώς προέρχονται από την κλάση **JTextComponent**.+Τόσο η κλάση **JTextArea** όσο και η κλάση **JTextField** είναι απόγονοι της κλάσης [[http://docs.oracle.com/javase/7/docs/api/javax/swing/text/JTextComponent.html|JTextComponent]]. Παρακάτω θα εξετάσουμε κάποιες μεθόδους που είναι κοινές για τις παραπάνω κλάσεις καθώς προέρχονται από την κλάση [[https://docs.oracle.com/javase/7/docs/api/javax/swing/text/JTextComponent.html|JTextComponent]].
 </WRAP> </WRAP>
  
-===== Μέθοδοι της κλάσης JTextComponent =====+===== Μέθοδοι που κληρονομούνται από την κλάση JTextComponent =====
  
 ==== set/get text content ==== ==== set/get text content ====
Line 67: Line 67:
  
 <code java> <code java>
-textArea.setCaretPosition(textArea.getText().length()-10);//sets caret position 10 characters before the end +//sets caret position 10 characters before the end. 
-textArea.moveCaretPosition(10);                           //marks the last 10 characters of textArea.+textArea.setCaretPosition(textArea.getText().length()-10); 
 +//sets caret position 10 characters by 10 characters from its current position. 
 +textArea.moveCaretPosition(10);                           
  
 OR  OR 
  
 +//marks the last 10 characters of textArea.
 textArea.select(textArea.getText().length()-10, textArea.getText().length()); textArea.select(textArea.getText().length()-10, textArea.getText().length());
 </code> </code>
Line 103: Line 106:
 </code> </code>
  
-===== Scroll Panes (Scroll Bars) =====+===== Η κλάση Document =====
  
-Όταν ορίζετε ένα text area ορίζετε ένα ελάχιστο εύρος γραμμών και στηλών στις οποίες εκτείνεται το συγκεκριμένο text area, π.χ+Τόσο τα **TextFields** όσο και τα **TextAreas** περιέχουν ένα αντικείμενο της κλάσης [[https://docs.oracle.com/javase/8/docs/api/javax/swing/text/Document.html|Document]]. Η κλάση **Document** διαχειρίζεται το περιεχόμενο κείμενο όλων των κλάσεων αυτού του τύπου και μπορεί να σας επιστρέψει όλο ή μέρος από το περιεχόμενο του //component//. Ένα από τα βασικά χαρακτηριστικά του **Document** είναι ότι σε κάθε μεταβολή του περιεχομένου παράγει //events// του τύπου [[https://docs.oracle.com/javase/8/docs/api/javax/swing/event/DocumentEvent.html|DocumentEvent]], τα οποία μπορείτε να ιάσετε" μέσω ενός αντικειμένου τύπου [[https://docs.oracle.com/javase/8/docs/api/javax/swing/event/DocumentListener.html|DocumentListener]] (//interface//). 
 + 
 +Οι μέθοδοι του interface [[http://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html|javax.swing.event.DocumentListener]] δίνονται παρακάτω.
 <code java> <code java>
-JTextArea textArea = new JTextArea(NUMBER_OF_ROWS, NUMBER_OF_CHAR);+//Gives notification that an attribute or set of attributes changed. 
 +void changedUpdate(DocumentEvent e); 
 +//Gives notification that there was an insert into the document. 
 +void insertUpdate(DocumentEvent e); 
 +//Gives notification that a portion of the document has been removed. 
 +void removeUpdate(DocumentEvent e);
 </code> </code>
-Ο χρήστης μπορεί να εισάγει κείμενο που εκτείνεται έξω από τα παραπάνω όρια. Εάν δεν έχετε ορίσει την ιδιότητα της αναδίπλωσης γραμμών στο text area, το κείμενο που βρίσκεται εκτός των παραπάνω ορίων μπορεί να φανεί μόνο αν ορίσετε  scroll bars, ώστε να μπορείτε να πλοηγήστε οριζόντια και κατακόρυφα έξω από τα παραπάνω όρια.  
  
-Scroll bars ορίζονται από το component [[http://docs.oracle.com/javase/7/docs/api/javax/swing/JScrollPane.html|javax.swing.JScrollPane]]. Μπορείτε να φανταστείτε τα scroll bars σαν ένα κινούμενο παράθυρο πάνω από το συνολικό κείμενο που περιέχεται στο text area ή σε οποιοδήποτε άλλο componentΚάθε φορά που μετακινείτε ένα scroll bar μετακινείτε το παράθυρο ορατότητας πάνω από το component. Στην πραγματικότητα ένα text area με scroll bars είναι ένα παράθυρο ορατότητας (JScrollPaneπάνω από το text area, όπως φαίνεται στο παρακάτω σχήμα, όπου το παράθυρο ορατότητας αναφέρεται ως //View port//.+Μπορείτε να δείτε το παρακάτω παράδειγμα χρήσης [[http://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html|DocumentEventListeners]] από το [[https://docs.oracle.com/javase/tutorial/uiswing/events/documentlistener.html|site της Oracle]] (παραλλαγμένο ελαφρά).
  
-{{ :swing:jscrollpane.png |}}+<code java DocumentEventDemo.java> 
 +import javax.swing.*; 
 +import javax.swing.text.*; 
 +import javax.swing.event.*;
  
-Για να ορίσετε ένα text area μέσα σε ένα JScrollPane απαιτείται μία δήλωση της μορφής +import java.awt.Dimension; 
-<code java> +import java.awt.BorderLayout; 
-JScrollPane scolledTextArea = new JScrollPane(textArea)+import java.awt.GridBagLayout
-</code>+import java.awt.GridBagConstraints;
  
-Σε κάθε JScrollPane object ορίζεται την συμπεριφορά του οριζόντιου ScrollBar από την παρακάτω μέθοδο οι οποία λαμβάνει ως ορίσματα τις τιμές που ακολουθούν. +import java.awt.event.*;
-<code java+
-public void setHorizontalScrollBarPolicy(int policy) +
  
-// επιτρεπόμενες τιμές +public class DocumentEventDemo extends JPanel  
-JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS +                               implements ActionListener { 
-JScrollPane.HORIZONTAL_SCROLLBAR_NEVER +    JTextField textField; 
-JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED +    JTextArea textArea; 
-</code>+    JTextArea displayArea;
  
-Αντίστοιχα για το κάθετο ScrollBar  +    public DocumentEventDemo() { 
-<code java> +        super(new GridBagLayout()); 
-public void setVerticalScrollBarPolicy(int policy+        GridBagLayout gridbag = (GridBagLayout)getLayout(); 
 +        GridBagConstraints c = new GridBagConstraints();
  
-// επιτρεπόμενες τιμές +        JButton button = new JButton("Clear"); 
-JScrollPane.VERTICAL_SCROLLBAR_ALWAYS +        button.addActionListener(this);
-JScrollPane.VERTICAL_SCROLLBAR_NEVER +
-JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED +
-</code>+
  
 +        textField = new JTextField(20);
 +        textField.addActionListener(new MyTextActionListener());
 +        textField.getDocument().addDocumentListener(new MyDocumentListener());
 +        textField.getDocument().putProperty("name", "Text Field");
  
- +        textArea = new JTextArea(); 
 +        textArea.getDocument().addDocumentListener(new MyDocumentListener()); 
 +        textArea.getDocument().putProperty("name", "Text Area"); 
 +        textArea.setLineWrap(true);
  
 +        JScrollPane scrollPane = new JScrollPane(textArea);
 +        scrollPane.setPreferredSize(new Dimension(200, 75));
 +        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 +        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
  
 +        displayArea = new JTextArea();
 +        displayArea.setEditable(false);
 +        JScrollPane displayScrollPane = new JScrollPane(displayArea);
 +        displayScrollPane.setPreferredSize(new Dimension(200, 75));
  
 +        c.gridx = 0;
 +        c.gridy = 0;
 +        c.weightx = 1.0;
 +        c.fill = GridBagConstraints.HORIZONTAL;
 +        gridbag.setConstraints(textField, c);
 +        add(textField);
  
 +        c.gridx = 0;
 +        c.gridy = 1;
 +        c.weightx = 0.0;
 +        c.gridheight = 2;
 +        c.fill = GridBagConstraints.BOTH;
 +        gridbag.setConstraints(scrollPane, c);
 +        add(scrollPane);
 +
 +        c.gridx = 1;
 +        c.gridy = 0;
 +        c.weightx = 1.0;
 +        c.weighty = 1.0;
 +        gridbag.setConstraints(displayScrollPane, c);
 +        add(displayScrollPane);
 +
 +        c.gridx = 1;
 +        c.gridy = 2;
 +        c.weightx = 0.0;
 +        c.gridheight = 1;
 +        c.weighty = 0.0;
 +        c.fill = GridBagConstraints.HORIZONTAL;
 +        gridbag.setConstraints(button, c);
 +        add(button);
 +
 +        setPreferredSize(new Dimension(450, 250));
 +        setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
 +    }
 +
 +    class MyDocumentListener implements DocumentListener {
 +        
 +        public void insertUpdate(DocumentEvent e) {
 +            updateLog(e, "+");
 +        }
 +        public void removeUpdate(DocumentEvent e) {
 +            updateLog(e, "-");
 +        }
 +        public void changedUpdate(DocumentEvent e) {
 +            //Plain text components don't fire these events.
 +        }
 +
 +        public void updateLog(DocumentEvent e, String action) {
 +            Document doc = (Document)e.getDocument();
 +            int changeLength = e.getLength();
 +            displayArea.append(
 +                "["+doc.getProperty("name")+"] " + 
 +                action + changeLength + " character"
 +                ((changeLength == 1) ? "\n" : "s\n") +
 +                "  Text length = " + doc.getLength() + "\n");
 +            displayArea.setCaretPosition(displayArea.getDocument().getLength());
 +        }
 +    }
 +
 +    class MyTextActionListener implements ActionListener {
 +        /** Handle the text field Return. */
 +        public void actionPerformed(ActionEvent e) {
 +            int selStart = textArea.getSelectionStart();
 +            int selEnd = textArea.getSelectionEnd();
 +
 +            textArea.replaceRange(textField.getText(),
 +                                  selStart, selEnd);
 +            textField.selectAll();
 +        }
 +    }
 +
 +    /** Handle button click. */
 +    public void actionPerformed(ActionEvent e) {
 +        displayArea.setText("");
 +        textField.requestFocus();
 +    }
 +
 +    /**
 +     * Create the GUI and show it.  For thread safety,
 +     * this method should be invoked from the
 +     * event-dispatching thread.
 +     */
 +    private static void createAndShowGUI() {
 +        //Create and set up the window.
 +        JFrame frame = new JFrame("DocumentEventDemo");
 +        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +
 +        //Create and set up the content pane.
 +        JComponent newContentPane = new DocumentEventDemo();
 +        newContentPane.setOpaque(true); //content panes must be opaque
 +        frame.setContentPane(newContentPane);
 +
 +        //Display the window.
 +        frame.pack();
 +        frame.setVisible(true);
 +    }
 +
 +    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();
 +            }
 +        });
 +    }
 +}
 +
 +</code>
  
 +| Προηγούμενο: [[:swing:buttons | Buttons, CheckBoxes & RadioButtons ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:swing:jscrollpane | Η κλάση JScrollPane ]] |
  
swing/text_fields.1431278633.txt.gz · Last modified: 2015/05/10 16:23 (external edit)