Lesson08A-1.rmvb
基本:
Frame f = new Frame("head");
f.setVisible(true);
f.dispose();
为添加窗口关闭功能,实现WindowListener接口的WindowClosing函数,然后在Frame的对象里用addWinListener调用。
public class MyWindowListener implements WindowListener
WindowClosing(WindowEvent e){
e.getWindow().setVisible(false);
//((Window)e.getSource).setVisible(false);
//((Window)e.getComponent).setVisible(false);
e.getWindow().dispose();
System.exit(0);
}
f.addWinListener(new MyWindowListner());
AWT2 06.1.23 10:00
Lesson08A-2.rmvb
Event Adapter
不是接口类(Listener),不需要实现其中所有实现,只需按照需要覆盖其中某个函数的实现。
所以只有一个函数的接口类(Listener)不需要适配器(Adapter)
WindowAdapter...
用Button关闭窗口的实现:ActionListener
问题:在程序一中,//b.addActionListener(mf);和b.addActionListener(new MyFrame());都是可以的,有什么区别吗?
试答:前者是正确的,后者虽然也行,但是有隐患。因为后者new MyFrame()只是生成了一个指向mf空间的对象指针,而非生成一个新的占有空间的对象实体。在本程序中,比较巧的是我们在用ActionPerformed关闭窗口时,其真正关闭的是new MyFrame()生成的空间,而非mf(因为两者都指向同一个空间,所以mf也被关闭了。)不然的话,比如,mf的定义与new MyFrame()不出现在同一段程序中的话,系统将会发生问题,即窗口根本不能被成功关闭。如程序二即是这种情况。(参看程序二的注释)
程序一:
import java.awt.Frame;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventListener;
public class MyFrame implements ActionListener {
Frame f = new Frame("test");
public static void main(String[] args)
{
Button b = new Button("exit");
MyFrame mf = new MyFrame();
mf.f.add(b);
//b.addActionListener(mf);
b.addActionListener(new MyFrame());
//Frame f = new Frame("test");
mf.f.setSize(200,200);
mf.f.setVisible(true);
//f.dispose();
mf.f.addWindowListener(new YourListener());
}
/**
* Method actionPerformed
*
*
* @param e
*
*/
public void actionPerformed(ActionEvent e) {
f.dispose();
System.exit(0);
// TODO: 在这添加你的代码
}
}
程序二:
import java.awt.Frame;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventListener;
public class MyFrame implements ActionListener {
Frame f = new Frame("test");
public void init(){
Button b = new Button("exit");
f.add(b);
//b.addActionListener(f); //ERROR!!!
b.addActionListener(this); //这样写才是对的
//b.addActionListener(new MyFrame());//与上面的写法比较,这种方法是错误的
//Frame f = new Frame("test");
f.setSize(200,200);
f.setVisible(true);
//f.dispose();
f.addWindowListener(new YourListener());
}
public static void main(String[] args)
{
MyFrame mf = new MyFrame();
mf.init();
}
/**
* Method actionPerformed
*
*
* @param e
*
*/
public void actionPerformed(ActionEvent e) {
f.dispose();
//System.exit(0);
// TODO: 在这添加你的代码
}
}
除了如上所述的实现button关闭窗口的方法外,也可以通过用类中类的方法来实现。如程序四:
import java.awt.Frame;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventListener;
public class MyFrame {//implements ActionListener {
Frame f = new Frame("test");
public void init(){
Button b = new Button("exit");
f.add(b);
//b.addActionListener(f); //ERROR!!!
b.addActionListener(new MyActionListener());
//b.addActionListener(new MyFrame());
//Frame f = new Frame("test");
f.setSize(200,200);
f.setVisible(true);
//f.dispose();
f.addWindowListener(new YourListener());
}
public static void main(String[] args)
{
MyFrame mf = new MyFrame();
mf.init();
}
public class MyActionListener implements java.awt.event.ActionListener{
/**
* Method actionPerformed
*
*
* @param e
*
*/
public void actionPerformed(ActionEvent e) {
f.dispose();
System.exit(0);
// TODO: 在这添加你的代码
}
}
}
甚至在使用类中类的时候,可以用匿名的类种类。即将上面b.addActionListener(new MyActionListener());改为:
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
f.dispose();
System.exit(0);
// TODO: 在这添加你的代码
}
});
缺:事件处理的多重运用。
AWT3 06.1.23 22:00
修改组件的默认事件处理方式
processEvent , processXxxEvent
enableEvents(long eventsToEnble) 不注册事件监听器也可对事件反应 ,
eventsToEnable 是用位来表示的事件,一般被设定为常量
一般对某个组件(比如Button)的事件反应的代码的实现,通常是通过继承扩展该组件(如class MyButton extends Button),然后重写其processXxxEvent函数达到的。
通常,frame的setVisible(true)必须在组件的setVisible(true)之前,否则将会出现不可知的问题。一下摘录了一个程序,其主要功能是两个按钮,在鼠标到达某个按钮上时,隐藏该按钮显示另一个;请留意看注释:
MyButton.java 继承的新组件
-------------------------------
import java.awt.*;
import java.awt.event.*;
public class MyButton extends Button{
private MyButton friend = null;//用friend表示第二个按钮
public void setFriend (MyButton f){
this.friend = f;
}
public MyButton (String title){
super(title);
this.enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK);//允许AWTEvent.MOUSE_MOTION_EVENT_MASK事件的处理,使不注册事件监听器程序也可对事件反应
}
protected void processMouseMotionEvent(MouseEvent e){//该处理的主要功能就是隐藏被鼠标到达的按钮
this.setVisible(false);
friend.setVisible(true);
}
}
AWT3Frame.java 新的Frame
-----------------------------------
import java.awt.*;
import java.awt.event.*;
public class AWT3Frame extends Frame {
/**
* The constructor.
*/
public AWT3Frame() {
MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu();
MenuItem menuFileExit = new MenuItem();
MyButton btn1 = new MyButton("btn1");
MyButton btn2 = new MyButton("btn2");
btn1.setFriend(btn2);
btn2.setFriend(btn1);
this.add(btn1,"North");
this.add(btn2,"South");
menuFile.setLabel("File");
menuFileExit.setLabel("Exit");
// Add action listener.for the menu button,这是简单的事件监听器的注册,由JC自动完成
menuFileExit.addActionListener
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
AWT3Frame.this.windowClosed();
//this.windowClosed(); //这样是不对的,为什么呢?**********************************************?
//AWT3Frame.windowClosed();//这样也是不对的,为什么?********************************************?
}
}
);
menuFile.add(menuFileExit);
menuBar.add(menuFile);
setTitle("AWT3");
setMenuBar(menuBar);
setSize(new Dimension(400, 400));
// Add window listener.
this.addWindowListener
(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
AWT3Frame.this.windowClosed();
}
}
);
this.setVisible(true); //这里如果顺序出错
btn2.setVisible(false); //将会导致不可预料的问题
}
/**
* Shutdown procedure when run as an application.
*/
protected void windowClosed() {
// TODO: Check if it is safe to close the application
// Exit application.
System.exit(0);
}
}
AWT3.java 主程序
public class AWT3 {
public static void main(String[] args) {
// Create application frame.
AWT3Frame frame = new AWT3Frame();
// Show frame
// frame.setVisible(true);//为防止不可预料的问题,所以在上一个类中setVisible.##########?
}
}
问题记录:
1、如上面标记*的两行
menuFileExit.addActionListener
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
AWT3Frame.this.windowClosed();
//this.windowClosed(); //这样是不对的,为什么呢?**********************************************?
//AWT3Frame.windowClosed();//这样也是不对的,为什么?********************************************?
}
}
);
答:this.windowClosed表示匿名类ActionListener调用windowClosed函数
而AWT3Frame.this.windowClosed();表示匿名类的外层(AW3Frame)调用windowClosed函数
2、如主程序中标记#的一行,因为“frame的setVisible(true)必须在组件的setVisible(true)之前,否则将会出现不可知的问题。”,但是在实现中,有时不得不把setVisible放在主程序中实现,这个矛盾怎么解决?另外,这个说法的原因也待考虑。
GUI组件上的图形操作
Graphics.drawString(String,x,y) (x,y)是字符串的左下角坐标
在Frame上作图的基本步骤是:
1。获得Graphics对象 Graphics g = getGraphics();//(java.awt.Component.getGraphics() )
2.用获得的Graphics对象作画(drawString,drawLine等),并且可以设置各种属性(setFont,setColor等)
组件重绘
原先绘制的图画在经历最小化和最大化后会消失,所以要重绘。
可以通过paint(Graphics g)的重构实现重绘
一般可以把要重绘的各个图形单独建类,并在一个函数中设置各种绘画的属性供paint调用。另外,通常要用Vector、Enumeration记录已经画了的东西的参数(如位置,颜色等)。
在做完paint的重构后,可以通过调用repaint直接完成绘图部分的工作。(repaint = paint + update)
文件MyLine.java 要重绘的图形单独建类
-------------------------------
import java.awt.*;
public class MyLine {
int orgX;
int orgY;
int endX;
int endY;
public MyLine(int x, int y, int xe, int ye){
orgX = x;
orgY = y;
endX = xe;
endY = ye;
}
public void drawMe(Graphics g){ //设置各种绘画的属性,绘图,供paint调用
g.setColor(Color.RED);
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,30));
g.drawString(orgX + "," + orgY,
orgX,orgY);
g.drawString(endX + "," + endY,
endX, endY);
g.drawLine(
orgX,orgY,endX,endY);
}
}
文件DrawLineFrame.java 主体程序
--------------------------------------
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class DrawLineFrame extends Frame {
int orgX;
int orgY;
int endX;
int endY;
Vector vLines = new Vector(); //用Vector记录已经画了的东西的参数
public void paint(Graphics g){
Enumeration e = vLines.elements(); //Enumeration列举Vector各项
while(e.hasMoreElements()){
MyLine line = (MyLine)e.nextElement();
line.drawMe(g);
//g.drawLine(orgX,orgY,endX,endY);
}
}
/**
* The constructor.
*/
public DrawLineFrame() {
MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu();
MenuItem menuFileExit = new MenuItem();
menuFile.setLabel("File");
menuFileExit.setLabel("Exit");
// Add action listener.for the menu button
menuFileExit.addActionListener
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
DrawLineFrame.this.windowClosed();
}
}
);
menuFile.add(menuFileExit);
menuBar.add(menuFile);
setTitle("DrawLine");
setMenuBar(menuBar);
setSize(new Dimension(400, 400));
// Add window listener.
this.addWindowListener
(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
DrawLineFrame.this.windowClosed();
}
}
);
this.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
orgX = e.getX();
orgY = e.getY();
}
public void mouseReleased(MouseEvent e){
endX = e.getX();
endY = e.getY();
/*这些都是可以用repaint()函数代替的代码
Graphics g = getGraphics();
g.setColor(Color.RED);
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,30));
g.drawString(orgX + "," + orgY,
orgX,orgY);
g.drawString(e.getX() + "," + e.getY(),
e.getX(),e.getY());
g.drawLine(
orgX,orgY,e.getX(),e.getY());
*/
vLines.add(new MyLine(orgX,orgY,endX,endY)); //把相关参数保存下来
repaint();
}
}
);
}
/**
* Shutdown procedure when run as an application.
*/
protected void windowClosed() {
// TODO: Check if it is safe to close the application
// Exit application.
System.exit(0);
}
}
GUI组件上的图像显示 06.1.26
Graphics.drawImage(Image img, int x, int y, ImageObserver observer)方法
img:即使未被装载 observer:图像装载的进度信息
Image是抽象类,不能直接new产生该类对象,但可通过某个类的实例方法产生Image对象
可通过Toolkit的createImage或者getImage获得(其中,createImage的图像是非共享的,而getImage的获得的图像是可共享的)
(另外,Toolkit也是虚类,可通过Component.getToolkit方法获得Toolkit对象,然后用获得的Toolkit对象的getImage或createImage获得Image对象)
drawImage是一个异步方法,即即使img未被装载,函数也会立刻返回一个值(true or false)
解决这个问题,可以采用在paint()方法中写drawImage的方法
双缓冲区技术 组件表面图形的重绘
原理:用Component.createImage方法创建内存Image对象,重绘时可利用这个Image对象。
这个程序的尝试 失败 了,主要是在重绘时图像消失的问题
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class DrawLine1 extends Frame {
int orgX;
int orgY;
int endX;
int endY;
Image oimg = null; //这是第二个缓冲的img对象
Graphics og = null; //这是第二个缓冲用到的Graphics对象
//Vector vLines = new Vector();
public void paint(Graphics g){
if (oimg != null)
g.drawImage(oimg,0,0,this);
// Enumeration e = vLines.elements();
// while(e.hasMoreElements()){
// MyLine line = (MyLine)e.nextElement();
// line.drawMe(g);
//g.drawLine(orgX,orgY,endX,endY);
// }
}
/**
* The constructor.
*/
public DrawLine1() {
setVisible(true);
Dimension d = this.getSize();
oimg = createImage(d.width,d.height);//初始化
og = oimg.getGraphics();//初始化
MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu();
MenuItem menuFileExit = new MenuItem();
menuFile.setLabel("File");
menuFileExit.setLabel("Exit");
// Add action listener.for the menu button
menuFileExit.addActionListener
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
DrawLine1.this.windowClosed();
}
}
);
menuFile.add(menuFileExit);
menuBar.add(menuFile);
setTitle("DrawLine");
setMenuBar(menuBar);
setSize(new Dimension(400, 400));
// Add window listener.
this.addWindowListener
(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
DrawLine1.this.windowClosed();
}
}
);
this.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
orgX = e.getX();
orgY = e.getY();
}
public void mouseReleased(MouseEvent e){
endX = e.getX();
endY = e.getY();
Graphics g = getGraphics();
g.setColor(Color.RED);
g.setFont(new Font(null,Font.ITALIC|Font.BOLD,30));
g.drawString(orgX + "," + orgY,
orgX,orgY);
g.drawString(e.getX() + "," + e.getY(),
e.getX(),e.getY());
g.drawLine(
orgX,orgY,e.getX(),e.getY());
//以下是在缓冲区中写组件表面图形的Image对象
og.setColor(Color.RED);
og.setFont(new Font(null,Font.ITALIC|Font.BOLD,30));
og.drawString(orgX + "," + orgY,
orgX,orgY);
og.drawString(e.getX() + "," + e.getY(),
e.getX(),e.getY());
og.drawLine(
orgX,orgY,e.getX(),e.getY());
}
}
);
}
protected void windowClosed() {
System.exit(0);
}
}
菜单
MenuBar,Menu,MenuItem
将MenuItem加到Menu对象,将Menu加到MenuBar对象,将MenuBar加到Frame。
(TIPS:CheckboxMenuItem对象可建立可标记的MenuItem,addSeparator函数可用来添加分隔条)
对菜单时间可以用ActionListener监听处理单击事件
可用getActionCommand函数,判断其是否与菜单名称一致来实现事件处理,如:
if(e.getActionCommand().equals("open")) ....;
另外,不要忘记注册监听器。
可以用setActionCommand函数为菜单设置命令字符串,与getActionCommand对应,如果没有设定,则默认与菜单项名称相同。
这一点可用于程序的国际化;也可用于一个菜单项用于多种用途:
如同一菜单项分别用于“连接”和“断开”
Container
Container是所有容器类的父类,Component的子类。组件如果在容器setVisible之后添加,是不会被显示出来的。
以下是一个简单的程序实例:
import java.awt.*;
import java.awt.event.*;
public class TestMenuFrame extends Frame {
public TestMenuFrame() {
MenuBar menuBar = new MenuBar();
Menu menuFile = new Menu();
Menu menuEdit = new Menu("edit");
MenuItem menuFileExit = new MenuItem();
MenuItem menuFileOpen = new MenuItem("open");
Menu menuFilePrint = new Menu("print"); //print菜单是多级菜单,所以这里必须声明为Menu
MenuItem printPreview = new MenuItem("preview");
printPreview.addActionListener //添加事件响应
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("preview");
}
}
);
MenuItem printSetting = new MenuItem("setting");
menuBar.add(menuEdit);
menuFile.add(menuFileOpen);
menuFile.add(menuFilePrint);
menuFilePrint.add(printPreview);
menuFilePrint.add(printSetting);
menuFile.setLabel("File");
menuFileExit.setLabel("Exit");
// Add action listener.for the menu button
menuFileExit.addActionListener
(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
TestMenuFrame.this.windowClosed();
}
}
);
menuFile.add(menuFileExit);
menuBar.add(menuFile);
setTitle("TestMenu");
setMenuBar(menuBar);
setSize(new Dimension(400, 400));
// Add window listener.
this.addWindowListener
(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
TestMenuFrame.this.windowClosed();
}
}
);
}
/**
* Shutdown procedure when run as an application.
*/
protected void windowClosed() {
// TODO: Check if it is safe to close the application
// Exit application.
System.exit(0);
}
}
Lesson8d-1
Checkbox
创建多选Checkbox(String lable, boolean state)
创建单选Checkbox(String lable, boolean state, CheckboxGroup group)
单选及多选按钮的语义事件为ItemEvent, 监听器接口为ItemListener,该接口中只有一个itemStateChange方法
Choice 下拉列表框
语义事件为ItemEvent, 监听器接口为ItemListener
Panel与ScrollPane类
都是容器类,Panel不能独立存在,ScrollPane用于产生滚动窗口
记录问题:
一:Panel有什么用?
JDK里说:Panel is the simplest container class. A panel provides space in which an application can attach any other component, including other panels. 它与Frame的区别是什么?
二:如程序:
import java.awt.*;
import java.awt.event.*;
public class TestPanel extends Panel {
Checkbox cb1 = new Checkbox("Like?",true);
CheckboxGroup cbg = new CheckboxGroup();
Checkbox cb21 = new Checkbox("Yes.", true, cbg);
Checkbox cb22 = new Checkbox("no.", true, cbg);
public TestPanel(){
this.add(cb1);
this.add(cb21);
this.add(cb22);
cb22.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){
if(e.getStateChange() == ItemEvent.SELECTED){ //如果no被选中***************
System.out.println("I'm sorry!!");
};
if(e.getStateChange() == ItemEvent.DESELECTED){ //如果选yes(no未被选中)***************
System.out.println("I'm happy!!");
};
}
}
);
/* #####################################################################################
Button b = new Button("OK");
this.add(b);
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("cb1:" + TestPanel.this.cb1.getState());
System.out.println("cb2:" + TestPanel.this.cb21.getState());
System.out.println("cb3:" + TestPanel.this.cb22.getState());
System.out.println("cbg:" + cbg.getSelectedCheckbox().getLabel());
}
}
);
#########################################################################################*/
}
}
1。如上,注意*注释,上面的no被选中时,能够打印出"I'm sorry!!", 但是当选yes时(此时即no为DESELECTED),却不能打印出"I'm happy!!"。
2。如#注释部分,这个程序是把cb1,cb21,cb22作为类成员变量来用了;但如果cb1,cb21,cb22只是构造函数里的局部变量,那么注释部分的TestPanel.this.cb1.getState()应该怎么改写呢?即如果匿名类位于一个函数内部,那么在匿名类的实现里如何调用函数的局部变量呢?用final似乎不好吧
Lesson08D-2
布局管理器
可调用Container类的方法setLayout(layout_name)设置容器的布局管理器
AWT中的布局管理器类:
1.BorderLayout
Window类(及其子类Frame, Dialog)的默认布局管理器,分容器为东西南北中。
2.FlowLayout
Panel类的默认布局管理器。容器内的组件从左到右,从上到下排列。
3.GridLayout
容器内的组件从左到右,从上到下排列,并且各组件大小平均。这种布局管理器还可设置每行每列可放置的组件数。
4.CardLayout
可实现多个组件在同一容器区域内交替显示;但只有最上面的组件可见。CardLayout需要为每个组件设置一个关键字(字符串),在add(component, key)函数的key中指定。
5.GridBagLayout
比较复杂,较少使用。
取消布局管理器:
用Container.setLayout(null) 取消布局管理器,
并用Component.setBound(x1,y1,x2,y2)设定绝对坐标。
这样做的缺点是容器中组件的大小将无法随容器大小的变化而调整。
Lession08D-3
Swing和JFC
Swing是JComponent类的子类,JComponent是java.awt.Container的子类
AWT组件在Swing中的名称是原名前加J(如Button->JButton)
JFC:Java Foundation Class ,包括Swing,java2d等
从AWT到javax.swing
1. JFrame:与java.awt.Frame相似。但是,JFrame上只能有一个唯一的组件:JRootPane,可用JFrame.getContentPane()获得JFrame内置的JRootPane对象。组件的增加和布局管理器的设定都要在JRootPane上进行。
调用JFrame的setDefaultCloseOperation(TODO)方法,可设置单击关闭按钮后的事件处理方式。JFrame关闭按钮的默认事件处理方式是隐藏窗口(但不关闭),需要用JFrame.dispose()关闭退出。
2.JScrollPane:与ScrollPane对应
分为JScrollBar和代表视图区域的JViewport。另外,需要用JViewport.getViewport.add方法添加子组件。(《Jave Tutorial》中有详细指导。)
3.Swing中的标准对话框:JOptionPane类提供了若干个showXxxDialog静态方法。如:showConfirmDialog(Component parentComponent(父窗口,可为null,这时为桌面),Object message, String title, int optionType, int messageType);
JFileChooser类提供了文件存取对话框。(JAVA_HOME/Demo/jfc/FileChooserDemo目录下有实例)
4.另外,新增BoxLayout...还有一些细节,比如JTextField的构造函数不带参数时,默认的列数为0。
注:这里比较重要的一点是JFrame和JScroll等容器,要向他们增加组建的话不能直接加,而必须间接执行(JFrame的JRootPane和JScrollPane的JViewport)。不知道JDK的设计者在设计时为什么这么考虑。
Lesson08D-4
编写一个计算器,以下为GUI部分
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.util.EventListener;
import java.util.StringTokenizer;
/**
* Sample application using Frame.
*
* @author
* @version 1.00 06/02/03
*/
public class CaculatorFrame extends JFrame implements ActionListener {
JTextField jtf = new JTextField();
double firstNum = 0;
double secondNum = 0;
char operater = 0;
double tempResult = 0;
boolean flag = false; //flag for whether_has_computed
public CaculatorFrame() {
setSize(new Dimension(400, 400));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jtf.setHorizontalAlignment(JTextField.RIGHT);
Container c = this.getContentPane();
JPanel jpl = new JPanel();
c.add(jtf, BorderLayout.NORTH);
c.add(jpl, BorderLayout.CENTER);
jpl.setLayout(new GridLayout(4,4));
JButton b = null;
String bf = "123+456-789*.0/=";
for(int i = 0; i<16; i++){
b = new JButton(bf.charAt(i) + "") ;
b.addActionListener(this);
jpl.add(b);
}
/*/ Add window listener.
this.addWindowListener
(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
CaculatorFrame.this.windowClosed();
}
}
);*/
}
protected void windowClosed() {
System.exit(0);
}
public void actionPerformed(ActionEvent e) {
//在这里实现计算器的具体算法
//String c = e.getActionCommand();
}
private boolean isNum(String s){
for(int i = 0; i<10; i++){
if(s.equals("" + i))
return true;
}
return false;
}
private void doOperate(char op)
{
//某个可能用到的算法
}
}