swing:text_fields

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
swing:text_fields [2018/03/23 14:39]
gthanos [Παράδειγμα 1ο]
swing:text_fields [2018/03/27 19:40]
Line 1: Line 1:
-====== Text Fields, Text Areas & Scroll Panes (Scroll Bars) ====== 
- 
-<WRAP info 70% round center> 
-Σε αυτή την ενότητα θα εξετάσουμε τα πεδία κειμένου text field και text area στο οποία το περιεχόμενο κείμενο έχει ενιαία μορφοποίηση, δηλ δεν μπορεί να γίνει μορφοποίηση επιμέρους περιοχών του περιεχόμενου κειμένου, όμως μπορείτε να θέσετε ενιαία μορφοποίηση για όλο το κείμενο. Επίσης, ένα text area μπορεί να περιέχει μόνο κείμενο, δηλ δεν μπορεί να περιέχει φωτογραφίες ή άλλα αρχεία πολυμέσων. 
-</WRAP> 
- 
-Ένα 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> 
-int NUMBER_OF_CHAR = 20; 
-JTextField textField = new JTextField(NUMBER_OF_CHAR); 
-or 
-JTextField textField = new JTextField("Default text", NUMBER_OF_CHAR); 
-</code> 
- 
-Οι παραπάνω ορισμοί σημαίνουν τα εξής: 
-  - Δημιουργούμε ένα 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 ορίζεται ως εξής: 
- 
-<code java> 
-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); 
-</code> 
- 
-<WRAP tip 80% center round > 
-Τόσο η κλάση **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> 
- 
-===== Μέθοδοι που κληρονομούνται από την κλάση JTextComponent ===== 
- 
-==== set/get text content ==== 
- 
-Μπορείτε να λάβετε ή να θέσετε το περιεχόμενο ενός text field ή text area μέσα από τις μεθόδους ''String getText()'' και ''void setText(String text)'' όπως παρακάτω 
-<code java> 
-String text = textField.getText(); 
-textField.setText(text + "!"); 
-</code> 
- 
-Εάν θέλετε να λάβετε το κείμενο που έχει πιθανόν μαρκάρει ο χρήστης μπορείτε να χρησιμοποιήσετε την μέθοδο 
-<code java> 
-public String getSelectedText(); 
-</code> 
- 
-==== Editable or Non-editable field ==== 
- 
-Μπορείτε να ορίσετε ένα text component να είναι non-editable ως εξής: 
-<code java> 
-textArea.setEditable(false);  // disable textArea for user editing. 
-textArea.setEditable(true);  // enable textArea for user editing. 
-</code> 
- 
-==== Λάβετε την θέση του κέρσορα ή θέστε την θέση αυτή ==== 
- 
-<code java> 
-int pos = textArea.getCaretPosition(); 
-textArea.setCaretPosition(textArea.getText().length()-10);//sets caret position 10 characters before the end 
-</code> 
- 
-==== Μαρκάρετε περιεχόμενο ==== 
- 
-<code java> 
-//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()); 
-</code> 
- 
-==== Αλλάξτε το χρώμα των χαρακτήρων ή το χρώμα στο background ==== 
- 
-Η αλλαγή στο χρώμα των χαρακτήρων μπορεί να γίνει μέσα από την μέθοδο ''setForeground'' όπως παρακάτω: 
-<code java> 
-textArea.setForeground(Color.RED);   // Θέτει το χρώμα των χαρακτήρων σε κόκκινο. 
-</code> 
- 
-Αντίστοιχα, η αλλαγή στο χρώμα του background μπορεί να γίνει από την μέθοδο ''setBackground'' όπως παρακάτω: 
-<code java> 
-textArea.setBackground(Color.BLUE);   // Θέτει το χρώμα των χαρακτήρων σε μπλε. 
-</code> 
- 
-===== Μέθοδοι των κλάσεων JTextField και JTextArea ===== 
- 
-Είναι πιθανό σε ένα text field ή text area να θέλετε να ορίσετε την δική σας γραμματοσειρά. Αυτό μπορείτε να το κάνετε με την βοήθεια της κλάσης [[http://docs.oracle.com/javase/7/docs/api/java/awt/Font.html|java.awt.Font]] της παρακάτω μεθόδου 
- 
-<code java> 
-void setFont(Font f); 
-</code> 
- 
-==== Line Wrap σε text area ==== 
- 
-Σας δίνεται η δυνατότητα να ορίσετε σε ένα text area να αναδιπλώνει τις γραμμές του περιεχομένου προσαρμοζόμενο στο μέγεθος διαθέσιμων στηλών. Η default συμπεριφορά του text area είναι να μην κάνει αναδίπλωση γραμμών. Εάν δεν γίνεται αναδίπλωση, τότε συνήθως το text area περιέχεται μέσα σε ένα Scroll Pane (JScrollPane) που επιτρέπει οριζόντια μετακίνηση μέσα στο text area, ώστε να είναι ορατό το σύνολο του text area μέσα από scrolling. Αν θέλετε να ορίσετε την δυνατότητα αναδίπλωσης γραμμών μπορείτε να το κάνετε μέσα από τις παρακάτω εντολές. 
-<code java> 
-textArea.setLineWrap(true);      // ορίζεται ότι το text area θα πρέπει να κάνει αναδίπλωση γραμμών. false by default. 
-textArea.setWrapStyleWord(true); // αναδιπλώνει τις γραμμές χωρίς να κόβει τις λέξεις. false by default. 
-</code> 
- 
-===== Scroll Panes (Scroll Bars) ===== 
- 
-Όταν ορίζετε ένα text area ορίζετε ένα ελάχιστο εύρος γραμμών και στηλών στις οποίες εκτείνεται το συγκεκριμένο text area, π.χ.  
-<code java> 
-JTextArea textArea = new JTextArea(NUMBER_OF_ROWS, NUMBER_OF_CHAR); 
-</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//. 
- 
-{{ :swing:jscrollpane.png |}} 
- 
-Για να ορίσετε ένα text area μέσα σε ένα JScrollPane απαιτείται μία δήλωση της μορφής 
-<code java> 
-JScrollPane scolledTextArea = new JScrollPane(textArea); 
-</code> 
- 
-Σε κάθε JScrollPane object ορίζεται την συμπεριφορά του οριζόντιου ScrollBar από την παρακάτω μέθοδο οι οποία λαμβάνει ως ορίσματα τις τιμές που ακολουθούν. 
-<code java> 
-public void setHorizontalScrollBarPolicy(int policy)  
- 
-// επιτρεπόμενες τιμές 
-JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS 
-JScrollPane.HORIZONTAL_SCROLLBAR_NEVER 
-JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED 
-</code> 
- 
-Αντίστοιχα για το κάθετο ScrollBar  
-<code java> 
-public void setVerticalScrollBarPolicy(int policy)  
- 
-// επιτρεπόμενες τιμές 
-JScrollPane.VERTICAL_SCROLLBAR_ALWAYS 
-JScrollPane.VERTICAL_SCROLLBAR_NEVER 
-JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED 
-</code> 
- 
-===== Παραδείγματα ===== 
- 
-==== Παράδειγμα 1ο ==== 
- 
-Ένα παράδειγμα χρήστης των παραπάνω components δίνεται παρακάτω: 
-<code java TextComponentsDemo.java> 
-import java.awt.*; 
-import java.awt.event.*; 
-import javax.swing.*; 
- 
-public class TextComponentsDemo { 
- 
-  JFrame frame; 
-  JTextField textField; 
-  JPasswordField passwdField; 
-  JLabel msgLabel; 
-  JTextArea textArea; 
-  JCheckBox textFieldCheck, passwdFieldCheck; 
-   
-  public TextComponentsDemo() { 
-    frame = new JFrame("Text Components Demo"); 
-    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
-    JPanel framePanel = new JPanel(); 
-    framePanel.setLayout(new BoxLayout(framePanel, BoxLayout.Y_AXIS)); 
-    frame.setContentPane(framePanel); 
-    JPanel textFieldPanel = new JPanel(new GridLayout(3,3)); 
-    framePanel.add(textFieldPanel); 
-    textField = new JTextField(15); 
-    textField.addActionListener( new ActionListener() { 
-      public void actionPerformed(ActionEvent e) { 
-        textArea.setText(textArea.getText()+(textArea.getText().isEmpty()?"":"\n")+textField.getText()); 
-        textField.setText(""); 
-      } 
-    }); 
-    textFieldPanel.add(new JLabel("JTextField:")); 
-    textFieldPanel.add(textField); 
-    textFieldCheck = new JCheckBox("Editable", true); 
-    textFieldCheck.addItemListener(new ItemListener() { 
-      public void itemStateChanged(ItemEvent e) { 
-        if(e.getStateChange() == ItemEvent.SELECTED) 
-          textField.setEditable(true); 
-        else 
-          textField.setEditable(false); 
-      } 
-    }); 
-    textFieldPanel.add(textFieldCheck); 
-     
-    textFieldPanel.add(new JLabel("JPasswordField:")); 
-    passwdField = new JPasswordField(); 
-    textFieldPanel.add(passwdField); 
-    passwdFieldCheck = new JCheckBox("Editable", true); 
-    passwdFieldCheck.addItemListener(new ItemListener() { 
-      public void itemStateChanged(ItemEvent e) { 
-        if(e.getStateChange() == ItemEvent.SELECTED) 
-          passwdField.setEditable(true); 
-        else 
-          passwdField.setEditable(false); 
-      } 
-    }); 
-    textFieldPanel.add(passwdFieldCheck); 
-     
-    msgLabel = new JLabel("TextArea Options:", JLabel.LEFT);     
-    textFieldPanel.add(msgLabel); 
-     
-    String []font = {"Arial", "Courier", "Verdana", "Tahoma"}; 
-    JComboBox<String> fontCombo = new JComboBox<>(font); 
-    fontCombo.addActionListener( new ActionListener() { 
-      public void actionPerformed(ActionEvent e) { 
-        String option = font[fontCombo.getSelectedIndex()]; 
-        textArea.setFont(new Font(option, Font.ITALIC|Font.BOLD, 15)); 
-      } 
-    }); 
-     
-     
-    String []fontColor = { "RED", "BLUE", "CYAN", "DARK_GRAY" }; 
-    JComboBox<String> fontColorCombo = new JComboBox<>(fontColor); 
-    fontColorCombo.addActionListener( new ActionListener() { 
-      public void actionPerformed(ActionEvent e) { 
-        Color c; 
-        switch(fontColorCombo.getSelectedIndex()) { 
-          case 0: 
-            c = Color.RED; 
-            break; 
-          case 1: 
-            c = Color.BLUE; 
-            break; 
-          case 2: 
-            c = Color.CYAN; 
-            break; 
-          case 3: 
-            c = Color.DARK_GRAY; 
-            break;           
-          default: 
-            c = Color.YELLOW; 
-        } 
-        textArea.setForeground(c); 
-      } 
-    }); 
-    textFieldPanel.add(fontCombo); 
-    textFieldPanel.add(fontColorCombo); 
-     
-    textArea = new JTextArea(10, 20); 
-    //textArea.setText(""); 
-    textArea.setFont(new Font("Arial", Font.ITALIC|Font.BOLD, 15)); 
-    textArea.setForeground(new Color(250, 30, 30)); 
-    framePanel.add(textArea); 
-     
-    frame.pack(); 
-    frame.setVisible(true); 
-  } 
-   
-  public static void main(String []args) { 
-    javax.swing.SwingUtilities.invokeLater( new Runnable() { 
-      public void run() { 
-        new TextComponentsDemo(); 
-      } 
-    }); 
-  } 
-} 
-</code> 
- 
-<WRAP tip 80% center round> 
-Παρατηρήστε ότι μπορείτε να χρησιμοποιήσετε έναν [[https://docs.oracle.com/javase/8/docs/api/java/awt/event/ActionListener.html|ActionListener]] πάνω σε ένα [[https://docs.oracle.com/javase/8/docs/api/javax/swing/JTextField.html|JTextField]]. Το [[https://docs.oracle.com/javase/8/docs/api/java/awt/event/ActionEvent.html|ActionEvent]] που παράγεται συμβαίνει όταν ο χρήστης πατήσει το πλήκτρο //Enter// από το πληκτρολόγιο (δεν συνδέεται με τη λειτουργία του ποντικιού). 
-</WRAP> 
-  
-==== Παράδειγμα 2ο ==== 
- 
-Το 2ο παράδειγμα είναι από το βιβλίο του Savitch.  
-<code java ScrollBarDemo.java> 
-import javax.swing.*; 
-import java.awt.*; 
-import java.awt.event.*; 
- 
-public class ScrollBarDemo extends JFrame implements ActionListener { 
-  public static final int WIDTH = 600; 
-  public static final int HEIGHT = 400; 
-  public static final int LINES = 15; 
-  public static final int CHAR_PER_LINE = 30; 
-  private JTextArea memoDisplay; 
-  private String memo1; 
-  private String memo2; 
- 
-  public static void main(String[] args)  { 
-    ScrollBarDemo gui = new ScrollBarDemo(); 
-    gui.setVisible(true); 
-  } 
-   
-  public ScrollBarDemo() { 
-    super("Scroll Bars Demo"); 
-    setSize(WIDTH, HEIGHT); 
-    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
-    JPanel buttonPanel = new JPanel(); 
-    buttonPanel.setBackground(Color.LIGHT_GRAY); 
-    buttonPanel.setLayout(new FlowLayout()); 
-    JButton memo1Button = new JButton("Save Memo 1"); 
-    memo1Button.addActionListener(this); 
-    buttonPanel.add(memo1Button); 
-    JButton memo2Button = new JButton("Save Memo 2"); 
-    memo2Button.addActionListener(this); 
-    buttonPanel.add(memo2Button); 
-    JButton clearButton = new JButton("Clear"); 
-    clearButton.addActionListener(this); 
-    buttonPanel.add(clearButton); 
-    JButton get1Button = new JButton("Get Memo 1"); 
-    get1Button.addActionListener(this); 
-    buttonPanel.add(get1Button); 
-    JButton get2Button = new JButton("Get Memo 2"); 
-    get2Button.addActionListener(this); 
-    buttonPanel.add(get2Button); 
-    add(buttonPanel, BorderLayout.SOUTH); 
-    JPanel textPanel = new JPanel(); 
-    textPanel.setBackground(Color.BLUE); 
- 
-    memoDisplay = new JTextArea(LINES, CHAR_PER_LINE); 
-    memoDisplay.setBackground(Color.WHITE); 
-    JScrollPane scrolledText = new JScrollPane(memoDisplay); 
-    scrolledText.setHorizontalScrollBarPolicy( 
-    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
-    scrolledText.setVerticalScrollBarPolicy( 
-    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
-    textPanel.add(scrolledText); 
-    add(textPanel, BorderLayout.CENTER); 
-  } 
-   
-  public void actionPerformed(ActionEvent e) { 
-    String actionCommand = e.getActionCommand(); 
-    if (actionCommand.equals("Save Memo 1")) 
-      memo1 = memoDisplay.getText(); 
-    else if (actionCommand.equals("Save Memo 2")) 
-      memo2 = memoDisplay.getText(); 
-    else if (actionCommand.equals("Clear")) 
-      memoDisplay.setText(""); 
-    else if (actionCommand.equals("Get Memo 1")) 
-      memoDisplay.setText(memo1); 
-    else if (actionCommand.equals("Get Memo 2")) 
-      memoDisplay.setText(memo2); 
-    else 
-      memoDisplay.setText("Error in memo interface"); 
-  } 
-   
-} 
-</code> 
- 
-===== Document Listeners ===== 
- 
-Κάθε component ή κάθε κατηγορία component συνδέεται με κάποιο Listener Interface. Τα παραπάνω text related components συνδέονται με το interface [[http://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html|javax.swing.event.DocumentListener]]. Οι μέθοδοι του συγκεκριμένου interface δίνονται παρακάτω. 
-<code java> 
-void changedUpdate(DocumentEvent e); 
-//Gives notification that an attribute or set of attributes changed. 
- 
-void insertUpdate(DocumentEvent e); 
-//Gives notification that there was an insert into the document. 
- 
-void removeUpdate(DocumentEvent e); 
-//Gives notification that a portion of the document has been removed. 
-</code> 
- 
- 
  
swing/text_fields.txt · Last modified: 2018/03/27 19:40 (external edit)