当我们搭建好图形界面窗体的时候,需要向窗体中加入各种组件,便于用户操作,用户在窗体中都会有哪些操作呢?窗体是程序与使用者可交互的接口,比如说登录界面,用户可以输入姓名和密码,点击登录按钮,登录到另一个界面,在下一个界面有更多的操作,比如说有多个选择组成的菜单,需要输入文本的文本框,用来标记的标签等。综上,一个窗体中有多个组件,组件有文本组件,按钮组件,标签组件和列表组件。当然了,一个窗体中有组件是不够的,还需要在窗体中加入监听事件,监听事件也就是说当用户点击相应的组件的时候,程序作出的响应反应,比如说登录界面点击登录按钮以后,监听器事件就是检测密码是否正确,然后选择跳入到另一个界面,这样的话,如何在窗体中加入组件呢?监听器事件有哪些类型,如何定义呢?
在窗体中加入各种组件便于用户操作,组件有文本组件,按钮组件,标签组件和列表组件。
具体的组件设计方式可见Java Swing 图形界面开发(目录)
1. 文本组件
JTextField 是一个轻量级组件,它允许编辑单行文本。
JavaSwing_2.6: JTextField(文本框)
JPasswordField 是一个轻量级组件,允许编辑单行文本,其视图指示键入内容,但不显示原始字符,显示为密码框。
JavaSwing_2.7: JPasswordField(密码框)
JTextArea 是一个显示纯文本的多行区域。
JavaSwing_2.8: JTextArea(文本区域)
示例代码:
package VideoTest;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class TEST02 extends JFrame
{
public TEST02()
{
super("SwingDemo");//定义名称
JPanel root = new JPanel();//实例化容器
root.add(new JTextField("我是JTextField"));//加入文本框
root.add(new JPasswordField("我是JPasswordField"));//加入密码框
root.add(new JTextArea("我是JTextArea"));//加入文本域
add(root);
//定义窗体相关参数
setSize(400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args)
{
new TEST02();
}
}
2. 按钮组件
-单选按钮(JRadioButton), 实现一个单选按钮,此按钮项可被选择或取消选择,并可为用户显示其状态。与 ButtonGroup 对象配合使用可创建一组按钮,一次只能选择其中的一个按钮。
JavaSwing_2.3: JRadioButton(单选按钮)
3. 标签组件
setJMenuBar( JMenuBar bar);
该方法将菜单条添加到窗口的顶端,需要注意的是,只能向窗口添加一个菜单条。
JavaSwing_4.5: JMenuBar(菜单栏)
JMenuItem(String text, Icon icon)
package VideoTest;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.WindowConstants;
/**
* 菜单条,菜单,菜单项的关系是:菜单项是菜单的具体名称,菜单加入到菜单条中,菜单条加入容器中,
* 菜单条是将菜单放入窗体的方法,具体而言,饭店的菜单上,菜单条就是大饭店的菜单本,菜单就是饭店菜单的菜单页
* 菜单项就是具体的某一个菜的名称。
*/
public class TEST02 extends JFrame {
JMenuBar menubar;//实例化 菜单条
JMenu menu, subMenu;//实例化菜单
JMenuItem item1, item2;//实例化菜单项
public static void main(String[] args) {
TEST02 win = new TEST02("带窗口的菜单", 20, 30, 400, 500);
}
public TEST02() {
}
//定义方法设置窗体的参数,输入窗体的大小,名称,和位置
public TEST02(String s, int x, int y, int w, int h) {
init(s);
setLocation(x, y);
setSize(w, h);
setVisible(true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
void init(String s) {
setTitle(s);
menubar = new JMenuBar();
menu = new JMenu("菜单"); // JMnud的实例就是一个菜单
/**
* 一级菜单项
*/
subMenu = new JMenu("软件项目"); // 子菜单
item1 = new JMenuItem("Java话题"); // 创建菜单项
//使用JMenuItem的构造方法设置图标
item2 = new JMenuItem("动画话题" );
item1.setAccelerator(KeyStroke.getKeyStroke('A'));
item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
//菜单项加入菜单中。
menu.add(item1);
menu.addSeparator();
menu.add(item2);
menu.add(subMenu);
/**
* 添加二级菜单项
*/
subMenu.add(new JMenuItem("汽车销售系统" ));
subMenu.add(new JMenuItem("农场信息系统" ));
menubar.add(menu); // 菜单条中加入菜单
setJMenuBar(menubar); // 添加一个菜单条
}
}
常见组件组合的实例:
import java.awt.FlowLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/*
* 这个里最包含了JavaGUI中的多个组件,
*/
public class TEST02 extends JFrame {
JTextField text;//实例化文本
JButton button;//实例化按钮
JCheckBox checkBox1, checkBox2, checkBox3;
JRadioButton radio1, radio2;//实例化单选按钮
ButtonGroup group;//实例化按钮组件
JComboBox
JTree,树。将分层数据显示为树状轮廓的组件
JavaSwing_4.9: JTree(树)
JTable,表格。JTable 是用来显示和编辑常规二维单元表。
JavaSwing_4.8: JTable(表格)
任何支持GUI的操作环境都需要不断地监听按键或者点击鼠标这样的事件,操作环境将这些事件报告给正在运行的程序,如果事件发生,每个程序将决定如何对他们做出反应,当事件发生时,事件源将事件对象传递给注册的监听器对象,监听器对象将利用事件的信息决定如何对事件做出反应。
Java监听器事件主要有事件源,事件监听器和事件组成。
1.事件对象:
一般继承自java.util.EventObject对象,由开发者自行定义.
2.事件源:
就是触发事件的源头,注册监听器对象,并发送事件对象,不同的事件源会触发不同的事件类型.
3.事件监听器:
事件监听器负责监听事件源发出的事件.一个事件监听器通常实现java.util.EventListener这个标识接口.
监听器事件的处理流程: 事件源可以注册事件监听器对象,并可以向事件监听器对象发送事件对象.事件发生后,事件源将事件对象发给已经注册的所有事件监听器.
监听器对象随后会根据事件对象内的相应方法响应这个事件.换句话来说,事件监听器监听到事件源的发生以后,执行事件的行为。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
/**
* 这段程序的作用在于在窗体中加入三个按钮,点击不同的按钮,窗体的颜色会发生变化。
*/
public class Test01 extends JFrame{
private JPanel buttonPanel;
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200;
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
//定义窗体
Test01 frame = new Test01();
frame.setTitle("ButtonTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
public Test01()
{
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// create buttons
JButton yellowButton = new JButton("Yellow");
JButton blueButton = new JButton("Blue");
JButton redButton = new JButton("Red");
buttonPanel = new JPanel();
// add buttons to panel
buttonPanel.add(yellowButton);
buttonPanel.add(blueButton);
buttonPanel.add(redButton);
// add panel to frame
add(buttonPanel);
// create button actions
ColorAction yellowAction = new ColorAction(Color.YELLOW);
ColorAction blueAction = new ColorAction(Color.BLUE);
ColorAction redAction = new ColorAction(Color.RED);
// associate actions with buttons
yellowButton.addActionListener(yellowAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);
}
/**
* An action listener that sets the panel's background color.
*/
private class ColorAction implements ActionListener
{
private Color backgroundColor;
public ColorAction(Color c)
{
backgroundColor = c;
}
public void actionPerformed(ActionEvent event)
{
buttonPanel.setBackground(backgroundColor);
}
}
}
基于鼠标的监听器事件:
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.*;
/*
*这个程序定义一个窗体,然后窗体监听鼠标事件,当鼠标出现在窗体中时,通过监听鼠标事件
*点击窗体,则显示鼠标所在的位置,以及点击次数等
**/
public class Test01 extends JFrame{
My_Panel mp = null;
public Test01() {
mp = new My_Panel();
this.add(mp);
// 注册监听
this.addMouseListener(mp); // 监听鼠标
this.addKeyListener(mp); // 监听键盘
this.addMouseMotionListener(mp); // 监听鼠标移动
//定义窗体的相关参数
this.setSize(300, 300); // 设置框体大小
this.setLocation(400,150); //设置框体显示的位置
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置框体退出
this.setVisible(true); // 显示框体
}
public static void main(String[] args) {
Test01 d = new Test01();
}
}
class My_Panel extends JPanel implements MouseListener,KeyListener,MouseMotionListener{
public void paint(Graphics g){
super.paint(g);
}
//鼠标点击
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("鼠标点击");
System.out.println("鼠标位置 x = "+e.getX()+" y = "+e.getY());
System.out.println("鼠标键 = "+e.getButton() + " 点击次数 "+e.getClickCount()); // 输出1是左键,2是中键,3是右键
}
//鼠标移动到My_Panel
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
// System.out.println("鼠标移动到My_Panel");
}
//鼠标离开My_Panel
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
// System.out.println("鼠标离开My_Panel");
}
//鼠标按下
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
// System.out.println("鼠标按下");
}
//鼠标松开
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
// System.out.println("鼠标松开");
}
//键按下
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
System.out.println("键 = "+e.getKeyChar());
}
//键松开
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
//键输入
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
//鼠标按键在组件上按下并拖动时调用
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
// System.out.println("鼠标按键在组件上按下并拖动时调用");
}
//鼠标光标移动到组件上但无按键按下时调用
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
// System.out.println("鼠标光标移动到组件上但无按键按下时调用");
}
}
运行效果如图: