java吧 关注:1,275,945贴子:12,791,472
  • 5回复贴,共1

求求各位谁能给我讲讲监听;拜谢。弄一天了。不懂

只看楼主收藏回复

//计算器的框架类--界面类
//导入包
import java.awt.*;
import java.awt.event.*; import javax.swing.*;
//利用继承来创建JFrame
//创建了一个名为CalFrame,属性是JFrame的框架
public class CalFrame extends JFrame {
JTextField jtf = null;
//客户认识工厂了
CalButton cb = new CalButton();
//客户认识工厂
CalTextField ctf = new CalTextField();
//客户认识了工厂
CalService cs = new CalService();
//监听器
ActionListener al = null;
//生成框架--构造方法
CalFrame(){
//super()--调用父类同参构造方法
//用父类构造方法来构造自己
super();
//设置可见性
setVisible(true);
//设置初始化的位置
setLocation(300, 200);
//设置窗口大小
setSize(400,300);
//设置标题
setTitle("计算器");
//设置窗口不可改变大小
setResizable(false);
//设置窗口关闭的方法
setDefaultCloseOperation(EXIT_ON_CLOSE);
//============================================================
//添加元素
//整个JFrame分成两块
//1-文本框
//2-按钮
//将按钮分成3个区域
//1-1X3
//2-5X1
//3-4X5
//=============================================================
//将JFrame分成南北两块
//将文本框放在JFrame的北面
//建立面板-panel--JPanel--jp1
JPanel jp1 = new JPanel();
jp1.setLayout(new BorderLayout(10,1));
//生产文本框
jtf = ctf.getTextField();
//新建文本框并添加到jp1上
//jp1.add(new JTextField(),BorderLayout.NORTH);
jp1.add(jtf,BorderLayout.NORTH);
//将jp1放置到JFrame北面
add(jp1,BorderLayout.NORTH);
//=============================================================
//按钮放到南面
//jp2
JPanel jp2 = new JPanel();
jp2.setLayout(new BorderLayout(10,1));
//jp2.add(new JTextField(),BorderLayout.NORTH);
//创建jp2的字面板
JPanel jp21 = new JPanel();
JPanel jp22 = new JPanel();
JPanel jp221 = new JPanel();
JPanel jp222 = new JPanel();
//生产按钮
JButton[] mButton = cb.getMButton();
JButton[] nButton = cb.getNButton();
JButton[] rButton = cb.getRButton();
//修改相应的panel布局格式
jp221.setLayout(new GridLayout(1,3,0,5));
jp222.setLayout(new GridLayout(4, 5, 0, 5));
jp21.setLayout(new GridLayout(5,1,0,5));
jp22.setLayout(new BorderLayout(0,5));
//将按钮放到相应的panel上
//for-each--当仅需遍历数组而无需访问单独数组元素时
//for( 每一个元素 : 所遍历范围 )
for(JButton b : nButton){
jp222.add(b);
//给nButton中的每一个按钮添加监听器---ActionListner--getActionListener()的返回值
//为什么是new MM,因为每个监听器只监听一个按钮--每个按钮都有独立的监听器
b.addActionListener(getActionListener());
}
//================================
/*
for(int i = 0 ; i < nButton.length; i++){
jp222.add(nButton[i]);
}
*/
//=================================
for(JButton b : rButton){
jp221.add(b);
}
for(JButton b : mButton){
jp21.add(b);
}
//将jp221放到jp22的北面
jp22.add(jp221,BorderLayout.NORTH);
//将jp222放到jp22的南面
jp22.add(jp222,BorderLayout.SOUTH);
//将jp21放到jp2的西面
jp2.add(jp21,BorderLayout.WEST);
//将jp22放到jp2的中间
jp2.add(jp22,BorderLayout.CENTER);
//将jp2放置到JFrame南面
add(jp2,BorderLayout.SOUTH);
//=============================================================
//整理界面元素,填充空白
pack();
}
//====================================================================
//监听器--内部类
/*
private class MouseMonitor extends MouseAdapter{
public void mouseClicked(MouseEvent me){
//获取所点击的按钮的指令字符串
}
}
*/
//监听器--用ActionListener
//用监听方法来实现--生成监听器
public ActionListener getActionListener(){
//生成监听器-赋予它对于相应操作的处理能力
al = new ActionListener(){
//actionPerformed--发生操作时调用
//因为该监听器监听的是按钮--那么发生的操作也就是点击
public void actionPerformed(ActionEvent ae){
//当AE ae的时候--按钮被点击了
//可以得到所点击的按钮的指令字符串
String cmd = ae.getActionCommand();
//将指令传递给CS工厂,工厂生产完毕将产品传递回来,存储在result中
String result = cs.callMethod(cmd,jtf.getText());
jtf.setText(result);
}
};
//得到具有上述功能的监听器
return al;
}
//验证界面
public static void main(String args[]){
CalFrame cf = new CalFrame();
}
}



IP属地:北京1楼2012-06-03 15:45回复
    //按钮类
    import java.awt.Color; import javax.swing.*;
    public class CalButton {
    //将按钮分类-3类
    //1-累加操作符
    public String[] mOp = {"MC","MR","MS","M+"};
    //2-结果操作符
    public String[] rOp = {"Backspace","CE","C"};
    //3-数字与运算符
    public String[] nOp = {"7","8","9","/","sqrt","4","5","6",
    "*","%","1","2","3","-","1/x","0","+/-",".","+","="};
    //nButton中的红色按钮字符串
    String redButton = "+-*/=";
    //创建按钮--生产的过程--接收订单--制作成品
    //1-构造方法
    //2-方法实现--在CF中调用CB的创建按钮方法时,可以得到按钮
    //将CB这个类看成关于按钮的模板类--工厂类--工厂模式
    //1-累加操作符
    public JButton[] getMButton(){
    //创建返回结果数组--长度=mOp的长度
    //创建返回结果数组--类型=JButton
    JButton[] result = new JButton[mOp.length+1];
    //创建按钮
    for(int i = 0 ; i < mOp.length;i++){
    //新建按钮--调用了JButton的构造方法
    //新建一个空按钮放到result[0]
    JButton b0 = new JButton();
    result[0] = b0;
    //创建了带有mOp[i]的文本的按钮
    JButton b = new JButton(mOp[i]);
    //设置按钮前景色为红**.setForeground(Color.RED);
    //将按钮存放到返回结果数组中
    result[i+1] = b;
    }
    //顺序执行,所有的按钮都创建完毕
    return result;
    }
    //2-结果操作符
    public JButton[] getRButton(){
    //创建返回结果数组--长度=rOp的长度
    //创建返回结果数组--类型=JButton
    JButton[] result = new JButton[rOp.length];
    //创建按钮
    for(int i = 0 ; i < rOp.length;i++){
    //新建按钮--调用了JButton的构造方法
    //创建了带有rOp[i]的文本的按钮
    JButton b = new JButton(rOp[i]);
    //设置按钮前景色为红**.setForeground(Color.RED);
    //将按钮存放到返回结果数组中
    result[i] = b;
    }
    //顺序执行,所有的按钮都创建完毕
    return result;
    }
    //3-数字与运算符
    public JButton[] getNButton(){
    //创建返回结果数组--长度=nOp的长度
    //创建返回结果数组--类型=JButton
    JButton[] result = new JButton[nOp.length];
    //创建按钮
    for(int i = 0 ; i < nOp.length;i++){
    //新建按钮--调用了JButton的构造方法
    //创建了带有rOp[i]的文本的按钮
    JButton b = new JButton(nOp[i]);
    /*
    if(b.getText().equals("/") || b.getText().equals("*") ||
    b.getText().equals("+") ||b.getText().equals("-") ||
    b.getText().equals("=") ){
    b.setForeground(Color.RED);
    }else{
    b.setForeground(Color.BLUE);
    }
    */
    if(redButton.indexOf(nOp[i])!= -1){
    b.setForeground(Color.RED);
    }else{
    b.setForeground(Color.BLUE);
    }
    //将按钮存放到返回结果数组中
    result[i] = b;
    }
    //顺序执行,所有的按钮都创建完毕
    return result;
    }
    }


    IP属地:北京2楼2012-06-03 15:46
    回复
      2025-08-29 11:24:30
      广告
      不感兴趣
      开通SVIP免广告
      //计算器服务类
      //1-按键值的获取
      public class CalService {
      //从CF获取指令--点击了按钮,将此按钮所代表的值进行判断,然后将结果返回
      //生产过程方法
      //返回类型--是该方法生产的商品的类型--商品就是文本框中显示的内容
      //--文本--所以确定为字符串类型--String
      //形参就是我们的订单指令--由ActionEvent--getActionCommand()--String类型的指令
      //--鼠标操作字符串
      //===================================================================
      //建立一个数字字符串
      private String numString = "0123456789.";
      private String opString = "+-×/";
      //储存运算符
      public String op = null;
      //储存操作数1
      public String firstNum = null;
      //储存操作数2
      public String secondNum = null;
      public String callMethod(String cmd , String text){
      //如果cmd代表的是数字的话==cmd是一个数字
      //indexOf()可以返回cmd在nS中的位置
      //换言之,cmd是数字
      if(numString.indexOf(cmd) != -1){
      //将所按按钮的值以字符串的形式返回
      //方法--将以确认是数字身份的cmd放到catchNum方法中具体判断到底是哪一个数字
      return catchNum(cmd , text);
      }else if(opString.indexOf(cmd) != -1){
      //执行四则运算的方法--1-存储操作数1,2-存储op
      return setOp(cmd,text);
      }else if(cmd.equals("=") ){
      //计算并显示结果
      return cal(String text);
      }
      return null;
      }
      public String catchNum(String cmd , String text){
      String result = null;
      //cmd的值就是那个数字
      //如果当前文本不是”0“
      if(!text.equals("0")){
      //如果当前点击的按钮是".",并且当前文本中没有"."
      if(cmd.equals(".") && !text.contains(".")){
      //将"."加到当前文本中
      result = text + cmd;
      //如果当前文本中已包含".",并且输入的是"."
      }else if(cmd.equals(".")){
      //不做改变
      result = text;
      //否则添加输入
      }else{
      result = text + cmd;
      }
      }else{
      result = cmd;
      }
      //当小数点打头的时候,前面补0
      if(result.startsWith(".")){
      result = "0"+result;
      }
      /*
      if(result.indexOf(".") == 0){
      result = "0"+result;
      }*/
      return result;
      }
      //四则运算的方法
      public String setOp(String cmd , String text){
      op = cmd;
      firstNum = text;
      secondNum = null;
      return null;
      }
      //计算方法
      public String cal(String text){
      secondNum = text;
      }
      } /*
      else if(cmd == C){
      //执行清空的方法
      return clearAll();
      }else if(cmd == CE){
      //执行清除当前文本框文本的方法
      return clear();
      }else if(cmd == Backspace){
      //执行退格的方法
      return backSpace();
      }else if(cmd = 四则){
      //执行四则运算的方法
      return cal();
      }else if(cmd = 1/x ){
      //执行求倒数的方法
      return 方法--求倒数
      }else if(cmd = sqrt){
      //执行开方的方法
      return 方法--开平方
      }else if(cmd = %){
      //执行求百分数的方法
      return 方法--百分数
      }else if(cmd = =){
      //计算并显示结果
      return 方法--计算并显示结果
      }else{
      //M五兄弟
      return M操作
      }
      */


      IP属地:北京3楼2012-06-03 15:46
      回复
        //生产文本框的类
        import java.awt.Color; import javax.swing.*;
        public class CalTextField {
        //构造方法
        //用方法来替代
        //返回类型--生产的商品
        public JTextField getTextField(){
        JTextField jtf = new JTextField();
        //设置文本框不可编辑
        jtf.setEditable(false);
        //设置文本框背景颜色为白色
        jtf.setBackground(Color.WHITE);
        //设置文本框默认文本为0
        jtf.setText("0");
        //设置文本框右对齐
        jtf.setHorizontalAlignment(JTextField.RIGHT);
        return jtf;
        }
        }
        //---------------------------------------------------------
        以上是我们老师写的但是他的方法和书上很不一样,弄到我蒙了,谁能指点指点我让我彻彻底底的能会用监听


        IP属地:北京4楼2012-06-03 15:46
        回复
          你就说你不知道监听器不就得了 还搞那么多废代码上了干嘛。。。
          别把监听器想得那么神奇 你就把他理解成一个普通的类 帮你封装了一些普通的方法
          然后你在该方法中重写了什么方法 要实现什么功能 把要监听的对象加进去 他就执行监听器里的方法


          5楼2012-06-03 16:30
          回复
            监听 就是一触发器 当使用 使用 add对其监听 当触发它是 会在actionperformed(感觉有点像 switch) 接受触发 并响应


            6楼2012-06-03 18:03
            回复