Java GUI-AWT

Java GUI-AWT

[email protected]

2015年12月29日

 

1 目标:提供Java的WriteOnce,RunAnywhere的目标,提供跨平台的GUI。

2 原理:针对不同平台调用OS底层的GUI,封装统一API。

但是对于平台特有的组件无法实现Java的跨平台目标,并且Java使用JNI调用底层GUI的方式也给跨平台带来不便。于是Java在后续的GUI中使用AWT的扩展版本Swing代替AWT。

参考:《疯狂java讲义(第2版)》

注意:由于AWT已经被Swing替代,仅学习其基本功能,作为Swing的基础。

3 流程:创建组件,设置组件属性,显示组件。

//Main.java

package lee;

 

import java.awt.Frame;

import java.awt.Window;

 

/**

 * @author [email protected]

 *

 */

public class Main {

 

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Framef=new Frame();

           f.setBounds(30,30,200,200);

           f.setVisible(true);

      }

 

}

4 方法:GUI组件

参考:http://www.cnblogs.com/growup/archive/2010/04/24/1971548.html

4.1 组织结构:

Object:基类

-|Component:基本组件

--|Container:容器

--|Button等具体组件

-|MenuComponent:菜单组件

--|MenuBar:菜单栏

--|MentItem:菜单项

---|Menu:菜单

4.2 容器:用于组织其它组件,包括一个布局。

4.2.1分类:框架、对话框等。

4.2.1.1  窗口Window:抽象概念(很少使用),表示一块屏幕区域,无边框,不能调整大小。

根据子组件自动调整大小pack()。

4.2.1.2  框架Frame:Window的子类,具有边框,菜单,能够调整大小等,与Win平台的Window,From很像。默认使用BorderLayout布局。

4.2.1.3  对话框Dialog:Window的子类,与Frame类似,无菜单。

4.2.1.4  面板Panel:用于盛放其它组件,默认使用FlowLayout布局。

4.2.1.5  滚动面板ScrollPane:用于盛放其它组件,默认使用BorderLayout布局(一般不需修改)。

 

4.2.2属性设置:大小,位置等。

大小:setSize(),

位置:setLocation()。

大小和位置:setBounds()。

可见性(默认不可见):setVisible()。

4.2.3子组件设置:CRUD

增:add()。

删:

改:

查:getComponents(),getComponentAt(),getComponentCount()。

4.2.4 示例

//Main.java

package lee;

 

import java.awt.Button;

import java.awt.FlowLayout;

import java.awt.Frame;

import java.awt.Panel;

import java.awt.ScrollPane;

import java.awt.TextField;

 

/**

 * @author [email protected]

 *

 */

public class Main {

 

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Frame f=new Frame();

           f.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 10));

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

           Panelp1=new Panel();

           p1.add(new Button("Hello"));

           f.add(p1);

           ScrollPanep2=new ScrollPane();

           p2.add(new TextField(200));

           f.add(p2);

      }

 

}

4.3 布局管理器:Layout

4.3.1目标:自动调整大小,避免不同平台位置和大小需要手动调整。

4.3.2原理:根据一定的规则自动调整大小和位置。

4.3.3方法:

4.3.3.1  FlowLayout:流动布局,按顺序排列,到达边界后折行。

可以指定对齐方式,间距(水平、垂直)。

//Main.java

/**

 * Demo

 */

package lee;

 

import java.awt.Button;

import java.awt.FlowLayout;

import java.awt.Frame;

import java.awt.TextField;

 

/**

 * @author [email protected]

 *

 */

public class Main {

 

      /**

       * @param args

       */

      public static void main(String[] args) {

            // TODOAuto-generated method stub

           Frame f=new Frame();

           f.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 10));

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

           f.add(new Button("Hello"));

           f.add(new TextField(20));

      }

}

4.3.3.2  BorderLayout:分区布局,按五大区域分块(与easyui相同)。

默认添加到Center区域中。

//Main.java

/**

 * Demo

 */

package lee;

 

import java.awt.BorderLayout;

import java.awt.Button;

import java.awt.Frame;

 

/**

 * @author [email protected]

 *

 */

public class Main {

 

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Frame f=new Frame();

           f.setLayout(new BorderLayout(20, 10));

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

           f.add(new Button("NORTH"),BorderLayout.NORTH);

           f.add(new Button("WEST"),BorderLayout.WEST);     

           f.add(new Button("CENTER"),BorderLayout.CENTER);       

           f.add(new Button("EAST"),BorderLayout.EAST);

           f.add(new Button("SOUTH"),BorderLayout.SOUTH);

           f.pack();

      }

}

4.3.3.3  GridLayout:表格,从左到右,从上到下组织。

//Main.java

/**

 * Demo

 */

package lee;

 

import java.awt.Button;

import java.awt.Frame;

import java.awt.GridLayout;

 

/**

 * @author [email protected]

 *

 */

public class Main {

 

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Frame f=new Frame();

           f.setLayout(new GridLayout(3, 2));

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

           f.add(new Button("1"));

           f.add(new Button("2"));          

           f.add(new Button("3"));          

           f.add(new Button("4"));

           f.add(new Button("5"));

           f.pack();

      }

}

4.3.3.4  GridBagLayout:可以合并单元格的表格 (好麻烦)。

//Main.java

/**

 * Demo

 */

package lee;

 

import java.awt.Button;

import java.awt.Frame;

importjava.awt.GridBagConstraints;

import java.awt.GridBagLayout;

 

/**

 * @author [email protected]

 *

 */

public class Main {

 

      private GridBagLayout gb;

      private Frame f;

      private GridBagConstraints gbc;

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           new Main().init();

      }

     

      public void init(){

           f=new Frame();

           gb=new GridBagLayout();

           f.setLayout(gb);

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

 

           gbc = new GridBagConstraints();

           gbc.fill=GridBagConstraints.BOTH;

//         gbc.weightx=1;

//         gbc.weighty=1;

           gbc.gridwidth=2;

           gbc.gridwidth=GridBagConstraints.REMAINDER;

           addButton(new Button("1"));

           gbc.gridwidth=1;

           gbc.gridheight=3;

           addButton(new Button("2"));

           gbc.gridheight=1;

           gbc.gridwidth=GridBagConstraints.REMAINDER;

           addButton(new Button("3"));      

           gbc.gridwidth=GridBagConstraints.REMAINDER;

           addButton(new Button("4"));

           gbc.gridwidth=GridBagConstraints.REMAINDER;

           addButton(new Button("5"));

           f.pack();       

      }

     

      public void addButton(Button btn){

           gb.setConstraints(btn, gbc);

           f.add(btn);

      }

}

4.3.3.5  CardLayout:层叠布局,每次只显示一个。

//Main.java

/**

 * Demo

 */

package lee;

 

import java.awt.Button;

import java.awt.CardLayout;

import java.awt.Frame;

 

/**

 * @author [email protected]

 *

 */

public class Main {

 

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Frame f=new Frame();

           CardLayout c=new CardLayout(30, 20);

           f.setLayout(c);

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

           f.add("1",new Button("1"));

           f.add("2",new Button("2"));      

           f.add("3",new Button("3"));      

           f.add("4",new Button("4"));

           f.add("5",new Button("5"));

           f.pack();

           c.show(f,"3");

      }

 

}

4.3.3.6  绝对定位:使用null作为布局(无布局,不具备跨平台性)。

//Main.java

/**

 * Demo

 */

package lee;

 

import java.awt.Button;

import java.awt.CardLayout;

import java.awt.Frame;

 

/**

 * @author [email protected]

 *

 */

public class Main {

 

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Frame f=new Frame();

           f.setLayout(null);

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

           Button btn1=new Button("1");

           btn1.setBounds(0, 0, 100, 100);;

           f.add(btn1);

           Button btn2=new Button("2");

           btn2.setBounds(50, 100, 100, 100);;

           f.add(btn2);

      }

 

}

4.3.3.7  BoxLayout:GridBagLayout的简化版本。

//Main.java

/**

 * Demo

 */

package lee;

 

import java.awt.BorderLayout;

import java.awt.Button;

import java.awt.CardLayout;

import java.awt.FlowLayout;

import java.awt.Frame;

 

import javax.swing.Box;

import javax.swing.BoxLayout;

 

/**

 * @author [email protected]

 *

 */

public class Main {

 

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Frame f=new Frame();

           f.setLayout(new BorderLayout());

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

           Box hori=Box.createHorizontalBox();

           hori.add(new Button("1"));

           f.add(hori,BorderLayout.NORTH);

           Box ver=Box.createVerticalBox();

           ver.add(new Button("2"));

           f.add(ver,BorderLayout.WEST);

           Box ver2=Box.createVerticalBox();

           ver2.add(new Button("3"));

           ver2.add(new Button("4"));

           ver2.add(new Button("5"));

           f.add(ver2,BorderLayout.CENTER);

           f.pack();

      }

 

}

4.4 事件机制:事件源+监听对象注册

4.4.1目标:制定不同的事件,对应的监听接口(需要注册监听对象给组件),当组件触发事件时,发送事件给监听对象。

4.4.2原理:事件源管理其自身的事件,并管理注册的事件监听对象。当事件触发时,向所有的注册对象发送事件。

4.4.3流程:创建事件源,注册监听对象,触发事件,调用监听对象的处理函数。

4.4.3.1  创建事件源:创建组件对象。

           Buttonbtn1=new Button("Btn1");

4.4.3.2  注册监听对象:向组件的事件监听函数中添加监听对象(实现处理函数)(一般使用匿名类)。

           btn1.addActionListener(newActionListener() {          

。。。。。。

}

4.4.3.3  触发对象,调用监听函数。

//Main.java

package lee;

 

import java.awt.Button;

import java.awt.FlowLayout;

import java.awt.Frame;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

 

public class Main {

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Frame f=new Frame();

           f.setBounds(0, 0, 200, 200);

           f.setTitle("Hello,World!");

           f.setVisible(true);

           f.setLayout(new FlowLayout());

           Buttonbtn1=new Button("Btn1");

           f.add(btn1);

           btn1.addActionListener(newActionListener() {          

                 @Override

                 public void actionPerformed(ActionEvent e) {

                      // TODO Auto-generated method stub

                      System.out.println("xx");

                 }

           });

      }

}

4.4.4方法:事件分类、适配器

事件分为低级事件(基于组件的基本事件)和高级事件(低级事件的抽象)。每种事件都其对应的接口(可能含有多个事件)。

为了只处理关心的事件,可以使用事件适配器(默认实现了接口所有方法),只改写关心的方法。

4.5 菜单:菜单条-菜单-菜单项(标签+快捷键)

4.5.1结构:树形结构,快捷键作为对象,以属性的形式设置。

菜单条menubar:用于放置菜单,使用container.setMenuBar(mb)添加菜单。

-|菜单menu:用于旋转菜单项

--|菜单项menuitem:各个功能菜单按钮

---|标签String:显示的菜单文本

---|快捷键MenuShortcut:ctrl、shift等结合的虚拟键

4.5.2示例:

//Main.java

/**

 * Demo

 */

package lee;

 

import java.awt.BorderLayout;

import java.awt.Frame;

import java.awt.Menu;

import java.awt.MenuBar;

import java.awt.MenuItem;

import java.awt.MenuShortcut;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

importjava.awt.event.KeyEvent;

 

/**

 * @author [email protected]

 *

 */

public class Main {

 

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           Frame f=new Frame();

           f.setLayout(new BorderLayout());

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

          

           //menubar

           MenuBarmb=new MenuBar();

           //file menu

           Menu mFile=newMenu("File");

           mb.add(mFile);

           MenuItem mi=newMenuItem("Open",new MenuShortcut(KeyEvent.VK_A,false));

           mFile.add(mi);

           mFile.addSeparator();

           MenuItem miSave=new MenuItem("Save",newMenuShortcut(KeyEvent.VK_S,false));

           mFile.add(miSave);

           //add menubar

           f.setMenuBar(mb);

          

           //event

           mi.addActionListener(new ActionListener() {

                

                 @Override

                 public void actionPerformed(ActionEvent e) {

                      // TODO Auto-generated method stub

                      System.out.println("Open");

                 }

           });

           miSave.addActionListener(new ActionListener() {

                

                 @Override

                 public void actionPerformed(ActionEvent e) {

                      // TODO Auto-generated method stub

                      System.out.println("Save");

                 }

           });

      }

}

4.6 弹出式菜单:弹出菜单-菜单-菜单项(标签+快捷键)

4.6.1结构(与菜单栏相似):树形结构,快捷键作为对象,以属性的形式设置。

弹出菜单:用于放置菜单,使用container.add(pop)添加菜单,使用pop.show()显示。

-|菜单menu:用于旋转菜单项

--|菜单项menuitem:各个功能菜单按钮

---|标签String:显示的菜单文本

---|快捷键MenuShortcut:ctrl、shift等结合的虚拟键

4.6.2流程:构造弹出菜单,监听事件,响应右键弹出

4.6.2.1  构造弹出菜单

           //popup

           finalPopupMenu pop=new PopupMenu("xx");

           //file menu

           Menu mFile=new Menu("File");

           pop.add(mFile);

           MenuItem mi=new MenuItem("Open",newMenuShortcut(KeyEvent.VK_A,false));

           mFile.add(mi);

           mFile.addSeparator();

           MenuItem miSave=new MenuItem("Save",newMenuShortcut(KeyEvent.VK_S,false));

           mFile.add(miSave);

           f.add(pop);

4.6.2.2  监听事件,响应右键弹出:需要弹出的组件上监听鼠标事件,响应右键

           f.addMouseListener(newMouseAdapter() {

                 @Override

                 public void mouseReleased(MouseEvent e) {

                      // TODO Auto-generated method stub

                      if(e.isPopupTrigger()){

                            pop.show(f,e.getX(), e.getY());

                      }

                 }

           });

4.6.3示例:监听鼠标事件

//Main.java

/**

 * Demo

 */

package lee;

 

import java.awt.BorderLayout;

import java.awt.Frame;

import java.awt.Menu;

import java.awt.MenuItem;

import java.awt.MenuShortcut;

import java.awt.PopupMenu;

importjava.awt.event.ActionEvent;

import java.awt.event.ActionListener;

importjava.awt.event.KeyEvent;

importjava.awt.event.MouseAdapter;

importjava.awt.event.MouseEvent;

 

/**

 * @author [email protected]

 *

 */

public class Main {

 

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           final Frame f=new Frame();

           f.setLayout(new BorderLayout());

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

          

           //popup

           finalPopupMenu pop=new PopupMenu("xx");

           //file menu

           Menu mFile=new Menu("File");

           pop.add(mFile);

           MenuItem mi=new MenuItem("Open",newMenuShortcut(KeyEvent.VK_A,false));

           mFile.add(mi);

           mFile.addSeparator();

           MenuItem miSave=new MenuItem("Save",newMenuShortcut(KeyEvent.VK_S,false));

           mFile.add(miSave);

           f.add(pop);

          

           //event

           mi.addActionListener(new ActionListener() {

                

                 @Override

                 public void actionPerformed(ActionEvent e) {

                      // TODO Auto-generated method stub

                      System.out.println("Open");

                 }

           });

           miSave.addActionListener(new ActionListener() {

                

                 @Override

                 public void actionPerformed(ActionEvent e) {

                      // TODO Auto-generated method stub

                      System.out.println("Save");

                 }

           });

           f.addMouseListener(new MouseAdapter() {

                 @Override

                 public void mouseReleased(MouseEvent e) {

                      // TODO Auto-generated method stub

                      if(e.isPopupTrigger()){

                            pop.show(f,e.getX(), e.getY());

                      }

                 }

           });

      }

}

 

5 方法:2D绘图

5.1 目标:2D绘图,能够在界面上绘制出2D图形。

5.2 原理:所有绘图在Component上进行。Component使用paint(Graphicsg)进行实际绘制。更新时使用update(),主动要求绘制时调用repaint()。系统会自动控制各个组件的绘制。专门进行绘图的组件是Canvas。

repaint()调用update(),update()调用paint()。

5.3 流程:继承Canvas,重写paint(), 向容器中添加Canvas对象并设置其大小。

5.3.1继承Canvas,重写paint():

class MyCanvas extends Canvas{

      private int shape;

      @Override

      publicvoid paint(Graphics g) {

           // TODO Auto-generated method stub

           if(0==shape){

                 g.drawRect(0, 0, 50, 50);

           }

           else{

                 g.drawOval(0,50,50,50);

           }

      }

      public int getShape() {

           return shape;

      }

      public void setShape(int shape) {

           this.shape = shape;

      }

     

}

5.3.2向容器中添加Canvas对象并设置其大小:

           finalMyCanvas c = new MyCanvas();

           c.setPreferredSize(newDimension(100,100));

5.3.3示例

//Main.java

/**

 * Demo

 */

package lee;

 

import java.awt.BorderLayout;

import java.awt.Button;

import java.awt.Canvas;

import java.awt.Dimension;

import java.awt.Frame;

import java.awt.Graphics;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

 

/**

 * @author [email protected]

 *

 */

public class Main {

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           final Frame f=new Frame();

           f.setLayout(new BorderLayout());

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

           //add canvas

           finalMyCanvas c = new MyCanvas();

           c.setPreferredSize(newDimension(100,100));

           f.add(c,BorderLayout.NORTH);     

          

           //add button

           Button btn1=new Button("Rect");

           Button btn2=new Button("Oval");

           f.add(btn1,BorderLayout.WEST);

           f.add(btn2,BorderLayout.CENTER);

           //btn listener

           btn1.addActionListener(new ActionListener() {

                

                 @Override

                 public void actionPerformed(ActionEvent e) {

                      // TODO Auto-generated method stub

                      c.setShape(0);

                      c.repaint();

                 }

           });

          

           btn2.addActionListener(new ActionListener() {

                

                 @Override

                 public void actionPerformed(ActionEvent e) {

                      // TODO Auto-generated method stub

                      c.setShape(1);

                      c.repaint();

                 }

           });

          

      }

}

 

//graphics canvas

class MyCanvas extends Canvas{

      private int shape;

      @Override

      publicvoid paint(Graphics g) {

           // TODO Auto-generated method stub

           if(0==shape){

                 g.drawRect(0, 0, 50, 50);

           }

           else{

                 g.drawOval(0,50,50,50);

           }

      }

      public int getShape() {

           return shape;

      }

      public void setShape(int shape) {

           this.shape = shape;

      }

     

}

5.4 方法:graphics

参考:http://blog.csdn.net/qgjava/article/details/5860079

目标:绘制图形。

原理:抽象画笔提供各种绘图接口,具体实现由JVM根据具体底层OS实例化后传给paint()。

方法:绘制直线,字符串,矩形等图形。

5.5 方法:位图读写

5.5.1目标:读取已有的图片,向文件写入图像。

5.5.2原理:ImageIO读写图片文件,使用BufferedImage作为图片缓存进行双缓冲。

5.5.3流程:读写图片

5.5.3.1  读取图片:读取图片,绘制。

                 try {

                      Image srcImage=ImageIO.read(newFile("D:/Test/Penguins.jpg"));

                      g.drawImage(srcImage,0,0,100,100,null);

                 } catch (IOException e) {

                      // TODO Auto-generated catch block

                      e.printStackTrace();

                 }

5.5.3.2  写出图片:创建缓冲区,获取画笔,绘制到缓冲区,写出。

                 BufferedImagebuf=new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);

                 GraphicsgBuf=buf.getGraphics();

                 gBuf.drawOval(0,0, 50, 50);

                 g.drawOval(0, 0, 50, 50);

                 try {

                      ImageIO.write(buf, "jpeg", newFile("D:/Test/My.jpg"));

                 } catch(IOException e) {

                      // TODO Auto-generated catch block

                      e.printStackTrace();

                 }

5.5.3.3  示例

//Main.java

/**

 * Demo

 */

package lee;

 

import java.awt.BorderLayout;

import java.awt.Button;

import java.awt.Canvas;

import java.awt.Dimension;

import java.awt.Frame;

import java.awt.Graphics;

import java.awt.Image;

importjava.awt.event.ActionEvent;

importjava.awt.event.ActionListener;

importjava.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

 

import javax.imageio.ImageIO;

 

/**

 * @author [email protected]

 *

 */

public class Main {

      /**

       * @param args

       */

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           final Frame f=new Frame();

           f.setLayout(new BorderLayout());

           f.setBounds(30,30,200,200);

           f.setVisible(true);

           f.setTitle("Hello,World!");

           //add canvas

           final MyCanvas c = new MyCanvas();

           c.setPreferredSize(new Dimension(100,100));

           f.add(c,BorderLayout.NORTH);     

          

           //add button

           Button btn1=new Button("Read");

           Button btn2=new Button("Write");

           f.add(btn1,BorderLayout.WEST);

           f.add(btn2,BorderLayout.CENTER);

           //btn listener

           btn1.addActionListener(new ActionListener() {

                

                 @Override

                 public void actionPerformed(ActionEvent e) {

                      // TODO Auto-generated method stub

                      c.setShape(0);

                      c.repaint();

                 }

           });

          

           btn2.addActionListener(new ActionListener() {

                

                 @Override

                 public void actionPerformed(ActionEvent e) {

                      // TODO Auto-generated method stub

                      c.setShape(1);

                      c.repaint();

                 }

           });

          

      }

}

 

//graphics canvas

class MyCanvas extendsCanvas{

      private int shape;

      @Override

      public void paint(Graphics g) {

           // TODO Auto-generated method stub

           if(0==shape){//read image

 

                 try {

                      Image srcImage=ImageIO.read(new File("D:/Test/Penguins.jpg"));

                      g.drawImage(srcImage,0,0,100,100,null);

                 } catch (IOException e) {

                      // TODO Auto-generated catch block

                      e.printStackTrace();

                 }

           }

           else{

                 BufferedImagebuf=new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);

                 Graphics gBuf=buf.getGraphics();

                 gBuf.drawOval(0,0, 50, 50);

                 g.drawOval(0, 0, 50, 50);

                 try {

                      ImageIO.write(buf, "jpeg", newFile("D:/Test/My.jpg"));

                 } catch (IOException e) {

                      // TODO Auto-generated catch block

                      e.printStackTrace();

                 }

           }

      }

      public int getShape() {

           return shape;

      }

      public void setShape(int shape) {

           this.shape = shape;

      }

     

}

6 示例

 

 

你可能感兴趣的:(java,layout,graphics,awt,2d)