今天早上的两点收获:
1、addActionListener(其中的setActionCommand函数就是要对对象进行唯一性的标记,便于消息传来后进行处理。理论上actionlistener可以全部代替其他监听,我是这么认为的,因为其标记的唯一性,但是这样的话会让某些很简单的监听变得复杂,所以一般只对要唯一性判断的监听才用)
2、消息监听只是对特定的对象进行特定方式的监听,监听的结果是一大堆的事件,所以要判断某个按钮是否被点击还是得要对传来的消息进行具体按钮的判断
另外,绘图是要记得手动进行repaint函数的调用。
Demo代码:
/* * 实现java事件监听机制 */ package com.listener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.*; public class Demo9_5 extends JFrame { //定义组件 JButton jb1,jb2; MyPanel jp1; public static void main(String[] args) { Demo9_5 demo9_5 = new Demo9_5(); } public Demo9_5() { //创建组件 jb1 = new JButton("黑色"); jb2 = new JButton("红色"); //添加组件 jp1 = new MyPanel(); jb1.setActionCommand("black"); jb2.setActionCommand("red"); this.setLayout(new GridLayout(3,1)); //设置布局样式 this.add(jb1); this.add(jp1); this.add(jb2); //注册监听! jb1.addActionListener(jp1); jb2.addActionListener(jp1); //显示窗体 this.setSize(400,300); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MyPanel extends JPanel implements ActionListener { //画出背景颜色 int c = 0; public void paint(Graphics g) { super.paint(g); //获取当前mypanel的宽和高 int w,h; w = this.getWidth(); h = this.getHeight(); if(c == 0) { g.fillRect(0, 0, w, h); } else if(c == 1) { g.setColor(Color.red); g.fillRect(0, 0, w, h); } } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(e.getActionCommand() == "black") { c = 0; repaint(); System.out.println("BLACK"); } if(e.getActionCommand() == "red") { c = 1; repaint(); System.out.println("RED"); } } }
红黑色背景切换。