Java学习笔记-组件及处理事件(三)(MouseEvent,对话框Dialog,表格组件,树组件)

1:MouseEvent事件(鼠标事件)

任何组件均可触发数鼠标事件,当鼠标在事件源上点击、释放、移入以及移除时会触发此事件。MouseEvent类创建一个新的对象。这些事件源注册事件源的方法是:addMouseListener(MouseListener listener)

1:利用接口MouseListener实现五个鼠标事件

接口内的几种方法:

1mousePressed(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接口中的方法

1MouseDragged(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。改接口有两个方法:

1public void focusGained(FocusEvent e) //从有输入焦点到无输入焦点触发。
2public void focusLost(FocusEvent e) //从无输入焦点到有输入焦点触发
//组件也可以调用下面方法获得焦点
public boolean requestFocusInWindow()

3:键盘事件

当按下或者释放键盘某个键位就会触发事件。
三个处理键盘事件的方法:

1public void KeyPressed(KeyEvent e) //按下键位
2public void KeyRelease(KeyEvent e)  //释放键位
3public void KeyType(KeyEvent e) //组合键位表示按下有释放时

组件使用方法addKeyLitener( KeyEvent e)方法注册监听器,可以调用getKeyCode判断那个键位被按下。也可以使用getKeyChar()来返回按下键位的字符。

4:窗口事件

JFrame是Window的子类 ,凡是Window的子类均可以发生WindowEvent事件。

1:WindowListener接口

当一个窗口被激活,打开,关闭等操作时,就会触发窗口事件。即WindowEvent类创建一个实例对象,它调用getWindow()可以获得发生窗口事件的窗口。窗口使用addWindowListener()注册监听器,监听器需要实现indowListener接口。改接口包含以下七个方法:

1public void WindowActivated(WindowEvent e)  //从非激活状态到激活状态调用
2public void WindowDeactivated(WindowEvent e)  //激活到非激活状态调用
3public void WindowClosing(WindowEvent e)   //正在被关闭是调用
4public void WindowClosed(WindowEvent e)   //已经关闭的窗口调用 
5public void WindowIconified(WindowEvent e)  //当窗口图表化时。调用此方法
6public void WindowDeiconified(WindowEvent e)  //撤销图表化时
7public 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:匿名类实例或者窗口做监听器

  1. 匿名类实例做监听器时,事件发生时监听器就可以比较方便使用外嵌类的成员变量,而不用再去传递参数,适用于处理事件比较简单,系统不复杂时,如果系统复杂不建议这样,因为修改代码后,编译的部分还包括外嵌类的代码。
  2. 窗口做监视器:一般触发事件的组件均在窗口内。所以可以让窗口作为其监听器,窗口可以方便的操控窗口内部的成员。同样适用于系统简单的程序。

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类的对象称为树组件。

  1. DefaultMutableTreeNode结点
    树组件是由n个结点组成的,除了根节点外,结点分为带子结点的分支节点以及叶结点。javax.swing.tree包提供的类 DefaultMutableTreeNode实现了接口 MutableTreeNode,它的对象实例就是一个结点。有两个构造方法如下:
1DefaultMutableTreeNode(Object userObject) /*默认可以有子节点,利用方法add()添加别的结点为
自己的子节点。*/
2DefaultMutableTreeNode(Object userObject,boolean allowChildren)/*第二个参数设置是否可以拥有子节点。
  1. 树上的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个构造方法,下是常用的三个:

1JTable() //默认的表格模型
2JTale(int a,int b) //a行b列的表格
3JTable(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();
                }
            }

        }

    }
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值