📄 java10.txt
字号:
事件 所有事件都具有三个要素: 事件源:一个事件的发起者(按钮) //落实在类上(组件负责生成事件源,事件源产生时间对象传递给事件监听,监听在对事件源进行处理) 事件对象:用来描述发生什么事情,是一个描述者,通知JVM发生点击具体事件 事件监听:一个事件的处理者 //接口(类和接口,接口强制要求他的子类来实现它的方法)监听应该跟事件源打交道 没有方法的接口:标识接口(EventListener,Cloneable) EventObject: ActionEvent(最常用):点击操作(菜单,按钮),文本框回车,双击List组件 AdjustmentEvent(基本用不到) ComponentEvent(基本用不到) ItemEvent:勾选 TextEvent(用得也不多,因为不适用于swing组件):文本事件,文本组件中文字的变化 ContainerEvent:容器事件 FocusEvent:焦点事件,光标事件 InputEvent:输入事件(键盘鼠标) WindowEvent:窗口事件所有的监听都是以接口的方式实现的(教程P63)计数窗口:-----------------------------------------------------------------------------------------package com.tarena.day10.gui;import java.awt.FlowLayout;import java.awt.event.*;import javax.swing.*;public class TestCount implements ActionListener{ private int count = 0; JLabel jl = new JLabel(" 0次"); public TestCount(){ JFrame jf = new JFrame("计数器"); JButton jb1 = new JButton("+"); JButton jb2 = new JButton("-"); jb1.addActionListener(this); jb2.addActionListener(this); jf.setLayout(new FlowLayout()); jf.add(jl); jf.add(jb1); jf.add(jb2); jf.pack(); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { String comm = e.getActionCommand(); if("+".equals(comm)){ count++; }else{ count--; } jl.setText(count+"次"); } public static void main(String[] args) { new TestCount(); }}-----------------------------------------------------------------------------------------计算器作业(支持连加/连减/连乘/连除):**注意:此程序还有最后一点bug,在连续计算过程中无法更换运算符,否则会计算出错**-----------------------------------------------------------------------------------------package calculater;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.math.BigDecimal;import javax.swing.*;public class Calculater implements ActionListener{ private String[] names = {"Backspace","CE","C","+","7","8","9","-","4","5","6","*","1","2","3","/","0","+/-",".","="}; private JButton[] jb = new JButton[names.length]; private boolean append = false; private String operator = "+"; private String s1 = "0"; private String ss = "0"; JTextField jtf = new JTextField(20); public Calculater() {} public Calculater(String title){ JFrame jf = new JFrame(title); JPanel jp = new JPanel(); jp.setLayout(new GridLayout(5,4)); for (int i = 0; i < jb.length; i++) { jb[i] = new JButton(names[i]); jb[i].addActionListener(this); jp.add(jb[i]); } jf.add(jtf,BorderLayout.NORTH); jf.add(jp); jtf.setHorizontalAlignment(JTextField.RIGHT); jtf.setText("0"); jtf.setEditable(false); jf.pack(); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { String comm = e.getActionCommand(); if(comm.matches("\\d")){ //用正则表达式判断输出的是否是0~9 if(append){ String temp = jtf.getText(); jtf.setText(temp + comm); }else{ jtf.setText(comm); append = true; } }else if(comm.equals(".")){ String temp = jtf.getText(); if(temp.indexOf(".")== -1 && append){ //当输入的文本中没有小数点 jtf.setText(temp+comm); append = true; //输入小数点后继续追加 }else if(!append){ //当字符串开始时候先输入 " . " 则直接输出" 0. " jtf.setText("0"+comm); append = true; } }else if("+-*/".indexOf(comm)!= -1){ operator = comm; s1 = jtf.getText(); double d3 = Double.parseDouble(s1); double d4 = Double.parseDouble(ss); BigDecimal bd3 = new BigDecimal(d3+""); BigDecimal bd4 = new BigDecimal(d4+""); if(operator.equals("+")){ d3 = bd3.add(bd4).doubleValue(); ss = d3+""; jtf.setText(ss); }else if(operator.equals("-")){ if(d4 == 0.0){ ss = s1; jtf.setText(ss); }else{ d3 = bd4.subtract(bd3).doubleValue(); ss = d3+""; jtf.setText(ss); } }else if(operator.equals("*")){ if(d4 == 0.0){ ss = s1; jtf.setText(ss); }else{ d3 = bd3.multiply(bd4).doubleValue(); ss = d3+""; jtf.setText(ss); } }else if(operator.equals("/")){ if(d4 == 0.0){ ss = s1; jtf.setText(s1); }else{ d3 = bd4.divide(bd3,15,BigDecimal.ROUND_HALF_UP).doubleValue(); } ss = d3+""; jtf.setText(ss); } append = false; //不继续追加 }else if(comm.equals("=")){ String s2 = jtf.getText(); double d1 = Double.parseDouble(ss); double d2 = Double.parseDouble(s2); BigDecimal bd1 = new BigDecimal(d1+""); BigDecimal bd2 = new BigDecimal(d2+""); if(operator.equals("+")){ d1 = bd1.add(bd2).doubleValue(); }else if(operator.equals("-")){ d1 = bd1.subtract(bd2).doubleValue(); }else if(operator.equals("*")){ d1 = bd1.multiply(bd2).doubleValue(); }else if(operator.equals("/")){ //精确计算浮点除法 if(d2!=0.0){ d1 = bd1.divide(bd2,15,BigDecimal.ROUND_HALF_UP).doubleValue(); } } ss = "0"; jtf.setText(d1+""); append = false; //不继续追加 }else if(comm.equals("CE")||comm.equals("C")){ jtf.setText("0"); ss = "0"; append = false; }else if(comm.equals("+/-")){ String temp = jtf.getText(); if(!append){ jtf.setText("-"); append = true; }else if(temp.startsWith("-")){ //如果字符串以负号开头 jtf.setText(temp.substring(1)); }else{ jtf.setText("-" + temp); } }else if(comm.equals("Backspace")){ String temp = jtf.getText(); if(temp.length()>0){ jtf.setText(temp.substring(0,temp.length()-1)); } } } public static void main(String[] args) { new Calculater("Calculater"); }}-----------------------------------------------------------------------------------------int 21亿long 21亿* 21亿 用BigDecimal解决浮点运算精度问题,必须用String类型作参数:-----------------------------------------------------------------------------------------package com.tarena.day10.gui;import java.math.BigDecimal;public class TestBigDecimal { public static void main(String[] args) { double d1 = 1.0; double d2 = 0.41; System.out.println(d1-d2); BigDecimal bd1 = new BigDecimal(d1); BigDecimal bd2 = new BigDecimal(d2); System.out.println(bd1.subtract(bd2).doubleValue()); //BigDecimal想要正确解决精度问题就要用String BigDecimal bd3 = new BigDecimal(""+d1); BigDecimal bd4 = new BigDecimal(""+d2); System.out.println(bd3.subtract(bd4).doubleValue()); BigDecimal bd5 = new BigDecimal("5"); BigDecimal bd6 = new BigDecimal("3"); System.out.println(bd5.divide(bd6,5,BigDecimal.ROUND_HALF_UP).doubleValue()); //大数计算 String a1 = "123456789123456789123456789"; String a2 = "123456789123456789123456789"; BigDecimal bd7 = new BigDecimal(a1); BigDecimal bd8 = new BigDecimal(a2); System.out.println(bd7.add(bd8)); }}输出结果:0.59000000000000010.59000000000000010.591.66667246913578246913578246913578-----------------------------------------------------------------------------------------AWT.Swing中的菜单: 菜单栏(JMenuBar),菜单(JMenu),菜单项(JMenuItem)-----------------------------------------------------------------------------------------package com.tarena.day10.gui;import javax.swing.*;public class TestMenu { public TestMenu(){ JFrame jf = new JFrame("TestMenu"); JMenuBar jmb = new JMenuBar(); String[] jml = {"File","Edit","Help"}; String[][] jmil = {{"New","Open","Save","Save as","","Exit"},{"ed1","ed2","ed3","","ed4"},{"h1","h2"}}; JMenu[] jm = new JMenu[jml.length]; JMenuItem[][] jmi = new JMenuItem[jmil.length][]; for (int i = 0; i < jml.length; i++) { jm[i] = new JMenu(jml[i]); jmi[i] = new JMenuItem[jmil[i].length]; //二维数组中会有空指针,要先NEW一次子数组才不会报错 for (int j = 0; j < jmil[i].length; j++) { if(jmil[i][j].equals("")){ jm[i].addSeparator(); //如果为空增加分割符 }else{ jmi[i][j] = new JMenuItem(jmil[i][j]); jm[i].add(jmi[i][j]); } } jmb.add(jm[i]); } jf.setJMenuBar(jmb); jf.setSize(200,100); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestMenu(); }}----------------------------------------------------------------------------------------- package com.tarena.day10.gui;import javax.swing.*;public class GuiUtil { public static JMenuBar getMenuBar( String[] jml,String[][] jmil){ JMenuBar jmb = new JMenuBar(); JMenu[] jm = new JMenu[jml.length]; JMenuItem[][] jmi = new JMenuItem[jmil.length][]; for (int i = 0; i < jml.length; i++) { jm[i] = new JMenu(jml[i]); jmi[i] = new JMenuItem[jmil[i].length]; for (int j = 0; j < jmil[i].length; j++) { if(jmil[i][j].equals("")){ jm[i].addSeparator(); }else{ jmi[i][j] = new JMenuItem(jmil[i][j]); jm[i].add(jmi[i][j]); } } jmb.add(jm[i]); } return jmb; } public static void main(String[] args){ JFrame jf = new JFrame("TestMenu"); String[] jml = {"File","Edit","Help"}; String[][] jmil = {{"New","Open","Save","Save as","","Exit"},{"ed1","ed2","ed3","","ed4"},{"h1","h2"}}; JMenuBar jmb = GuiUtil.getMenuBar(jml, jmil); jf.setJMenuBar(jmb); jf.setSize(200,100); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }}-----------------------------------------------------------------------------------------适配器类: 当监听接口方法比较多的时候,就可以写个适配器类作为接口的子类,可以继承这个适配器类并重写其中一个或多个方法,不用强制重写所有方法:-----------------------------------------------------------------------------------------package com.tarena.day10.gui;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;import javax.swing.JFrame;public class TestWindowListener1 implements WindowListener{ public static void main(String[] args){ JFrame jf = new JFrame(); jf.setSize(300,100); jf.setVisible(true); jf.addWindowListener(new TestWindowListener1()); } public void windowActivated(WindowEvent e) { } public void windowClosed(WindowEvent e) { } public void windowClosing(WindowEvent e) { System.out.println("window close"); System.exit(0); //非正常退出 } public void windowDeactivated(WindowEvent e) { } public void windowDeiconified(WindowEvent e) { } public void windowIconified(WindowEvent e) { } public void windowOpened(WindowEvent e) { }}-----------------------------------------------------------------------------------------用适配器类重写其中的一个方法,中间使用匿名内部类:-----------------------------------------------------------------------------------------package com.tarena.day10.gui;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JFrame;public class TestWindowListener2 { public static void main(String[] args) { JFrame jf = new JFrame(); jf.setSize(300,100); jf.setVisible(true); jf.addWindowListener(new TestWindowListener1()); jf.addWindowListener(new WindowAdapter(){}); //匿名内部类 } public void windowClosing(WindowEvent e) { System.out.println("window close"); System.exit(0); //非正常退出 }}-----------------------------------------------------------------------------------------作业:写一个菜单栏,要有文件:新建/打开/保存/另存/分割线/退出编辑:撤销/剪切/复制/粘贴/删除/查找/替换/全选帮助:关于记事本除了打开/保存/另存/新建,其他的都可以做了
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -