1. 程式人生 > >201771010102 常惠琢 《2018面向物件程式設計(Java)》第12周學習總結

201771010102 常惠琢 《2018面向物件程式設計(Java)》第12周學習總結

第一部分:理論部分:

 1.集合框架中的介面:

2.集合框架中的實現類:

3.AWT元件(java.awt.*):

 

4.Swing 元件層次關係:

5.集合類的特點:
    集合類特點一: 只容納物件。 

        集合類特點二: 容納的物件都是Object類的例項。

實驗十二  圖形程式設計:

實驗時間 2018-11-14

1、實驗目的與要求

(1) 掌握Java GUI中框架建立及屬性設定中常用類的API;

(2) 掌握Java GUI中2D圖形繪製常用類的API;

(3) 瞭解Java GUI中2D圖形中字型與顏色的設定方法;

(4) 瞭解Java GUI中2D影象的載入方法。

2、實驗內容和步驟

實驗1: 匯入第10章示例程式,測試程式並進行程式碼註釋。

測試程式1:

l 執行下列程式,觀察程式執行結果。

import javax.swing.*;

public class SimpleFrameTest

{

   public static void main(String[] args)

   {

     JFrame  frame = new JFrame(); 

     frame.setBounds(0, 0,300, 200);

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     frame.setVisible(true);    

   }

}

 1 import javax.swing.*;
 2 public class SimpleFrameTest
 3 {
 4    public static void main(String[] args)
 5    {
 6      JFrame  frame = new JFrame(); 
 7      frame.setBounds(600, 300,300, 300);//設定視窗的彈出位置和視窗的大小
 8      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//點選視窗執行關閉的操作
 9      frame.setVisible(true);    //設定的視窗是否可見
10    }
11 }
SimpleFrameTest

 

l 在elipse IDE中除錯執行教材407頁程式10-1,結合程式執行結果理解程式;與上面程式對比,思考異同;

l 掌握空框架建立方法;

l 瞭解主執行緒與事件分派執行緒概念;

l 掌握GUI頂層視窗建立技術。

 1 package simpleFrame;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 /**
 6  * @version 1.33 2015-05-12
 7  * @author Cay Horstmann
 8  */
 9 public class SimpleFrameTest
10 {
11    public static void main(String[] args)
12    {
13       EventQueue.invokeLater(() ->//通過執行緒開啟了一個佇列
14          {
15             SimpleFrame frame = new SimpleFrame();
16             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
17             //設定使用者在此窗體上發起"close"時預設執行的操作時,使用System exit方法退出應用程式.
18             frame.setVisible(true);//設定頁面是否為可見
19          });
20    }
21 }
22 
23 class SimpleFrame extends JFrame
24 {
25    private static final int DEFAULT_WIDTH = 300;//定義寬為300
26    private static final int DEFAULT_HEIGHT = 200;//定義高為200
27 
28    public SimpleFrame()//建構函式
29    {
30       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
31    }
32 }
SimpleFrameTest

 

 

測試程式2

l 在elipse IDE中除錯執行教材412頁程式10-2,結合程式執行結果理解程式;

l 掌握確定框架常用屬性的設定方法。

 1 package sizedFrame;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.34 2015-06-16
 8  * @author Cay Horstmann
 9  */
10 public class SizedFrameTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() ->
15          {
16             JFrame frame = new SizedFrame();
17             frame.setTitle("SizedFrame");
18             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
19             frame.setVisible(true);
20          });
21    }
22 }
23 
24 class SizedFrame extends JFrame
25 {
26    public SizedFrame()
27    {
28       // 獲取螢幕尺寸 
29 
30       Toolkit kit = Toolkit.getDefaultToolkit();//生成Toolkit物件
31       Dimension screenSize = kit.getScreenSize();//返回Dimension的螢幕大小
32       int screenHeight = screenSize.height;//獲得Dimension物件的寬度
33       int screenWidth = screenSize.width;//獲得Dimension物件的高度
34 
35       // 設定框架寬度、高度並讓平臺選擇螢幕位置 
36 
37       setSize(screenWidth / 2, screenHeight / 2);//將框架的大小設定為上面取值的50%
38       setLocationByPlatform(true);
39 
40       //設定幀圖示 
41 
42       Image img = new ImageIcon("icon.gif").getImage();//將影象設定為框架圖示
43       setIconImage(img);      
44    }
45 }
SizedFrameTest

 

測試程式3:

l 在elipse IDE中除錯執行教材418頁程式10-3,結合執行結果理解程式;

l 掌握在框架中新增元件;

l 掌握自定義元件的用法。

 1 package notHelloWorld;
 2 
 3 import javax.swing.*;
 4 import java.awt.*;
 5 
 6 /**
 7  * @version 1.33 2015-05-12
 8  * @author Cay Horstmann
 9  */
10 public class NotHelloWorld
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() ->
15          {
16             JFrame frame = new NotHelloWorldFrame();
17             frame.setTitle("NotHelloWorld");
18             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
19             frame.setVisible(true);
20          });
21    }
22 }
23 
24 /**
25  * 包含訊息面板的框架。 
26  */
27 class NotHelloWorldFrame extends JFrame
28 {
29    public NotHelloWorldFrame()
30    {
31       add(new NotHelloWorldComponent());
32       pack();
33    }
34 }
35 
36 /**
37  *顯示訊息的元件。 
38  */
39 class NotHelloWorldComponent extends JComponent
40 {
41    public static final int MESSAGE_X = 75;
42    public static final int MESSAGE_Y = 100;
43 
44    private static final int DEFAULT_WIDTH = 300;
45    private static final int DEFAULT_HEIGHT = 200;
46 
47    public void paintComponent(Graphics g)
48    {
49       g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y);
50    }
51    
52    public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
53 }
NotHelloWorld

 

 

測試程式4:

l 在elipse IDE中除錯執行教材424 -425頁程式10-4,結合程式執行結果理解程式;

l 掌握2D圖形的繪製方法。

 1 package draw;
 2 
 3 import java.awt.*;
 4 import java.awt.geom.*;
 5 import javax.swing.*;
 6 
 7 /**
 8  * @version 1.33 2007-05-12
 9  * @author Cay Horstmann
10  */
11 public class DrawTest
12 {
13    public static void main(String[] args)
14    {
15       EventQueue.invokeLater(() ->
16          {
17             JFrame frame = new DrawFrame();
18             frame.setTitle("DrawTest");
19             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
20             frame.setVisible(true);
21          });
22    }
23 }
24 
25 /**
26  *包含圖畫面板的框架 
27  */
28 class DrawFrame extends JFrame
29 {
30    public DrawFrame()
31    {      
32       add(new DrawComponent());
33       pack();
34    }
35 }
36 
37 /**
38  * 顯示矩形和橢圓的元件。
39  */
40 class DrawComponent extends JComponent
41 {
42    private static final int DEFAULT_WIDTH = 400;
43    private static final int DEFAULT_HEIGHT = 400;
44 
45    public void paintComponent(Graphics g)
46    {
47       Graphics2D g2 = (Graphics2D) g;
48 
49       // 畫一個長方形;  
50 
51       double leftX = 100;
52       double topY = 100;
53       double width = 200;
54       double height = 150;
55 
56       Rectangle2D rect = new Rectangle2D.Double(leftX, topY, width, height);
57       g2.draw(rect);
58 
59       // 畫封閉橢圓 
60 
61       Ellipse2D ellipse = new Ellipse2D.Double();
62       ellipse.setFrame(rect);
63       g2.draw(ellipse);
64 
65       // 畫一條對角線 
66 
67       g2.draw(new Line2D.Double(leftX, topY, leftX + width, topY + height));
68 
69       // 用同一個中心畫一個圓 
70 
71       double centerX = rect.getCenterX();
72       double centerY = rect.getCenterY();
73       double radius = 150;
74 
75       Ellipse2D circle = new Ellipse2D.Double();
76       circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius);
77       g2.draw(circle);
78    }
79    
80    public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
81 }
DrawTest

 

 

 

測試程式5:

l 在elipse IDE中除錯執行教材432頁-433程式10-5,結合程式執行結果理解程式;

l 瞭解2D圖形中字型的設定的方法;

 1 package font;
 2 
 3 import java.awt.*;
 4 import java.awt.font.*;
 5 import java.awt.geom.*;
 6 import javax.swing.*;
 7 
 8 /**
 9  * @version 1.34 2015-05-12
10  * @author Cay Horstmann
11  */
12 public class FontTest
13 {
14    public static void main(String[] args)
15    {
16       EventQueue.invokeLater(() ->
17          {
18             JFrame frame = new FontFrame();
19             frame.setTitle("FontTest");
20             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
21             frame.setVisible(true);
22          });
23    }
24 }
25 
26 /**
27  * 帶有文字訊息元件的框架 
28  */
29 class FontFrame extends JFrame
30 {
31     //構造器
32    public FontFrame()
33    {      
34       add(new FontComponent());
35       pack();
36    }
37 }
38 
39 /**
40  * 在框中顯示中心訊息的元件。
41  */
42 class FontComponent extends JComponent
43 {
44    private static final int DEFAULT_WIDTH = 300;
45    private static final int DEFAULT_HEIGHT = 200;
46 
47    public void paintComponent(Graphics g)
48    {
49       Graphics2D g2 = (Graphics2D) g;
50 
51       String message = "柸中有雪";
52 
53       Font f = new Font("Serif", Font.BOLD, 36);
54       g2.setFont(f);
55 
56       //測量訊息的大小 
57 
58       FontRenderContext context = g2.getFontRenderContext();
59       Rectangle2D bounds = f.getStringBounds(message, context);
60 
61       // 設定(x,y)=文字左上角
62 
63       double x = (getWidth() - bounds.getWidth()) / 2;
64       double y = (getHeight() - bounds.getHeight()) / 2;
65 
66       // 增加到Y到達基線 
67 
68       double ascent = -bounds.getY();
69       double baseY = y + ascent;
70 
71       // 汲取資訊 
72 
73       g2.drawString(message, (int) x, (int) baseY);
74 
75       g2.setPaint(Color.LIGHT_GRAY);
76 
77       // 繪製基線 
78 
79       g2.draw(new Line2D.Double(x, baseY, x + bounds.getWidth(), baseY));
80 
81       // 繪製封閉矩形 
82 
83       Rectangle2D rect = new Rectangle2D.Double(x, y, bounds.getWidth(), bounds.getHeight());
84       g2.draw(rect);
85    }
86    
87    public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
88 }
FontTest

 

 

測試程式6:

l 在elipse IDE中除錯執行教材436頁-437程式10-6,結合程式執行結果理解程式;

l 瞭解2D圖形影象的顯示方法。

 1 package image;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
 5 
 6 /**
 7  * @version 1.34 2015-05-12
 8  * @author Cay Horstmann
 9  */
10 public class ImageTest
11 {
12    public static void main(String[] args)
13    {
14       EventQueue.invokeLater(() ->
15          {
16             JFrame frame = new ImageFrame();
17             frame.setTitle("ImageTest");
18             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
19             frame.setVisible(true);
20          });
21    }
22 }
23 
24 /**
25  *具有影象分量的幀 
26  */
27 class ImageFrame extends JFrame
28 {
29    public ImageFrame()
30    {
31       add(new ImageComponent());
32       pack();
33    }
34 }
35 
36 /**
37  * 顯示平鋪影象的元件。 
38  */
39 class ImageComponent extends JComponent
40 {
41    private static final int DEFAULT_WIDTH = 1500;
42    private static final int DEFAULT_HEIGHT = 800;
43 
44    private Image image;
45 
46    public ImageComponent()
47    {
48       image = new ImageIcon("blue-ball.gif").getImage();
49    }
50 
51    public void paintComponent(Graphics g)
52    {
53       if (image == null) return;
54 
55       int imageWidth = image.getWidth(null);
56       int imageHeight = image.getHeight(null);
57 
58       // 在左上角繪製圖像 
59 
60       g.drawImage(image, 0, 0, null);
61       // 在元件上平鋪影象 
62 
63       for (int i = 0; i * imageWidth <= getWidth(); i++)
64          for (int j = 0; j * imageHeight <= getHeight(); j++)
65             if (i + j > 0) 
66                g.copyArea(0, 0, imageWidth, imageHeight, i * imageWidth, j * imageHeight);
67    }
68    
69    public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
70 }
ImageTest

實驗總結:

System.exit( )和frame.setDefaultCloseOperation()的區別:

System.exit(0)是退出整個程式,如果有多個視窗,全部都銷燬退出。

frame.setDefaultCloseOperation()是設定使用者在此窗體上發起"close"時預設執行的操作。必須指定以下選項之一:   、

(1)DO_NOTHING_ON_CLOSE(在WindowConstants中定義):不執行任何操作,要求程式在已註冊的 WindowListener 物件的 windowClosing 方法中處理該操作。 

(2)HIDE_ON_CLOSE(在WindowConstants中定義):呼叫任意已註冊的WindowListener物件後自動隱藏該窗體。 

(3)DISPOSE_ON_CLOSE(在WindowConstants中定義):呼叫任意已註冊WindowListener的物件後自動隱藏並釋放該窗體。 

(4)EXIT_ON_CLOSE(在JFrame中定義):使用System exit方法退出應用程式。僅在應用程式中使用。 

預設情況下,該值被設定為 HIDE_ON_CLOSE

也就是說沒有設定的話,預設點關閉時只是隱藏窗體,在後臺程序中還可以看到,如果有多個視窗,只是銷燬呼叫dispose的視窗,其他視窗仍然存在,整個應用程式還是處於執行狀態。