文章目录
1:MouseEvent事件(鼠标事件)
任何组件均可触发数鼠标事件,当鼠标在事件源上点击、释放、移入以及移除时会触发此事件。MouseEvent类创建一个新的对象。这些事件源注册事件源的方法是:addMouseListener(MouseListener listener)
。
1:利用接口MouseListener实现五个鼠标事件
接口内的几种方法:
1:mousePressed(MouseEvent) //按下鼠标的处理事件函数
2:mouseRelease(MouseEvent)// 释放鼠标的处理事件函数
3:mouseEntered(MouseEvent) //鼠标进入组件后事件的处理函数
4:mouseExited(MouseEvent) //鼠标退出组件事件的处理函数
6:mouseclicked(MouseEvent) //鼠标单击某个事件源的事件处理函数
MouseEvent可以调用的常用方法如下:
1:getX() //获取鼠标指针在事件源坐标系中的x坐标
2:getY() //获取鼠标指针在事件源坐标系中的y坐标
3:getModifers() //获取鼠标的左键或者右键。(BUTTON1_MASK,BUTTON3_MASK)
4:getClickCount() //获取鼠标被单击的次数
5:getSourse() //获取发生鼠标事件的事件源
事件源注册监听器,事件源是实现MouseEvent接口类的实例,
2:利用接口MouseMotionListener处理鼠标事件
MouseMotionListener可以处理的鼠标事件有:事件源上拖动鼠标以及在事件源上移动鼠标。
1:注册监听器
调用方法addMouseMotionListener(MouseMotionListener Listener)
2:MouseMotionListener接口中的方法
1:MouseDragged(MouseEvent) //处理拖动是事件的处理
2:MouseMoved(MouseEvent) //处理移动事件的处理
可以利用拖动函数实现对组件的拖动效果,如:
Test_Main.java
public class Test_Main {
public static void main(String[] args) {
WindowMove win=new WindowMove();
win.setTitle("处理鼠标拖动事件");
win.setBounds(10,10,460,360);
}
}
WindowMove.java
import javax.swing.*;
import java.awt.*;
public class WindowMove extends JFrame {
LP layerePane;
WindowMove(){
layerePane=new LP();
add(layerePane, BorderLayout.CENTER);
setVisible(true);
setBounds(12,12,300,300);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
}
LP.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
public class LP extends JLayeredPane implements MouseListener, MouseMotionListener {
JButton jButton;
int x,y,a,b,x0,y0;
LP(){
jButton=new JButton();
jButton.addMouseListener(this);
jButton.addMouseMotionListener(this);
setLayout(new FlowLayout());
add(jButton,JLayeredPane.DRAG_LAYER);
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
JComponent com=null;
com=(JComponent) e.getSource();
setLayer(com,JLayeredPane.DRAG_LAYER);
a=com.getBounds().x;
b=com.getBounds().y;
x0=e.getX();
y0=e.getY();
}
@Override
public void mouseReleased(MouseEvent e) {
JComponent com=null;
com=(JComponent) e.getSource();
setLayer(com,JLayeredPane.DRAG_LAYER);
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseDragged(MouseEvent e) {
Component com=null;
if(e.getSource()instanceof Component)
{
com=(Component) e.getSource();
a=com.getBounds().x;
b=com.getBounds().y;
x=e.getX();
y=e.getY();
a+=x;
b+=y;
com.setLocation(a-x0,b-y0);
}
}
@Override
public void mouseMoved(MouseEvent e) {
}
}
2:焦点事件
组件可以触发焦点事件,组件可以使用addFocusListener(FocusListener listener)
注册焦点事件监视器。创建监视器的类必须实现接口FocusListener。改接口有两个方法:
1:public void focusGained(FocusEvent e) //从有输入焦点到无输入焦点触发。
2:public void focusLost(FocusEvent e) //从无输入焦点到有输入焦点触发
//组件也可以调用下面方法获得焦点
public boolean requestFocusInWindow()
3:键盘事件
当按下或者释放键盘某个键位就会触发事件。
三个处理键盘事件的方法:
1:public void KeyPressed(KeyEvent e) //按下键位
2:public void KeyRelease(KeyEvent e) //释放键位
3:public void KeyType(KeyEvent e) //组合键位表示按下有释放时
组件使用方法addKeyLitener( KeyEvent e)
方法注册监听器,可以调用getKeyCode判断那个键位被按下。也可以使用getKeyChar()来返回按下键位的字符。
4:窗口事件
JFrame是Window的子类 ,凡是Window的子类均可以发生WindowEvent事件。
1:WindowListener接口
当一个窗口被激活,打开,关闭等操作时,就会触发窗口事件。即WindowEvent类创建一个实例对象,它调用getWindow()可以获得发生窗口事件的窗口。窗口使用addWindowListener()
注册监听器,监听器需要实现indowListener接口。改接口包含以下七个方法:
1:public void WindowActivated(WindowEvent e) //从非激活状态到激活状态调用
2:public void WindowDeactivated(WindowEvent e) //激活到非激活状态调用
3:public void WindowClosing(WindowEvent e) //正在被关闭是调用
4:public void WindowClosed(WindowEvent e) //已经关闭的窗口调用
5:public void WindowIconified(WindowEvent e) //当窗口图表化时。调用此方法
6:public void WindowDeiconified(WindowEvent e) //撤销图表化时
7:public void WindowOpened(WindowEvent e) //当窗口打开时
2:WindowAdapter适配器
当一个类实现一个接口时,需要在类体中实现所有的接口方法,然而有时候我们不需要实现每个方法,只需要实现其中一个或者几个时,其他的方法就会显得代码很复杂,因此我们可以使用适配器。它实现了接口的所有方法,我们只需要对其子类对使用到的方法重写即可。
例如:
Test_main.java
public class Test_main {
public static void main(String[] args) {
new MyFrame("窗口");
}
}
MyFrame.java
import javax.swing.*;
public class MyFrame extends JFrame {
Boy police;
MyFrame(String s)
{
super(s);
police=new Boy();
setBounds(100,100,200,300);
setVisible(true);
addWindowListener(police);
validate();
}
}
Boy.java
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Boy extends WindowAdapter { //只需要对使用的方法进行重写即可
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
3:匿名类实例或者窗口做监听器
- 匿名类实例做监听器时,事件发生时监听器就可以比较方便使用外嵌类的成员变量,而不用再去传递参数,适用于处理事件比较简单,系统不复杂时,如果系统复杂不建议这样,因为修改代码后,编译的部分还包括外嵌类的代码。
- 窗口做监视器:一般触发事件的组件均在窗口内。所以可以让窗口作为其监听器,窗口可以方便的操控窗口内部的成员。同样适用于系统简单的程序。
5:对话框
1消息对话框
实现的静态方法(位于javax.swing包中的类JOptionPane类):
public static void showMessageDialog(Component parentComponet,String message,String title,int messageType)
/*此方法用来创建一个对话框,第一个参数指定对话框的可见位置,null是在屏幕正前方。第二个参数为提示的文字。
第三个参数对话框的标题,第四个参数指定对话框的类型有下面几种取值:
INFORMATION_MESSAGE
WARNING_MESSAGE
ERROR_MESSAGE
QUESTION_MESSAGE
PLAIN_MESSAGE
分别代表五种不同的对话框显示图标。
例如:
import javax.swing.*;
public class Test_main {
public static void main(String[] args) {
new MyFrame("窗口");
JOptionPane.showMessageDialog(null,"你输入了非法字符","提示对话框",JOptionPane.WARNING_MESSAGE);
}
}
运行结果为:
2:输入对话框
输入对话框含有供用户输入文本的文本框,一个确认个取消按钮。是有模式的对话框。实现方法为:
public static String showInputDialog(Component parentComponent,Object message,String title,int MessageType)
/*此方法用来创建一个对话框,第一个参数指定输入对话框所依赖的组件,会在该组件的正前方显示出来。第二个参数为提示的文字。
第三个参数对话框的标题,第四个参数指定对话框的类型有下面几种取值:
INFORMATION_MESSAGE
WARNING_MESSAGE
ERROR_MESSAGE
QUESTION_MESSAGE
PLAIN_MESSAGE
分别代表五种不同的对话框显示图标。
例如:
import javax.swing.*;
public class Test_main {
public static void main(String[] args) {
new MyFrame("窗口");
JOptionPane.showInputDialog(null,"请输入你的学号","提示对话框",JOptionPane.WARNING_MESSAGE);
}
}
运行结果:
3:确认对话框
确认对话框是有模式的对话框,实现方法为:
public static int showConfirmDialog(Component parentComponent,Object message,String title,int MessageType)
/*此方法用来创建一个对话框,第一个参数指定输入对话框所依赖的组件,会在该组件的正前方显示出来。
*第二个参数为提示的文字。
*第三个参数对话框的标题,
*第四个参数指定对话框的类型有下面几种取值:
YES_NO_OPTION
YES_NO_CANCEL_OPTION
OK_CENCEL_OPTION
分别代表三种不同的对话框按钮显示。
例如:
import javax.swing.*;
public class Test_main {
public static void main(String[] args) {
new MyFrame("窗口");
JOptionPane.showConfirmDialog(null,"请输入你的学号","提示对话框",JOptionPane.YES_NO_CANCEL_OPTION);
}
}
运行结果为:
4:颜色对话框
创建一个有模式的颜色对话框,实现方法为:
public static Color showDialog(Component component,String title,Color initialColor)
/*此方法用来创建一个颜色对话框,第一个参数指定输入对话框所依赖的组件,会在该组件的正前方显示
出来。第二个参数对话框的标题,第三个参数指定颜色对话框返回的初始颜色。
*方法的返回值为颜色或者null
*需要注意的是此方法时类JColorChooser中的方法。上面是三个均是JOptionPane类中的方法
例如:
import javax.swing.*;
import java.awt.*;
public class Test_main {
public static void main(String[] args) {
new MyFrame("窗口");
Color newcolor=JColorChooser.showDialog(null,"调色板", Color.red);
}
}
运行结果:
5:自定义对话框
创与建自定义对话框与窗口的创建一致,可以在对话框内布置组件,不允许一个对话框添加到另一个容器中。构造对话框的两个常用方法:
JDialog() /*构造一个无标题的初始化不可见的对话框。对话框运行在一个迷人不可见的窗口内,
此窗口有java环境提供。*/
JDialog(JFrame owner) //构造一个无标题的初始化不可见的无模式对话框,owean是依赖的窗口。
例如:
Test_main.java
public class Test_main {
public static void main(String[] args) {
MyWindow win=new MyWindow();
win.setTitle("带自定义对话框的窗口");
win.setSize(200,300);
}
}
MyWindow.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyWindow extends JFrame implements ActionListener {
JButton jButton;
MyDialog dialog;
MyWindow()
{
init();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void init(){
jButton=new JButton("打开对话框");
jButton.addActionListener(this);
add(jButton, BorderLayout.NORTH);
dialog=new MyDialog(this,"我是对话框");//第二个构造方法
dialog.setModal(true); //设置对话框模式为有模式。
}
@Override
public void actionPerformed(ActionEvent e) {
dialog.setVisible(true);
String str=dialog.getTitle();
setTitle(str);
}
}
MyDialog.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyDialog extends JDialog implements ActionListener {
JTextField inputTitle;
String Title;
public MyDialog(JFrame f ,String s) {
inputTitle=new JTextField(10);
inputTitle.addActionListener(this);
setLayout(new FlowLayout());
add(new JLabel("请输入标题"));
add(inputTitle);
setBounds(60,60,100,100);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
Title=inputTitle.getText();
setVisible(false);
}
public String getTitle(){
return Title;
}
}
6:树组件与表格组件
1:树组件
JTree类的对象称为树组件。
- DefaultMutableTreeNode结点
树组件是由n个结点组成的,除了根节点外,结点分为带子结点的分支节点以及叶结点。javax.swing.tree包提供的类 DefaultMutableTreeNode实现了接口 MutableTreeNode,它的对象实例就是一个结点。有两个构造方法如下:
1: DefaultMutableTreeNode(Object userObject) /*默认可以有子节点,利用方法add()添加别的结点为
自己的子节点。*/
2: DefaultMutableTreeNode(Object userObject,boolean allowChildren)/*第二个参数设置是否可以拥有子节点。
- 树上的TreeSelectionEvent事件
树组件可以触发TreeSelectionEvent事件,树组件使用addTreeSelectionLisener(treeSelectionListener listener )
方法创建一个监听器。监视器必须实现接口TreeSelectionListener。
@接口中的方法为public void valueChange(TreeSelectionEvent e)
@树可以调用getLastSelectionPathCompenet()
方法获取选中的结点。
例如:
Test_main.java
public class Test_main {
public static void main(String[] args) {
TreeWin win=new TreeWin();
}
}
TreeWin.java
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.*;
public class TreeWin extends JFrame implements TreeSelectionListener {
JTree jTree;
JTextArea jTextArea;
TreeWin(){
DefaultMutableTreeNode root=new DefaultMutableTreeNode("商品");
DefaultMutableTreeNode TVnode=new DefaultMutableTreeNode("电视");
DefaultMutableTreeNode PhoneNode=new DefaultMutableTreeNode("电视");
DefaultMutableTreeNode tv1=new DefaultMutableTreeNode(new Goods("长虹",5659));
DefaultMutableTreeNode tv2=new DefaultMutableTreeNode(new Goods("海尔",5656));
DefaultMutableTreeNode phone1=new DefaultMutableTreeNode(new Goods("华为",3356));
DefaultMutableTreeNode phone2=new DefaultMutableTreeNode(new Goods("小米",3285));
root.add(TVnode);
root.add(PhoneNode);
TVnode.add(tv1);
TVnode.add(tv2);
PhoneNode.add(phone1);
PhoneNode.add(phone2);
jTree=new JTree(root);
jTree.addTreeSelectionListener(this);
jTextArea=new JTextArea();
setLayout(new GridLayout(1,2));
add(new JScrollPane(jTree));
add(new JScrollPane(jTextArea));
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
setBounds(80,80,300,300);
validate();
}
@Override
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node =(DefaultMutableTreeNode)jTree.getLastSelectedPathComponent(); //找到被选中的结点
if(node.isLeaf())
{
Goods s=(Goods)node.getUserObject();
jTextArea.append(s.name+","+s.price+"元\n");
}
else
{
jTextArea.setText(null);
}
}
}
Goods.java
public class Goods {
String name;
double price;
Goods(String s,double n){
name=s;
price=n;
}
public String toString(){
return name;
}
}
运行结果如下:
2:表格组件
表格组件以行和列显示数据,JTable类可以建立一个表格模型。JTable有7个构造方法,下是常用的三个:
1:JTable() //默认的表格模型
2:JTale(int a,int b) //a行b列的表格
3:JTable(Object data[][],Object columnName[]) //创建默认的表格模型对象,并且显示由data指定的二维数组的值。列名由数组columnName指定。
例如:
test_main.java
public class Test_main {
public static void main(String[] args) {
WinTable win=new WinTable();
}
}
WinTable.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class WinTable extends JFrame implements ActionListener {
JTable table;
Object a[][]; //表格显示的内容
Object name[]={"姓名","英语成绩","数学成绩","总成绩"}; //表格表头
JButton jButton;
WinTable(){ //初始化表格内容
a=new Object[8][4];
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 4; j++) {
if (j != 0) {
a[i][j] = '0';
} else {
a[i][j] = "姓名";
}
}
}
jButton=new JButton("计算每人的总成绩");
table=new JTable(a,name); //第二个构造方法
jButton.addActionListener(this);
Container con=getContentPane();
getContentPane().add(new JScrollPane(table),BorderLayout.CENTER);
con.add(new JLabel("修改后数据,需要回车确认"),BorderLayout.SOUTH);
con.add(jButton,BorderLayout.SOUTH);
setSize(200,200);
setVisible(true);
validate();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < 8; i++) {
double sum=0;
boolean boo=true;
for (int j = 0; j <=2 ; j++) {
try {
sum=sum+Double.parseDouble(a[i][j].toString());
}
catch (Exception ee){
boo=false;
table.repaint();
}
if(boo==true)
{
a[i][3]=""+sum;
table.repaint();
}
}
}
}
}