Java Tutorial/Swing Event/DocumentListener

Материал из Java эксперт
Перейти к: навигация, поиск

DocumentListener and DocumentEvent

   <source lang="java">

/*

* Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
*   - Redistributions of source code must retain the above copyright
*     notice, this list of conditions and the following disclaimer.
*
*   - Redistributions in binary form must reproduce the above copyright
*     notice, this list of conditions and the following disclaimer in the
*     documentation and/or other materials provided with the distribution.
*
*   - Neither the name of Sun Microsystems nor the names of its
*     contributors may be used to endorse or promote products derived
*     from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/*

* DocumentEventDemo.java requires no other files.
*/

import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.Document; 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");
   JScrollPane scrollPane = new JScrollPane(textArea);
   scrollPane.setPreferredSize(new Dimension(200, 75));
   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 {
   final String newline = "\n";
   public void insertUpdate(DocumentEvent e) {
     updateLog(e, "inserted into");
   }
   public void removeUpdate(DocumentEvent e) {
     updateLog(e, "removed from");
   }
   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(changeLength + " character"
         + ((changeLength == 1) ? " " : "s ") + action + " "
         + doc.getProperty("name") + "." + newline + "  Text length = "
         + doc.getLength() + newline);
     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();
     }
   });
 }

}</source>





Get document from DocumentListener

   <source lang="java">

import java.awt.BorderLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; public class Test extends JFrame {

 JTextArea text = new JTextArea(10, 40);
 public Test() {
   setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   text.setLineWrap(true);
   text.getDocument().addDocumentListener(new DocumentListener() {
     public void showSize(DocumentEvent e) {
       System.out.println("Doc size: " + e.getDocument().getLength());
     }
     public void insertUpdate(DocumentEvent e) {
       showSize(e);
     }
     public void removeUpdate(DocumentEvent e) {
       showSize(e);
     }
     public void changedUpdate(DocumentEvent e) {
       showSize(e);
     }
   });
   getContentPane().add(
       new JScrollPane(text, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
           JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER);
   pack();
   setSize(200, 200);
 }
 public static void main(String[] args) {
   new Test().setVisible(true);
 }

}</source>





How to Write a Document Listener

   <source lang="java">

import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.Document;

class MyDocumentListener implements DocumentListener {

 final String newline = "\n";
 public void insertUpdate(DocumentEvent e) {
     updateLog(e, "inserted into");
 }
 public void removeUpdate(DocumentEvent e) {
     updateLog(e, "removed from");
 }
 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();
     System.out.println(
         changeLength + " character"
       + ((changeLength == 1) ? " " : "s ")
       + action + " " + doc.getProperty("name") + "."
       + newline
       + "  Text length = " + doc.getLength() + newline);
 }

}

public class UsingDocumentListener {

 public static void main(String[] a){
   JFrame frame = new JFrame();
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JTextField textField = new JTextField();
   
   textField.getDocument().addDocumentListener(new MyDocumentListener());
   textField.getDocument().putProperty("name", "Text Field");
   frame.add(textField);
   frame.setSize(300, 200);
   frame.setVisible(true);
 }

}</source>





Listening to JTextField Events with a DocumentListener

   <source lang="java">

import java.awt.BorderLayout; import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.Document; public class AddingDocumentListenerJTextFieldSample {

 public static void main(String args[]) {
   final JFrame frame = new JFrame("Default Example");
   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   JTextField textField = new JTextField();
   frame.add(textField, BorderLayout.NORTH);
   DocumentListener documentListener = new DocumentListener() {
     public void changedUpdate(DocumentEvent documentEvent) {
       printIt(documentEvent);
     }
     public void insertUpdate(DocumentEvent documentEvent) {
       printIt(documentEvent);
     }
     public void removeUpdate(DocumentEvent documentEvent) {
       printIt(documentEvent);
     }
     private void printIt(DocumentEvent documentEvent) {
       DocumentEvent.EventType type = documentEvent.getType();
       String typeString = null;
       if (type.equals(DocumentEvent.EventType.CHANGE)) {
         typeString = "Change";
       }  else if (type.equals(DocumentEvent.EventType.INSERT)) {
         typeString = "Insert";
       }  else if (type.equals(DocumentEvent.EventType.REMOVE)) {
         typeString = "Remove";
       }
       System.out.print("Type : " + typeString);
       Document source = documentEvent.getDocument();
       int length = source.getLength();
       System.out.println("Length: " + length);
     }
   };
   textField.getDocument().addDocumentListener(documentListener);
   
   frame.setSize(250, 150);
   frame.setVisible(true);
 }

}</source>