1. 程式人生 > >201772020113李清華《面向物件程式設計(java)》第十二週學習總結

201772020113李清華《面向物件程式設計(java)》第十二週學習總結

1、實驗目的與要求

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

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

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

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

2、實驗內容和步驟

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

測試程式1:

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

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);   

   }

}

 

 

 

 

 

 

 

 

 

執行結果:

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

l  掌握空框架建立方法;

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

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

實驗程式碼:

 1 package simpleFrame;
 2 
 3 import java.awt.*;
 4 import javax.swing.*;
5 6 /** 7 * @version 1.33 2015-05-12 8 * @author Cay Horstmann 9 */ 10 public class SimpleFrameTest 11 { 12 public static void main(String[] args) 13 { 14 EventQueue.invokeLater(() -> 15 { 16 SimpleFrame frame = new SimpleFrame(); 17 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 18 frame.setVisible(true); 19 }); 20 } 21 } 22 23 class SimpleFrame extends JFrame 24 { 25 private static final int DEFAULT_WIDTH = 300; 26 private static final int DEFAULT_HEIGHT = 200; 27 28 public SimpleFrame() 29 { 30 setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 31 } 32 }
View Code

實驗結果:

異同點:

相同點:

1.生成的框架(frame)大小和初始位置相同

2.生成的框架均可以由使用者改變大小(setResizable方法)

3.均設定了setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)方法以關閉框架

不同點:

示例1:

使用setBounds方法設定框架大小

p407 10-1:

使用繼承的方法(用lambda表示式簡化)設定框架大小

 

測試程式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       //獲得Dimension的大小
29 
30       Toolkit kit = Toolkit.getDefaultToolkit();
31       Dimension screenSize = kit.getScreenSize();
32       int screenHeight = screenSize.height;
33       int screenWidth = screenSize.width;
34 
35       // 確定框架的大小,以及在螢幕上的位置
36 
37       setSize(screenWidth / 2, screenHeight / 2);
38       setLocationByPlatform(true);
39 
40       // 將影象設定為框架的圖示
41 
42       Image img = new ImageIcon("icon.gif").getImage();
43       setIconImage(img);      
44    }
45 }
View Code

 

實驗結果:

 

 

測試程式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  * A frame that contains a message panel
26  */
27 class NotHelloWorldFrame extends JFrame
28 {
29    public NotHelloWorldFrame()
30    {
31       add(new NotHelloWorldComponent());
32       pack();
33    }
34 }
35 
36 /**
37  * A component that displays a message.
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 }
View Code

實驗結果:

 

測試程式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  * A frame that contains a panel with drawings
27  */
28 class DrawFrame extends JFrame
29 {
30    public DrawFrame()
31    {      
32       add(new DrawComponent());
33       pack();
34    }
35 }
36 
37 /**
38  * A component that displays rectangles and ellipses.
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       // draw a rectangle
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       // draw the enclosed ellipse
60 
61       Ellipse2D ellipse = new Ellipse2D.Double();
62       ellipse.setFrame(rect);
63       g2.draw(ellipse);
64 
65       // draw a diagonal line
66 
67       g2.draw(new Line2D.Double(leftX, topY, leftX + width, topY + height));
68 
69       // draw a circle with the same center
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 }
View Code

實驗結果:

 

測試程式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  * A frame with a text message component
28  */
29 class FontFrame extends JFrame
30 {
31    public FontFrame()
32    {      
33       add(new FontComponent());
34       pack();
35    }
36 }
37 
38 /**
39  * A component that shows a centered message in a box.
40  */
41 class FontComponent extends JComponent
42 {
43    private static final int DEFAULT_WIDTH = 300;
44    private static final int DEFAULT_HEIGHT = 200;
45 
46    public void paintComponent(Graphics g)
47    {
48       Graphics2D g2 = (Graphics2D) g;
49 
50       String message = "Hello, World!";
51 
52       Font f = new Font("Serif", Font.BOLD, 36);
53       g2.setFont(f);
54 
55       // measure the size of the message
56 
57       FontRenderContext context = g2.getFontRenderContext();
58       Rectangle2D bounds = f.getStringBounds(message, context);
59 
60       // set (x,y) = top left corner of text
61 
62       double x = (getWidth() - bounds.getWidth()) / 2;
63       double y = (getHeight() - bounds.getHeight()) / 2;
64 
65       // add ascent to y to reach the baseline
66 
67       double ascent = -bounds.getY();
68       double baseY = y + ascent;
69 
70       // draw the message
71 
72       g2.drawString(message, (int) x, (int) baseY);
73 
74       g2.setPaint(Color.LIGHT_GRAY);
75 
76       // draw the baseline
77 
78       g2.draw(new Line2D.Double(x, baseY, x + bounds.getWidth(), baseY));
79 
80       // draw the enclosing rectangle
81 
82       Rectangle2D rect = new Rectangle2D.Double(x, y, bounds.getWidth(), bounds.getHeight());
83       g2.draw(rect);
84    }
85    
86    public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }
87 }
View Code

 

測試程式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 = 300;
42    private static final int DEFAULT_HEIGHT = 200;
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 }
View Code

實驗結果:

 

實驗2課後完成PTA平臺題目集:2018秋季西北師範大學面向物件程式設計(Java)練習題集(ch6-ch9)

 

實驗總結:

1.物件視窗工具箱(Abstact Window Toolkit,AWT),是JAVA1.0剛出現的時候,包含的一個GUI設計類庫。它將處理使用者介面元素的任務委派給每個目標平臺(Windows,Macintosh等)的本地GUI工具箱。本地GUI工具箱負責使用者介面元素的建立和動作。

2.後來SUN公司和Netscape建立了Swing使用者介面庫,它的模式是使用者把使用者介面元素繪製在空白視窗上,而對等體只需要完成對視窗的建立和繪製。

3.Swing有一個豐富、便捷的使用者介面元素集合。

4.Swing對底層平臺依賴很少,因此與平臺相關的bug少。

5.Swing給予不同平臺的使用者一致的感覺。

即使這樣,Swing並不能夠完全取代AWT,它是基於AWT之上,Swing僅僅提供了強大的使用者介面元件,還是要使用基本的AWT處理事件的。

6.絕大多是Swing元件都是以"J"開頭,eg:JButton,JFrame等。而AWT元件類不帶“J”,eg:Button,JFrame等。二者若混合使用會導致元件視覺和行為的不一致。

7.Swing類位於javav.swing包中,包名javax表示這是一個Java擴充套件包,而不是核心包。