====== Text Fields & Text Areas ====== Σε αυτή την ενότητα θα εξετάσουμε τα πεδία κειμένου text field και text area στο οποία το περιεχόμενο κείμενο έχει ενιαία μορφοποίηση, δηλ δεν μπορεί να γίνει μορφοποίηση επιμέρους περιοχών του περιεχόμενου κειμένου, όμως μπορείτε να θέσετε ενιαία μορφοποίηση για όλο το κείμενο. Επίσης, ένα text area μπορεί να περιέχει μόνο κείμενο, δηλ δεν μπορεί να περιέχει φωτογραφίες ή άλλα αρχεία πολυμέσων. Ένα text field (υλοποιείται από την κλάση [[http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextField.html|javax.swing.JTextField]]) είναι ένα πεδίο κειμένου, στο οποίο ο χρήστης μπορεί να καταχωρήσει κείμενο. Το text field καταλαμβάνει μόνο μία γραμμή και εκτείνεται σε συγκεκριμένο εύρος χαρακτήρων. Το περιεχόμενο όμως που μπορεί να γραφεί μέσα στο text field μπορεί να είναι πολύ μεγαλύτερο από το εύρος χαρακτήρων που είναι ορατό και μπορεί να περιέχει και κείμενο πολλών γραμμών. Ένα //text field// ορίζεται όπως παρακάτω int NUMBER_OF_CHAR = 20; JTextField textField = new JTextField(NUMBER_OF_CHAR); or JTextField textField = new JTextField("Default text", NUMBER_OF_CHAR); Οι παραπάνω ορισμοί σημαίνουν τα εξής: - Δημιουργούμε ένα text field στο οποίο θα πρέπει να είναι ορατοί τουλάχιστον 20 χαρακτήρες (μπορεί να είναι και περισσότεροι). - Ο 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 είναι ότι αντί για την εμφάνιση των καταχωρούμενων χαρακτήρων εμφανίζονται τελείες πράγμα που κάνουν αδύνατη την ανάγνωση του περιεχομένου με γυμνό μάτι. Σε αναλογία με το text field, ένα text area (υλοποιείται από την κλάση [[http://docs.oracle.com/javase/7/docs/api/javax/swing/JTextArea.html|JTextArea]]) είναι ένα text field το οποίο καταλαμβάνει πολλαπλές γραμμές. Ένα text area ορίζεται ως εξής: int NUMBER_OF_CHAR = 20; int NUMBER_OF_ROWS = 5; JTextArea textArea = new JTextArea(NUMBER_OF_ROWS, NUMBER_OF_CHAR); OR JTextArea textArea = new JTextArea("Default text", NUMBER_OF_ROWS, NUMBER_OF_CHAR); Τόσο η κλάση **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]]. ===== Μέθοδοι που κληρονομούνται από την κλάση JTextComponent ===== ==== set/get text content ==== Μπορείτε να λάβετε ή να θέσετε το περιεχόμενο ενός text field ή text area μέσα από τις μεθόδους ''String getText()'' και ''void setText(String text)'' όπως παρακάτω String text = textField.getText(); textField.setText(text + "!"); Εάν θέλετε να λάβετε το κείμενο που έχει πιθανόν μαρκάρει ο χρήστης μπορείτε να χρησιμοποιήσετε την μέθοδο public String getSelectedText(); ==== Editable or Non-editable field ==== Μπορείτε να ορίσετε ένα text component να είναι non-editable ως εξής: textArea.setEditable(false); // disable textArea for user editing. textArea.setEditable(true); // enable textArea for user editing. ==== Λάβετε την θέση του κέρσορα ή θέστε την θέση αυτή ==== int pos = textArea.getCaretPosition(); textArea.setCaretPosition(textArea.getText().length()-10);//sets caret position 10 characters before the end ==== Μαρκάρετε περιεχόμενο ==== //sets caret position 10 characters before the end. textArea.setCaretPosition(textArea.getText().length()-10); //sets caret position 10 characters by 10 characters from its current position. textArea.moveCaretPosition(10); OR //marks the last 10 characters of textArea. textArea.select(textArea.getText().length()-10, textArea.getText().length()); ==== Αλλάξτε το χρώμα των χαρακτήρων ή το χρώμα στο background ==== Η αλλαγή στο χρώμα των χαρακτήρων μπορεί να γίνει μέσα από την μέθοδο ''setForeground'' όπως παρακάτω: textArea.setForeground(Color.RED); // Θέτει το χρώμα των χαρακτήρων σε κόκκινο. Αντίστοιχα, η αλλαγή στο χρώμα του background μπορεί να γίνει από την μέθοδο ''setBackground'' όπως παρακάτω: textArea.setBackground(Color.BLUE); // Θέτει το χρώμα των χαρακτήρων σε μπλε. ===== Μέθοδοι των κλάσεων JTextField και JTextArea ===== Είναι πιθανό σε ένα text field ή text area να θέλετε να ορίσετε την δική σας γραμματοσειρά. Αυτό μπορείτε να το κάνετε με την βοήθεια της κλάσης [[http://docs.oracle.com/javase/7/docs/api/java/awt/Font.html|java.awt.Font]] της παρακάτω μεθόδου void setFont(Font f); ==== Line Wrap σε text area ==== Σας δίνεται η δυνατότητα να ορίσετε σε ένα text area να αναδιπλώνει τις γραμμές του περιεχομένου προσαρμοζόμενο στο μέγεθος διαθέσιμων στηλών. Η default συμπεριφορά του text area είναι να μην κάνει αναδίπλωση γραμμών. Εάν δεν γίνεται αναδίπλωση, τότε συνήθως το text area περιέχεται μέσα σε ένα Scroll Pane (JScrollPane) που επιτρέπει οριζόντια μετακίνηση μέσα στο text area, ώστε να είναι ορατό το σύνολο του text area μέσα από scrolling. Αν θέλετε να ορίσετε την δυνατότητα αναδίπλωσης γραμμών μπορείτε να το κάνετε μέσα από τις παρακάτω εντολές. textArea.setLineWrap(true); // ορίζεται ότι το text area θα πρέπει να κάνει αναδίπλωση γραμμών. false by default. textArea.setWrapStyleWord(true); // αναδιπλώνει τις γραμμές χωρίς να κόβει τις λέξεις. false by default. ===== Η κλάση Document ===== Τόσο τα **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]] δίνονται παρακάτω. //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); Μπορείτε να δείτε το παρακάτω παράδειγμα χρήσης [[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]] (παραλλαγμένο ελαφρά). import javax.swing.*; import javax.swing.text.*; import javax.swing.event.*; import java.awt.Dimension; import java.awt.BorderLayout; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.event.*; public class DocumentEventDemo extends JPanel implements ActionListener { JTextField textField; JTextArea textArea; JTextArea displayArea; public DocumentEventDemo() { super(new GridBagLayout()); GridBagLayout gridbag = (GridBagLayout)getLayout(); GridBagConstraints c = new GridBagConstraints(); JButton button = new JButton("Clear"); button.addActionListener(this); 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(); } }); } } | Προηγούμενο: [[:swing:buttons | Buttons, CheckBoxes & RadioButtons ]] | [[:toc | Περιεχόμενα ]] | Επόμενο: [[:swing:jscrollpane | Η κλάση JScrollPane ]] |