1. 程式人生 > >徐思201771010132《面向對象程序設計(Java)》第十二周學習總結

徐思201771010132《面向對象程序設計(Java)》第十二周學習總結

bound 大學 closed color 獲得 ase extends -c 嵌套

一、理論知識部分

Java的抽象窗口工具箱(Abstract Window Toolkit, AWT)包含在java.awt包中,它提供了許多用來設計GUI的組件類和容器類。

大部分AWT組件都有其Swing的等價組件,Swing組件的名字一般是在AWT組件名前面添加一個字母“J”。

通常把由Component類的子類或間接子類創建的對象稱為一個組件。

組件類的常用API: boolean isVisible() 檢查組件是否可見

void setVisible(boolean b) 設置組件可見

void setSize(int width,int height) 把組件縮放到指定寬度和高度

void setBounds(int x,int y,int width,int height) 移動並縮放組件

Dimension getSize()得到組件的大小

void setSize(Dimension d) 把組件縮放到指定的大小

void setLocation(int x,int y)

容器是Java中能容納和排列組件的組件。常用的容器是框架(Frame,JFrame)。

Container類提供了一個方法add(),用來在容器類 組件對象中添加其他組件。

容器本身也是一個組件,可以把一個容器添加到 另一個容器裏,實現容器嵌套。

框架定位:常用Component類的setLocation和setBounds方法。常用屬性:Title:框架標題;IconImage:框架圖標。

確定框架大小:通過調用Toolkit類的方法來得到屏幕尺寸信息。

Jframe的結構:它由根面板、層級面板、玻璃面板和內容面板(content pane)四層面板構成。

Swing程序員最關心的是內容面板,也稱為內容窗格。

在AWT中可調用add()方法把組件直接添加到AWT Frame中,在Swing中組件則添加到內容窗格裏。

其中內容窗格是用來添加組件的,添加代碼如下:Container contentPane = getContentPane(); Component c=…; contentPane.add(c);

用戶也可以自行創建一個組件類,並在組件上進行繪制,此時需要重載paintComponent()。用戶的自建組件也可添加到內容窗格裏。

paintComponent(Graphics g)定義在JComponent類中,該方法在窗口需要重新繪圖時(如擴大窗口或極小化窗口),被系統自動調用.

paintComponent()方法被調用時,系統就自動產生一個Graphics類型的參數,傳遞給paintComponent方法中的參數g。

二、實驗部分

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

}

}

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);//設置用戶在此窗體上發起 "close" 時默認執行的操作
     frame.setVisible(true);//設置窗口是否可見    
   }
}

技術分享圖片

l 在elipse IDE中調試運行教材407頁程序10-1,結合程序運行結果理解程序;與上面程序對比,思考異同;

l 掌握空框架創建方法;

l 了解主線程與事件分派線程概念;

l 掌握GUI頂層窗口創建技術。

package simpleFrame;

import java.awt.*;
import javax.swing.*;

/**
 * @version 1.33 2015-05-12
 * @author Cay Horstmann
 */
public class SimpleFrameTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            SimpleFrame frame = new SimpleFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}

class SimpleFrame extends JFrame {
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;

    public SimpleFrame() {
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
}

技術分享圖片

測試程序2

l 在elipse IDE中調試運行教材412頁程序10-2,結合程序運行結果理解程序;

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

package sizedFrame;

import java.awt.*;
import javax.swing.*;

/**
 * @version 1.34 2015-06-16
 * @author Cay Horstmann
 */
public class SizedFrameTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> // lambda表達式
        {
            JFrame frame = new SizedFrame();
            frame.setTitle("SizedFrame");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 設置用戶在此窗體上發起 "close" 時默認執行的操作
            frame.setVisible(true);// 設置窗口可見
        });
    }
}

class SizedFrame extends JFrame {
    public SizedFrame() {
        // get screen dimensions

        Toolkit kit = Toolkit.getDefaultToolkit();// 生成Toolkit對象
        Dimension screenSize = kit.getScreenSize();// 返回Dimension對象的屏幕大小
        int screenHeight = screenSize.height;// 獲得Dimension對象屏幕的高度
        int screenWidth = screenSize.width;// 獲得Dimension對象屏幕的寬度

        // set frame width, height and let platform pick screen location

        setSize(screenWidth / 2, screenHeight / 2);// 調整組件的大小
        setLocationByPlatform(true);// 設置窗口下次可見時應該出現的位置

        // set frame icon

        Image img = new ImageIcon("icon.gif").getImage();
        setIconImage(img);// 設置要作為此窗口圖標顯示的圖像
    }
}

技術分享圖片

測試程序3:

l 在elipse IDE中調試運行教材418頁程序10-3,結合運行結果理解程序;

l 掌握在框架中添加組件;

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

package notHelloWorld;

import javax.swing.*;
import java.awt.*;

/**
 * @version 1.33 2015-05-12
 * @author Cay Horstmann
 */
public class NotHelloWorld {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame frame = new NotHelloWorldFrame();
            frame.setTitle("NotHelloWorld");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}

/**
 * A frame that contains a message panel
 */
class NotHelloWorldFrame extends JFrame {
    public NotHelloWorldFrame() {
        add(new NotHelloWorldComponent());
        pack();
    }
}

/**
 * A component that displays a message.
 */
class NotHelloWorldComponent extends JComponent {
    public static final int MESSAGE_X = 75;
    public static final int MESSAGE_Y = 100;

    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;

    public void paintComponent(Graphics g) {
        g.drawString("Not a Hello, World program", MESSAGE_X, MESSAGE_Y);
    }

    public Dimension getPreferredSize() {
        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
}

技術分享圖片

測試程序4:

l 在elipse IDE中調試運行教材424 -425頁程序10-4,結合程序運行結果理解程序;

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

package draw;

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

/**
 * @version 1.33 2007-05-12
 * @author Cay Horstmann
 */
public class DrawTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame frame = new DrawFrame();
            frame.setTitle("DrawTest");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}

/**
 * A frame that contains a panel with drawings
 */
class DrawFrame extends JFrame {
    public DrawFrame() {
        add(new DrawComponent());
        pack();
    }
}

/**
 * A component that displays rectangles and ellipses.
 */
class DrawComponent extends JComponent {
    private static final int DEFAULT_WIDTH = 400;
    private static final int DEFAULT_HEIGHT = 400;

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;

        // draw a rectangle

        double leftX = 100;
        double topY = 100;
        double width = 200;
        double height = 150;

        Rectangle2D rect = new Rectangle2D.Double(leftX, topY, width, height);
        g2.draw(rect);

        // draw the enclosed ellipse

        Ellipse2D ellipse = new Ellipse2D.Double();
        ellipse.setFrame(rect);
        g2.draw(ellipse);

        // draw a diagonal line

        g2.draw(new Line2D.Double(leftX, topY, leftX + width, topY + height));

        // draw a circle with the same center

        double centerX = rect.getCenterX();
        double centerY = rect.getCenterY();
        double radius = 150;

        Ellipse2D circle = new Ellipse2D.Double();
        circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius);
        g2.draw(circle);
    }

    public Dimension getPreferredSize() {
        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
}

技術分享圖片

測試程序5:

l 在elipse IDE中調試運行教材432頁-433程序10-5,結合程序運行結果理解程序;

l 了解2D圖形中字體的設置的方法;

package font;

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;

/**
 * @version 1.34 2015-05-12
 * @author Cay Horstmann
 */
public class FontTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame frame = new FontFrame();
            frame.setTitle("FontTest");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}

/**
 * A frame with a text message component
 */
class FontFrame extends JFrame {
    public FontFrame() {
        add(new FontComponent());
        pack();
    }
}

/**
 * A component that shows a centered message in a box.
 */
class FontComponent extends JComponent {
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;

        String message = "Hello, World!";

        Font f = new Font("Serif", Font.BOLD, 36);
        g2.setFont(f);

        // measure the size of the message

        FontRenderContext context = g2.getFontRenderContext();
        Rectangle2D bounds = f.getStringBounds(message, context);

        // set (x,y) = top left corner of text

        double x = (getWidth() - bounds.getWidth()) / 2;
        double y = (getHeight() - bounds.getHeight()) / 2;

        // add ascent to y to reach the baseline

        double ascent = -bounds.getY();
        double baseY = y + ascent;

        // draw the message

        g2.drawString(message, (int) x, (int) baseY);

        g2.setPaint(Color.LIGHT_GRAY);

        // draw the baseline

        g2.draw(new Line2D.Double(x, baseY, x + bounds.getWidth(), baseY));

        // draw the enclosing rectangle

        Rectangle2D rect = new Rectangle2D.Double(x, y, bounds.getWidth(), bounds.getHeight());
        g2.draw(rect);
    }

    public Dimension getPreferredSize() {
        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
}

技術分享圖片

測試程序6:

l 在elipse IDE中調試運行教材436頁-437程序10-6,結合程序運行結果理解程序;

l 了解2D圖形圖像的顯示方法。

package image;

import java.awt.*;
import javax.swing.*;

/**
 * @version 1.34 2015-05-12
 * @author Cay Horstmann
 */
public class ImageTest {
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame frame = new ImageFrame();
            frame.setTitle("ImageTest");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        });
    }
}

/**
 * A frame with an image component
 */
class ImageFrame extends JFrame {
    public ImageFrame() {
        add(new ImageComponent());
        pack();
    }
}

/**
 * A component that displays a tiled image
 */
class ImageComponent extends JComponent {
    private static final int DEFAULT_WIDTH = 350;
    private static final int DEFAULT_HEIGHT = 250;

    private Image image;

    public ImageComponent() {
        image = new ImageIcon("blue-ball.gif").getImage();
    }

    public void paintComponent(Graphics g) {
        if (image == null)
            return;

        int imageWidth = image.getWidth(null);
        int imageHeight = image.getHeight(null);

        // draw the image in the upper-left corner

        g.drawImage(image, 0, 0, null);
        // tile the image across the component

        for (int i = 0; i * imageWidth <= getWidth(); i++)
            for (int j = 0; j * imageHeight <= getHeight(); j++)
                if (i + j > 0)
                    g.copyArea(0, 0, imageWidth, imageHeight, i * imageWidth, j * imageHeight);
    }

    public Dimension getPreferredSize() {
        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }
}

技術分享圖片

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

三:實驗總結:

通過這次試驗我了解了空框架創建方法、確定框架常用屬性的設置方法、自定義組件的用法,還接觸了解了2D圖形的繪制方法,字體的設置的方法及圖像的顯示方法。通過做練習題集,對之前知識進行回顧,溫故知新。

徐思201771010132《面向對象程序設計(Java)》第十二周學習總結