一、文本框
文本框是接受用户输人的一种组件,Swing将文本组件分为下面三大类。
(1)文本字段(text fields), 包括类JTextField和JPasswordField,用于显示和编辑较短的、不带格式的一-行文本。其中,类JPasswordField是类JTextField的子类,用于输人口令,它与类JTextField的区别在于:不直接显示用户输人的文字,而显示特定的字符作为掩码(mask)字符。文本字段的使用基于动作事件(即主要监听动作类型的事件ActionEvent),与按钮等简单控件的用法类似。
(2)纯文本区域(plain text areas), 包括类JTextArea,用于显示和编辑较长的、不带格式的多行文本,通常用于显示没有格式的帮助信息。纯文本区域的使用基于文档事件(即主要监听文档类型的事件DocumentEvent),程序通常使用文档事件监听器监听用户对纯文本区域的改变。
(3)带样式文本区域(styled text areas),包括类JEditorPane和JTextPane,可用于显示和编辑复杂的、带样式的文本。JEditorPane 类支持纯文本、HTML和RTF的文本编辑;JTextPane类进一步扩 展了JEditorPane类的功能,允许文本中嵌人图像或其他组件。
实例如下:
package com.hg.day28.demo01;
import javax.swing.*;
import java.awt.*;
public class TestTextDemo01 extends JFrame {
public TestTextDemo01(){
Container container = this.getContentPane();
JTextField textField = new JTextField("hello world");
JTextField textField2 = new JTextField("大数据五班");
container.add(textField,BorderLayout.NORTH);
container.add(textField2,BorderLayout.SOUTH);
this.setVisible(true);
this.setSize(500,350);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestTextDemo01();
}
}
运行结果:
实例如下:
package com.hg.day28.demo01;
import javax.swing.*;
import java.awt.*;
public class TestTextDemo02 extends JFrame {
public TestTextDemo02(){
Container container = this.getContentPane();
JPasswordField passwordField = new JPasswordField();
passwordField.setEchoChar('#');
container.add(passwordField);
Label label = new Label();
// JTextField textField = new JTextField("hello world");
// JTextField textField2 = new JTextField("大数据五班");
// container.add(textField,BorderLayout.NORTH);
// container.add(textField2,BorderLayout.SOUTH);
this.setVisible(true);
this.setSize(500,350);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new TestTextDemo02();
}
}
运行结果:
二、事件的类型和处理方法
AWT和Swing定义了多种类型的事件,这些事件大致可分为以下两大类型。
(1)低级事件。这类事件指由窗口系统发生的事件或者底层输入而产生的事件,主要包括组件事件(跟踪组件位置、大小可见性的变化)、容器事件(反映容器中组件的添加和删除)、焦点事件(组件获得或失去键盘焦点,拥有键盘焦点的组件可响应键盘的输入)、窗口事件(反映窗口或对话框的基本状态)、鼠标事件(用户使用鼠标进行交互)、键盘事件(用户使用键盘进行输入)等。
(2)语义事件。这类事件是指低级事件以外的具有丰富含义的与组件有关的事件,如单击按钮、拖动滚动条等。这些事件源于图形用户界面,其含义由程序设计员赋予,如单击“确定”按钮将确认刚才的操作,单击“取消”按钮将撤销刚才的操作。
在很多时候,这两种事件类型是重叠出现的,很难划分清楚。例如,当利用鼠标单击一个按钮时,既发生了单击鼠标的低级事件,同时又发生了单击按钮的语义事件。遇到这类情况应该如何处理完全取决于程序设计。在大多数情况下,高级语义事件优先于低级语义事件。
程序应尽可能监听语义事件而不是低级事件,因为语义事件具有更明确的语义,如事件源比较容易确定、应执行的事件处理动作比较明确等。低级事件通常有多个可能的事件源,就单击鼠标而言,用户界面的任何区域都可能单击鼠标,不同的区域需要进行不同的处理,不同的单击方式也可能要进行不同的处理,因此鼠标事件的监听往往十分复杂。语义事件则对这种低级事件进行了包装,使其目的更为明确,也更容易为编程人员所掌握。
绝大部分与图形用户界面有关的事件类都位于java.awt.event包中,其中包含了各种事件的监听接口,而在javax swing. event包中定义了与Swing事件有关的事件类。
实例演示:
package com.hg.day28.demo02;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextActionEvent {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(400,400);
frame.locate(400,300);
MyActionListener myListener = new MyActionListener();
Button button= new Button();
button.addActionListener(myListener);
frame.add(button,BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("大数据五班");
}
}
运行结果:
实例演示:
package com.hg.day28.demo02;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TextText01 {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends JFrame {
public MyFrame() {
TextField textField = new TextField();
this.add(textField);
MyActionListener2 myActionListener2=new MyActionListener2();
textField.addActionListener(myActionListener2);
textField.setEchoChar('#');
this.setVisible(true);
this.pack();
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
class MyActionListener2 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
TextField field = (TextField)e.getSource();
System.out.println(field.getText());
field.setText("");
}
}
运行结果:
2.1键盘监听
实例演示:
package com.hg.day28.demo03;
import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.security.Key;
public class TestKeyListener {
public static void main(String[] args) {
new KeyFrame();
}
}
class KeyFrame extends JFrame{
public KeyFrame(){
this.setBounds(10,10,300,400);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.addKeyListener(
new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int keycode = e.getKeyCode();
System.out.println(keycode);
if(keycode == KeyEvent.VK_0){
System.out.println("您按下了0");
}
if(keycode == KeyEvent.VK_UP){
System.out.println("您按下了上键");
}
}
});
}
}
运行结果:
实例演示:
运行结果:
2.2鼠标监听
实例演示:
package com.hg.day28.demo03;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
//鼠标监听
public class TestMouseListener {
public static void main(String[] args) {
new MyFrame("我的画图");
}
}
class MyFrame extends JFrame{
ArrayList points;
public MyFrame(String title){
super(title);
this.setBounds(200,200,400,400);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
points= new ArrayList<>();
this.addMouseListener(new MyMouseListener());
}
@Override
public void paint(Graphics g) {
Iterator iterator = points.iterator();
while (iterator.hasNext()){
Point point = (Point) iterator.next();
g.setColor(Color.cyan);
g.fillOval(point.x,point.y,10,10);
}
}
public void addPaint(Point point){
points.add(point);
}
private class MyMouseListener extends MouseAdapter{
@Override
public void mousePressed(MouseEvent e) {
MyFrame myFrame = (MyFrame) e.getSource();
System.out.println("x左标:"+e.getX()+"y左标"+e.getY());
myFrame.addPaint(new Point(e.getX(),e.getY()));
myFrame.repaint();
}
}
}
运行结果