Swing开发之JTextField篇

 JTextField继承JTextComponent类,因此它也可以使用JTextComponent抽象类里面许多好用的方法,如copy(),paste(),setText(),isEditable()等等。我们可以在很多地方使用JTextField,JTextField是一个单行的输入组件。
JTextField 具有建立字符串的方法,此字符串用作针对被激发的操作事件的命令字符串。java.awt.TextField 把字段文本用作针对 ActionEvent 的命令字符串。如果通过 setActionCommand 方法设置的命令字符串不为 null,则 JTextField 将使用该字符串来保持与 java.awt.TextField 的兼容性,否则将使用字段文本来保持兼容性。
setEchoChar 和 getEchoChar 方法不是直接提供的,以避免可插入的外观的新实现意外公开密码字符。为了提供类似密码的服务,单独的类 JPasswordField 扩展了 JTextField,从而通过可插入外观独立地提供此服务。
构造方法:
JTextField()
          构造一个新的 TextField。
JTextField(Document doc, String text, int columns)
          构造一个新的 JTextField,它使用给定文本存储模型和给定的列数。
JTextField(int columns)
          构造一个具有指定列数的新的空 TextField。
JTextField(String text)
          构造一个用指定文本初始化的新 TextField。
JTextField(String text, int columns)
          构造一个用指定文本和列初始化的新 TextField。

常用方法:
addActionListener(ActionListener l)
          添加指定的操作侦听器以从此文本字段接收操作事件。
getColumns()
          返回此 TextField 中的列数。
getColumnWidth()
          返回列宽度。
setActionCommand(String command)
          设置用于操作事件的命令字符串。
setDocument(Document doc)
          将编辑器与一个文本文档关联。
setFont(Font f)
          设置当前字体。
setHorizontalAlignment(int alignment)
          设置文本的水平对齐方式。
getDocument()
          获取与编辑器关联的模型。
getText()
          返回此 TextComponent 中包含的文本。
isEditable()
          返回指示此 TextComponent 是否可编辑的 boolean。
setDragEnabled(boolean b)
          设置 dragEnabled 属性,该属性必须为 true 才能确保启用对此组件的自动拖动处理(拖放操作的第一部分)。
setEditable(boolean b)
          设置指定的 boolean 变量,以指示此 TextComponent 是否应该为可编辑的。
setText(String t)
          将此 TextComponent 文本设置为指定文本。


例 1 :共享数据模型
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.text.Document;
public class ShareModel {
  public static void main(String args[]) {
    JFrame frame = new JFrame("Sharing Sample");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JTextField textarea1 = new JTextField();
    Document document = textarea1.getDocument();
    JTextArea textarea2 = new JTextArea(document);
    JTextArea textarea3 = new JTextArea(document);
    frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));
    frame.add(new JScrollPane(textarea1));
    frame.add(new JScrollPane(textarea2));
    frame.add(new JScrollPane(textarea3));
    frame.setSize(300, 400);
    frame.setVisible(true);
  }
}

例 2 : 验证文本框,如果第一个文本框中为输入数字则第二个文本框不能输入。
import java.awt.BorderLayout;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class VerifierSample {
  public static void main(String args[]) {
    JFrame frame = new JFrame("Verifier Sample");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JTextField textField1 = new JTextField();
    JTextField textField2 = new JTextField();
    InputVerifier verifier = new InputVerifier() {
      public boolean verify(JComponent comp) {
        boolean returnValue;
        JTextField textField = (JTextField) comp;
        try {
          Integer.parseInt(textField.getText());
          returnValue = true;
        } catch (NumberFormatException e) {
          returnValue = false;
        }
        return returnValue;
      }
    };
    textField1.setInputVerifier(verifier);
    frame.add(textField1, BorderLayout.NORTH);
    frame.add(textField2, BorderLayout.CENTER);
    frame.setSize(300, 100);
    frame.setVisible(true);
  }
}

例 3:将文本输入框增加在滚动条面板中
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoundedRangeModel;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JTextField;

public class TextSlider {

  public static void main(String args[]) {
    JFrame frame = new JFrame("Text Slider");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    final JTextField textField = new JTextField();

    JScrollBar scrollBar = new JScrollBar(JScrollBar.HORIZONTAL);

    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

    BoundedRangeModel brm = textField.getHorizontalVisibility();
    scrollBar.setModel(brm);
    panel.add(textField);
    panel.add(scrollBar);

    final TextSlider ts = new TextSlider();
    textField.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        System.out.println("Text: " + textField.getText());
      }
    });
    frame.add(panel, BorderLayout.NORTH);
    frame.setSize(300, 100);
    frame.setVisible(true);
  }
}

例 4 :在开发中经常会遇到只能在文本框输入自己想控制的格式,如:只能输入数字,字母等类似需求,这种需求有两种实现方法,一种是在用户提交时判断输入的内容是否符合要求,二种是在用户输入的同时对内容做判断.下面这个例子就是对第二种方式的处理. 通过对模型进行扩展和改变所提供的默认模型,可以很容易创建自定义字段.

只能在文本框中输入数字
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;

public class ValidationTestFrame extends JFrame implements DocumentListener {
  JLabel label = new JLabel("I only accept numbers");
  private IntTextField intFiled;

  public ValidationTestFrame() {
    setTitle("ValidationTest");
    setSize(300, 200);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });

    Container contentPane = getContentPane();

    JPanel p = new JPanel();
    intFiled = new IntTextField(12, 3);
    p.add(intFiled);

    //增加DocumentListener事件
    intFiled.getDocument().addDocumentListener(this);

    contentPane.add(p, "South");
    contentPane.add(label, "Center");
  }

  public void insertUpdate(DocumentEvent e) {
    setLabel();
  }

  public void removeUpdate(DocumentEvent e) {
    setLabel();
  }

  public void changedUpdate(DocumentEvent e) {
  }

  public void setLabel() {
    if (intFiled.isValid() ) {
      int value = intFiled.getValue();
      label.setText(Integer.toString(value));
    }
  }

  public static void main(String[] args) {
    JFrame frame = new ValidationTestFrame();
    frame.show();
  }

}

class IntTextField extends JTextField {
  public IntTextField(int defval, int size) {
    super("" + defval, size);
  }

  protected Document createDefaultModel() {
    return new IntTextDocument();
  }

  public boolean isValid() {
    try {
      Integer.parseInt(getText());
      return true;
    } catch (NumberFormatException e) {
      return false;
    }
  }

  public int getValue() {
    try {
      return Integer.parseInt(getText());
    } catch (NumberFormatException e) {
      return 0;
    }
  }
  class IntTextDocument extends PlainDocument {

  //中写方法实现需求
    public void insertString(int offs, String str, AttributeSet a)
        throws BadLocationException {
      if (str == null)
        return;
      String oldString = getText(0, getLength());
      String newString = oldString.substring(0, offs) + str
          + oldString.substring(offs);
      try {
        Integer.parseInt(newString + "0");
   
        //向Document中插入文本前判断
        super.insertString(offs, str, a);
      } catch (NumberFormatException e) {
      }
    }
  }

}

你可能感兴趣的:(Swing开发之JTextField篇)