Java图形界面设计.docx
《Java图形界面设计.docx》由会员分享,可在线阅读,更多相关《Java图形界面设计.docx(21页珍藏版)》请在冰豆网上搜索。
![Java图形界面设计.docx](https://file1.bdocx.com/fileroot1/2022-12/31/bb01c106-418a-4693-a1c8-af37239b0f32/bb01c106-418a-4693-a1c8-af37239b0f321.gif)
Java图形界面设计
Java图形界面设计.txt一个人一盒烟一台电脑过一天一个人一瓶酒一盘蚕豆过一宿。
永远扛不住女人的小脾气,女人永远抵不住男人的花言巧语。
本文由yx_222贡献
doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
简述Java图形用户界面设计(Swing)
来源:
csdn作者:
发布时间:
2008-03-2117:
19:
06AWT和Swing是Java设计GUI用户界面的基础.与AWT的重量级组件不同,Swing中大部分是轻量级组件.正是这个原因,Swing几乎无所不能,不但有各式各样先进的组件,而且更为美观易用.所以一开始使用AWT的程序员很快就转向使用Swing了.
一.AWT和Swing
AWT和Swing是Java设计GUI用户界面的基础.AWT的重量级组件不同,与Swing中大部分是轻量级组件.正是这个原因,Swing几乎无所不能,不但有各式各样先进的组件,而且更为美观易用.所以一开始使用AWT的程序员很快就转向使用Swing了.
那为什么AWT组件没有消亡呢?
因为Swing是架构在AWT之上的,没有AWT就没有Swing.所以程序员可以根据自己的习惯选择使用AWT或者是Swing.但是,最好不要二者混用——除开显示风格不同不说,还很可能造成层次(Z-Order)错乱,比如下例:
/**AwtSwing.java*@authorFancy*/
importjava.awt.BorderLayout;importjava.awt.Button;
importjavax.swing.JButton;importjavax.swing.JDesktopPane;
importjavax.swing.JFrame;importjavax.swing.JInternalFrame;importjavax.swing.JPanel;
publicfinalclassAwtSwing{
publicstaticvoidmain(String[]args){AwtSwingas=newAwtSwing();as.show();}
JFrameframe=newJFrame("TestAWTandSWING");
JDesktopPanejdp=newJDesktopPane();
JInternalFramejif1=newJInternalFrame("controls");
JInternalFramejif2=newJInternalFrame("cover");
publicAwtSwing(){frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(jdp);
jif1.setContentPane(newJPanel());jif2.setContentPane(newJPanel());
jif1.getContentPane().setLayout(newBorderLayout());jif1.getContentPane().add(newButton("AWTButton"),BorderLayout.WEST);jif1.getContentPane().add(newJButton("SwingButton"),BorderLayout.EAST);
jif1.setSize(200,100);jif2.setSize(200,100);
jdp.add(jif1);jdp.add(jif2);
frame.setSize(240,140);}
publicvoidshow(){frame.setVisible(true);jif1.setVisible(true);jif2.setVisible(true);}
}
运行这个程序,并用鼠标拖动那个名为并用鼠标拖动那个名为"cover"的子窗口,我们会发现一个非常有趣我们会发现一个非常有趣的现象,如图:
显然cover子窗口是在controls子窗口之上的,但是它只罩盖住了SwingButton,但是它只罩盖住了没有罩盖住AWTButton.再看一会儿再看一会儿,你是不是有这样一种感觉:
SwingButton是"画"Swing上去的,而AWTButton则是则是"贴"上去的.这就是二者混用造成层次错乱的一个例子这就是二者混用造成层次错乱的一个例子.
Swing组件有美观,易用易用,组件量大等特点,也有缺点——使用Swing组件的程序通常会比使用AWT组件的程序运行更慢但是大家都还是更喜欢用Swing组件原因何在?
组件的程序运行更慢.组件,因为随着计算机硬件的升级,一点点速度已经不是问题.相反的,用户更需要美观的用户界因为随着计算机硬件的升级用户更需要美观的用户界面,开发人员则更需要易用的开发组件开发人员则更需要易用的开发组件.#p#分页标题#e#
框架,二.框架,监听器和事件
框架(Frame,JFrame)是Java图形用户界面的基础,它就是我们通常所说的窗口它就是我们通常所说的窗口,是Windows/XWindow应用程序的典型特征说到Windows/XWindow,应用程序的典型特征.大家很容易联想到"事
件(Event)驱动".Java的图形用户界面正是事件驱动的,并且由各种各样的监听器(Listener)负责捕捉各种事件.
如果我们需要对某一个组件的某种事件进行捕捉和处理时,就需要为其添加监听器.比如,我们要在一个窗口(JFrame)激活时改变它的标题,我们就需要为这个窗口(JFrame对象)添加一个可以监听到"激活窗口"这一事件的监听器——WindowListener.
怎么添加监听器呢?
这通常由组件类提供的一个addXxxxxListener的方法来完成.比如JFrame就提供有addWindowListener方法添加窗口监听器(WindowListener).
一个监听器常常不只监听一个事件,而是可以监听相关的多个事件.比如WindowListener除了监听窗口激活事件(windowActivate)之外,还可以监听窗口关闭事件(windowClosing)等.那么这些事件怎么区分呢?
就靠重载监听器类(Class)的多个方法(Method)了.监听器监听到某个事件后,会自动调用相关的方法.因此我们只要重载这个方法,就可以处理相应的事件了.
不妨先看一个例子:
/***@(#)TestFrame.java*@authorJames*/
importjavax.swing.*;importjava.awt.event.*;
publicclassTestFrameextendsJFrame{
privateintcounter=0;
publicTestFrame(){/*使用匿名类添加一个窗口监听器*/addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.out.println("ExitwhenClosedevent");//退出应用程序System.exit(0);}
publicvoidwindowActivated(WindowEvente){//改变窗口标题setTitle("TestFrame"+counter++);}});
//设置窗口为固定大小setResizable(false);setSize(200,150);}
publicstaticvoidmain(String[]args){TestFrametf=newTestFrame();tf.show();}
}这个例子中,我们设计了一个窗口类(public我们设计了一个窗口类(publicclassTestFrameextendsJFrame{……})}),并且为这个窗口添加了一个窗口监听器(addWindowListener(newWindowAdapter()……)……).而我们添加的这个窗口监听器主要监听了两个事件:
窗口关闭(publicvoid而我们添加的这个窗口监听器主要监听了两个事件windowClosing(WindowEvente)……)和窗口激活(publicvoidwindowActivated(WindowEvente)……在窗口关闭事件中我们退出了整个应用程序……).在窗口关闭事件中我们退出了整个应用程序(System.exit(0);),而在窗口激活事件中,而在窗口激活事件中我们改变了窗口的标题(setTitle("TestFrame"+counter++);).最后,我们在main方法中显示了这窗口类的一个实例我们在方法中显示了这窗口类的一个实例,运行得到下图所示的结果:
这个程序的运行结果就是一个什么东西都没有加的框架,也就是一个空窗口这个程序的运行结果就是一个什么东西都没有加的框架也就是一个空窗口.那么,你知道显示一个窗口最主要的几句代码吗?
不知道没关系,知道显示一个窗口最主要的几句代码吗我来告诉你,显示一个窗口只需要做三件事:
生成实例(对象))→设置大小→显示,相应的,就是下面的三句代码的三句代码:
JFrameframe=newJFrame("Frame"sTitle");frame.setSize(400,300);frame.setVisible(true);
也许你会说:
第一句的意思我清楚,第三句的意思我也明白,为什么一定要第二句呢?
其实想想也就明白了,叫你画一个没法有大小的矩形你能画出来吗?
不能.同样,没有大小的窗口,怎么显示?
所以我们需要用setSize(intwidth,intheight)方法为其设置大小.我们还有另一种方法:
用JFrame的pack()方法让它自己适配一个大小.pack()在多数时候是令人满意的,但有时,它也会让你哭笑不得——多试试就知道了.
在JFrame中,我们使用addWindowListener方法加入一个监听器WindowListener(addWindowListener(newWindowAdapter()……)去监听发生在JFrame上的窗口事件.WindowListener是一个接口,在java.awt.event这个包中,但是上例中好象并没有使用WindowListener,而是使用的WindowsAdapter吧,这是怎么回事?
WindowAdapter是WindowsListener接口的一个最简单的实现,也在java.awt.event包中.如果我们直接使用WindowListener产生一个类,需要实现它的每一个方法(一共7个).WindowAdapter作为WindowListener最简单的实现,但已经实现了它的每一个方法为空方法(即只包含空语句,或者说没有语句的方法).WindowAdapter就只需要重载可用能用到的方法(上例中只有2个)就行了,而不需要再去实现每一个方法.优点显而易见——减少编码量.
在JFrame上发生的窗口事件(WindowEvent)包括:
windowActivated(WindowEvente)windowClosed(WindowEvente)windowClosing(WindowEvente)windowDeactivated(WindowEvente)windowDeiconified(WindowEvente)windowIconified(WindowEvente)windowOpened(WindowEvente)
窗口得到焦点时触发窗口关闭之后触发窗口关闭时触发窗口失去焦点时触发
窗口打开之后触发
上例重载了其中两个方法.如果在上例运行产生的窗口和另外一个应用程序窗口之间来回切换(在Windows操作系统中你可以使用Alt+Tab进行切换)……试试看,你发现了什么?
有没有现我们的示例窗口标题上的数字一直在增加,这便是在windowActivated事件中setTitle("TestFrame"+counter++)的功劳.
而另一个事件处理函数windowClosing中的System.exit(0)则保证了当窗口被关闭时退出当前的Java应用程序.如果不作这样的处理会怎样呢?
试验之后你会发现,窗口虽然关闭了,但程序并没有结束,但此时,除了使用Ctrl+C强行结束之外,恐怕也没有其它办法了.所以,这一点非常重要:
你想在关闭窗口的时候退出应用程序,那就需要处理windowClosing事件.……也不尽然,其实还有另外一个更简单的办法,让JFrame自己处理这件事——你只需要如下调用JFrame的setDefaultCloseOperation即可:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
在产生JFrame对象之后执行上述语句,就可以不用处理windowsClosing事件来退出程序了.
我们可以在JFrame对象中添加AWT或者Swing组件.但是,虽然它有add方法,却不能直接用于添加组件,否则崤壮鲆斐!
恍啪褪允浴T斐烧飧鱿窒蟮脑蛑挥幸桓鼋馐停篔Frame不是一个容器,它只是一个框架.那么,应该怎么添加组件呢?
JFrame有一个ContentPane,窗口是显示的所有组件都是添加在这个ContentPane中.JFrame提供了两个方法:
getContentPane和setContentPane就是用于获取和设置其ContentPane的.通常我们不需要重新设置JFrame的ContentPane,只需要直接获取默认的ContentPane来添加组件等.如:
(newJFrame()).getContentPane().add(newButton("testbutton")).#p#分页标题#e#
按钮,切换按钮,三.按钮,切换按钮,复选按钮和单选按钮
按钮……就是按钮,不会连按钮都不知道吧?
切换按钮,有两种状态的按钮,即按下状态和弹起状态,若称为选择状态或未选择状态.复选按钮,又叫复选框,用一个小方框中是否打勾来表示两种状态.单选按钮,又叫收音机按钮,以小圆框打点表示被选中.常成组出现,一组单选按钮中只有一个能被选中.
发现什么了吗?
——对了,这一部分是在讲各种各样的按钮,而且后三种按钮都有两种状态.先看看这些按钮都长成什么样:
依次就是按钮,切换按钮,复选按钮和单选按钮..图示的窗口,就上图中,从上到下,依次就是按钮是下面这个例子的运行结果:
是下面这个例子的运行结果
/**TestButtons.java*@authorFancy*/
importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.ItemEvent;importjava.awt.event.ItemListener;
importjavax.swing.ButtonGroup;importjavax.swing.JButton;importjavax.swing.JCheckBox;
importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JRadioButton;importjavax.swing.JToggleButton;
publicfinalclassTestButtons{
publicstaticvoidmain(String[]args){TestButtonstb=newTestButtons();tb.show();}
JFrameframe=newJFrame("TestButtons");
JButtonjButton=newJButton("JButton");//按钮
JToggleButtontoggle=newJToggleButton("ToggleButton");//切换按钮
JCheckBoxcheckBox=newJCheckBox("CheckBox");//复选按钮
JRadioButtonradio1=newJRadioButton("RadioButton1");//单选按钮
JRadioButtonradio2=newJRadioButton("RadioButton2");
JRadioButtonradio3=newJRadioButton("RadioButton3");
JLabellabel=newJLabel("HereisStatus,lookhere.");//不是按钮,是静态文本
publicTestButtons(){frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().setLayout(newjava.awt.FlowLayout());
//为一般按钮添加动作监听器jButton.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventae){label.setText("YouclickedjButton");}});
//为切换按钮添加动作监听器toggle.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventae){JToggleButtontoggle=(JToggleButton)ae.getSource();if(toggle.isSelected()){label.setText("YouselectedToggleButton");}else{label.setText("YoudeselectedToggleButton");}}
});
//为复选按钮添加条目监听器checkBox.addItemListener(newItemListener(){publicvoiditemStateChanged(ItemEvente){JCheckBoxcb=(JCheckBox)e.getSource();label.setText("SelectedCheckBoxis"+cb.isSelected());}});
//用一个按钮组对象包容一组单选按钮ButtonGroupgroup=newButtonGroup();//生成一个新的动作监听器对象,备用ActionListeneral=newActionListener(){publicvoidactionPerformed(ActionEventae){JRadioButtonradio=(JRadioButton)ae.getSource();if(radio==radio1){label.setText("YouselectedRadioButton1");}elseif(radio==radio2){label.setText("YouselectedRadioButton2");}else{label.setText("YouselectedRadioButton3");}}};
//为各单选按钮添加动作监听器radio1.addActionListener(al);radio2.addActionListener(al);radio3.addActionListener(al);//将单选按钮添加到按钮组中group.add(radio1);group.add(radio2);group.add(radio3);
frame.getContentPane().add(jButton);frame.getContentPane().add(toggle);frame.getContentPane().add(checkBox);frame.getContentPane().add(radio1);frame.getContentPane().add(radio2);frame.getContentPane().add(radio3);frame.getContentPane().add(label);
frame.setSize(200,250);}
publicvoidshow(){frame.setVisible(true);}
}
除一般按钮外,其余三种按钮都有两种状态,即选择(按下)状态和未选择(弹起)状态.那么我们又该如何判断呢?
切换按钮(JToggleButton)提供了一个isSelected()方法用来判断当前所处的状态,返回值为真(true)时表示它处于选择状态,返回值为假(false)时表示它处于未选择状态.而复选按钮(JCheckBox)和单选按钮(JRadioButton)都是从JToggleButton继承的,所以也具有isSelected()方法.如上例中if(toggle.isSelected()){……}等.
单选按钮由自身的特点决定了它们必须成组出现,而且一组中只能有一个能被选中.因此我们需要用一个专门的类,ButtonGroup来管理.添加到ButtonGroup的多个单选按钮中,如果有一个被选择中,同组中的其它单选按钮都会自动改变其状态为未选择状态.在ButtonGroup中添加按钮,是使用它的add