《java图形界面编程.ppt》由会员分享,可在线阅读,更多相关《java图形界面编程.ppt(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第10课 用户界面设计参见Java语言与面向对象程序设计的第7章,第8章8.3节AWT容器容器n容器Container能够用来存放别的组件。n有两种类型的容器:Window和Panel。Frame容器容器nWindow是能独立存在的容器,它有一个子类Frame。nFrame有一个构造方法Frame(String title)n你可以通过add()方法,在Frame中加入其他的组件。nFrame被创建后,它是不可见的.n参见FrameShower.java FrameShower.javapackage gui;import java.awt.*;public class FrameShower
2、 public static void main(String args)Frame f=new Frame(hello);f.add(new Button(Press Me);f.setSize(100,100);f.setVisible(true);Panel容器Panel只能存在于其他的容器(Window或其子类)中.n通过Panel的默认构造方法Panel()可以创建一个Panel。n参见MyFrame.javaMyFrame.javapackage gui;import java.awt.*;public class MyFrame extends Frame Panel panel
3、=new Panel();Button button=new Button(press me);public MyFrame(String title)super(title);panel.add(button);panel.setBackground(Color.yellow);add(panel);setBackground(Color.blue);setSize(500,500);setVisible(true);public static void main(String args)MyFrame f=new MyFrame(hello);布局管理器一.取消布局管理器setLayout
4、(null)二.默认布局管理器Window,Frame和Dialog的默认布局管理器是BorderLayoutPanel和Applet的默认布局管理器是FlowLayout。取消布局管理器public MyFrame(String title)super(title);panel.setLayout(null);panel.setSize(200,200);panel.setLocation(50,50);button.setSize(80,50);button.setLocation(80,80);panel.add(button);panel.setBackground(Color.yel
5、low);setLayout(null);add(panel);setBackground(Color.blue);setSize(500,500);setVisible(true);yx布局管理器n布局管理器分为5种:n-FlowLayout 流式布局管理器n-BorderLayout边界布局管理器n-GridLayout网格布局管理器n-CardLayout卡片布局管理器n-GridBagLayout网格包布局管理器布局管理器练习运行 MyFlow.java运行 BorderLayoutTester.java运行GridEx.java运行 CardLayoutTester.java运行Gr
6、idBagEx1.java改变容器中组件的布局,观看显示效果FlowLayoutpublic class MyFlow private Frame f;private Button button1,button2,button3;public static void main(String args)MyFlow mflow=new MyFlow();mflow.go();public void go()f=new Frame(Flow Layout);f.setLayout(new FlowLayout();button1=new Button(Ok);button2=new Button(
7、Open);button3=new Button(Close);f.add(button1);f.add(button2);f.add(button3);f.setSize(600,600);f.setVisible(true);BorderLayoutpublic class BorderLayoutTester private Frame f;private Button bn,bs,bw,be,bc;public static void main(String args)BorderLayoutTester guiWindow2=new BorderLayoutTester();guiW
8、indow2.go();public void go()f=new Frame(Border Layout);/f.setLayout(new BorderLayout();bn=new Button(B1);bs=new Button(B2);be=new Button(B3);bw=new Button(B4);bc=new Button(B5);f.add(bn,BorderLayout.NORTH);f.add(bs,BorderLayout.SOUTH);f.add(be,BorderLayout.EAST);f.add(bw,BorderLayout.WEST);f.add(bc,
9、BorderLayout.CENTER);f.add(new Button(hello);f.pack();f.setVisible(true);GridLayoutpublic class GridEx private Frame f;private Button b1,b2,b3,b4,b5,b6;public static void main(String args)GridEx grid=new GridEx();grid.go();public void go()f=new Frame(Grid example);f.setLayout(new GridLayout(3,2);b1=
10、new Button(1);b2=new Button(2);b3=new Button(3);b4=new Button(4);b5=new Button(5);b6=new Button(6);f.add(b1);f.add(b2);f.add(b3);f.add(b4);f.add(b5);f.add(b6);f.setSize(500,500);f.setVisible(true);CardLayoutpublic class CardLayoutTester public static void main(String args)Panel p1,p2,p3;Frame f=new
11、Frame(Card Test);CardLayout myCard=new CardLayout();f.setLayout(myCard);p1=new Panel();p2=new Panel();p3=new Panel();f.setBackground(Color.white);p1.setBackground(Color.black);p2.setBackground(Color.blue);p3.setBackground(Color.red);f.add(p1,First);f.add(p2,Second);f.add(p3,Third);myCard.show(f,Seco
12、nd);f.setSize(200,200);f.setVisible(true);创建面板及复杂布局创建面板及复杂布局 参见 ExGui3.java创建面板及复杂布局创建面板及复杂布局 参见ExGui4.java事件处理n每一个可以触发事件的组件被当作事件源.n每一种事件都对应专门的监听者。n监听者用来接收和处理这种事件。n一个事件源可以触发多种事件,如果它注册了某种事件对应的监听者,那么这种事件就会被接收和处理。这种模式被称为 委托模型。事件处理的软件实现n事件类(XXXEvent)n事件监听接口(XXXListener)n组件的注册监听接口方法(addXXXListener()方法)事件
13、处理1.用内部类实现监听接口参看EventTester1.java2.将容器类实现监听接口参看EventTester2.java3.定义专门的外部类实现监听接口参看EventTester3.java4.采用事件适配器参看EventTester4.java5.一个组件注册多个监听者参看EventTester5.java用内部类实现监听接口public class EventTester1 extends Frame static int count=1;public EventTester1(String title)super(title);public static void main(St
14、ring args)EventTester1 f=new EventTester1(hello);f.setLayout(new FlowLayout();final Button b=new Button(1);b.addActionListener(new ActionListener()/declare an Inner class public void actionPerformed(ActionEvent evt)b.setLabel(new Integer(+count).toString(););f.add(b);f.setSize(100,100);f.setBackgrou
15、nd(Color.blue);f.setVisible(true);将容器类实现监听接口public class EventTester2 extends Frame implements ActionListener int count=1;Button b;public EventTester2(String title)super(title);setLayout(new FlowLayout();b=new Button(1);b.addActionListener(this);/Sample itself is an ActionListener add(b);setSize(100
16、,100);setBackground(Color.blue);setVisible(true);public static void main(String args)EventTester2 f=new EventTester2(hello);public void actionPerformed(ActionEvent evt)b.setLabel(new Integer(+count).toString();定义专门的外部类实现监听接口public class EventTester3 extends Frame Button b;Button b1;public EventTeste
17、r3(String title)super(title);setLayout(new FlowLayout();b=new Button(1);b.addActionListener(new MyListener(1);add(b);b1=new Button(not registred);add(b1);setSize(100,100);setBackground(Color.blue);setVisible(true);public static void main(String args)EventTester3 f=new EventTester3(hello);class MyLis
18、tener implements ActionListener int count;public MyListener(int count)this.count=count;public void actionPerformed(ActionEvent evt)Button b=(Button)evt.getSource();b.setLabel(new Integer(+count).toString();采用事件适配器public class EventTester4 extends Frame Button b;public EventTester4(String title)super
19、(title);setLayout(new FlowLayout();b=new Button(1);b.addMouseListener(new MyMouseListener(1);add(b);setSize(100,100);setBackground(Color.blue);setVisible(true);public static void main(String args)EventTester4 f=new EventTester4(hello);class MyMouseListener extends MouseAdapter int count;public MyMou
20、seListener(int count)this.count=count;public void mousePressed(MouseEvent evt)Button b=(Button)evt.getSource();/get event source b.setLabel(new Integer(+count).toString();mousePressed(MouseEvent)mouseReleased(MouseEvent)mouseEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)一个组件注册多个监
21、听者public class EventTester5 extends Frame Button b;public EventTester5(String title)super(title);setLayout(new FlowLayout();b=new Button(Mouse 1);b.addMouseListener(new MyMouseListener1(1);/register MyMouseListener b.addActionListener(new MyActionListener(1);/register MyActionListener add(b);setSize
22、(300,300);setBackground(Color.blue);setVisible(true);public static void main(String args)EventTester5 f=new EventTester5(hello);事件类class MyListener implements ActionListener int count;public MyListener(int count)this.count=count;public void actionPerformed(ActionEvent evt)Button b=(Button)evt.getSou
23、rce();b.setLabel(new Integer(+count).toString();事件监听接口组件注册监听接口n组件可以通过addXXXListener方法(XXX表示某种事件)注册监听者。n子类组件继承父类的所有注册监听者的方法。事件处理练习:为计算器加上事件处理,使它能进行简单的计算ExGui4.java-Calculater.java AWT绘图绘图n在Component类中提供了三个和绘图有关的方法:npaint(Graphics g):绘制组件的外观。nupdate(Graphics g):调用paint()方法,刷新组件的外观。nrepaint():调用update(
24、)方法,刷新组件的外观。nGraphics类提供了绘制各种图形的方法ndrawLine(int x1,int y1,int x2,int y2):画一条直线ndrawString(String string,int left,int bottom):写一个字符串ndrawImage(Image image,int left,int top,ImageObserver observer):画一个图片ndrawRect(int left,int top,int width,int height):画一个矩形ndrawOval(int x,int y,int width,int height):画一
25、个椭圆nfillRect(int left,int top,int width,int height):填充一个矩形nfillOval(int x,int y,int width,int height)/填充一个椭圆 AWT绘图绘图repaint()调用update(),update()调用paint()一个绘图例子(SampleDrawer.java)按下Change Color按钮SampleDrawer.javapublic class SampleDrawer extends Frame implements ActionListener Color color=Color.red;B
26、utton b;public SampleDrawer(String title)super(title);setLayout(new FlowLayout();b=new Button(Change Color);b.addActionListener(this);add(b);setSize(300,300);setVisible(true);public void paint(Graphics g)g.setColor(color);g.fillRect(100,100,100,100);g.setColor(Color.black);g.fillRect(0,100,100,100);
27、g.fillRect(200,100,100,100);g.fillRect(0,200,300,100);public static void main(String args)SampleDrawer f=new SampleDrawer(hello);public void actionPerformed(ActionEvent evt)if(color=Color.red)color=Color.green;else color=Color.red;repaint();/call repaint()method 随机画椭圆OvalDrawer.javaOvalDrawer类 的 pai
28、nt()方 法 负 责 画 一 个 椭 圆,OvalDrawer类还实现了Runnable接口,在run()方法中,每隔400毫秒就会随机的设置椭圆的起始坐标(x,y)、椭圆的宽width和高height,然后调用OvalDrawer的repaint()方法刷新界面。public void run()while(true)x=(int)(Math.random()*300);y=(int)(Math.random()*300);width=(int)(Math.random()*100);height=(int)(Math.random()*100);color=colors(int)(Mat
29、h.random()*(colors.length-1);repaint();tryThread.sleep(400);catch(InterruptedException e)throw new RuntimeException(e);Swing组件n在java.awt包中,提供了各种具体的组件,如窗体Frame、面板Panel、按钮Button、文本框TextField和文本区域TextArea等。AWT组件的优点是简单、稳定,兼容于任何一个JDK版本,缺点是依赖于本地操作系统的GUI,缺乏平台独立性。n为了使用Java创建的图形界面也能够跨平台,即在不同操作系统中保持相同的外观,从JDK
30、1.2版本开始引入了Swing组件,这些Swing组件位于javax.swing包中,成为JDK基础类库的一部分。nSwing组件是用纯Java语言编写而成的,不依赖于本地操作系统的GUI,Swing组件可以跨平台运行。独立于本地平台的Swing组件被称为轻量级组件,而依赖于本地平台的AWT组件被称为重量级组件。JComponentn多数Swing组件的父类为javax.swing.JComponentJFramenJFrame与Frame的最大区别在于前者不能直接通过add()方法加入组件,也不能直接通过setLayout()方法设置布局。/以下代码非法JFrame jFrame=new J
31、Frame(Hello);jFrame.setLayout(new GridLayout(2,1);jFrame.add(jLabel);jFrame.add(jButton);JFramen每个JFrame都有一个与之关联的内容面板(contentPane),只 能 针 对 这 个contentPane设置布局,以及加入组件:JFrame jFrame=new JFrame(Hello);/获得与JFrame关联的contentPane,contentPane默认的布局管理器为BorderLayoutContainer contentPane=jFrame.getContentPane();
32、contentPane.setLayout(new GridLayout(2,1);contentPane.add(jLabel);contentPane.add(jButton);JFramenJFrame的setDefaultCloseOperation(int operation)方法用来决定如何响应用户关闭窗体的操作,参数operation有以下可选值:nJFrame.DO_NOTHING_ON_CLOSE:什么也不做。nJFrame.HIDE_ON_CLOSE:隐藏窗体,这是JFrame的默认选项。nJFrame.EXIT_ON_CLOSE:结束程序。frame.addWindowL
33、istener(new MyWindowListener();class MyWindowListener extends WindowAdapter public void windowClosing(WindowEvent evt)System.exit(0);SimpleSwingDemo.javaJButtonJLabelSimpleSwingDemo.javapublic class SimpleSwingDemo extends Jframe implements ActionListener private JLabel jLabel;private JButton jButto
34、n;private String labelPrefix=Number of button clicks:;private int numClicks=0;public SimpleSwingDemo(String title)super(title);jLabel=new JLabel(labelPrefix+0);jButton=new JButton(I am a Swing button!);/创建一个快捷键:用户按下Alt-i键等价于点击该Button jButton.setMnemonic(i);/设置鼠标移动到该Button时的提示信息 jButton.setToolTipTex
35、t(Press me);jButton.addActionListener(this);Container contentPane=getContentPane();contentPane.setLayout(new GridLayout(2,1);contentPane.add(jLabel);contentPane.add(jButton);pack();setVisible(true);/当用户选择JFrame的关闭图标,将结束程序 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);public void actionPerformed(ActionEvent e)numClicks+;jLabel.setText(labelPrefix+numClicks);public static void main(String args)new SimpleSwingDemo(Hello);
限制150内