1. 程式人生 > >java圖形化Swing教程(一)

java圖形化Swing教程(一)

與多執行緒、泛型等不同,Swing主要在於使用。
下面主要放程式碼和註釋,少說話。

(一)基本框架

package Swing;

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

/**
 * 
 * @author QuinnNorris
 * 基本框架
 */
public class FrameTest {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // 開啟一個執行緒,所有的Swing元件必須由事件分派執行緒進行配置,執行緒將滑鼠點選和按鍵控制轉移到使用者介面元件。
EventQueue.invokeLater(new Runnable() { // 匿名內部類,是一個Runnable介面的例項,實現了run方法 public void run() { SimpleFrame frame = new SimpleFrame(); // 建立下面自己定義的SimpleFrame類物件,以便於呼叫構造器方法 frame.setExtendedState(Frame.MAXIMIZED_BOTH); // 將視窗最大化
// 其他可選屬性:Frame.NORMAL ICONIFIED MAXIMIZED_HORIZ MAXIMIZED_VERT // MAXIMIZED_BOTH frame.setTitle("Christmas"); // 設定視窗標題 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 選擇當用戶關閉框架時進行的操作 ,在有些時候需要將視窗隱藏,不能直接退出需要用到這個方法
frame.setVisible(true); // 將視窗可見化,這樣以便使用者在第一次看見視窗之前我們能夠向其中新增內容 } }); } // main結束時,程式並沒有結束,而是結束了主執行緒,知道所有框架關閉或者呼叫了 System.exit事才終止程式 } class SimpleFrame extends JFrame { public SimpleFrame() { Toolkit kit = Toolkit.getDefaultToolkit(); // 修改視窗在螢幕上面的位置,改變視窗大小 // Toolkit類包含很多與本地視窗互動的方法 Dimension screenSize = kit.getScreenSize(); // Toolkit的獲取頻幕大小的方法返回一個Dimension的類物件 setSize((int) (screenSize.getWidth()), (int) (screenSize.getHeight())); // setBounds(0,0,(int)(screenSize.getWidth()),(int)(screenSize.getHeight())); // 定義視窗的位置和大小 // setLocation(0,0); 定位視窗距離左上角的位置 // setLocationByPlatform(true); 讓視窗系統控制視窗位置,距離上一個視窗很小的偏移量 // 用圖片來替換視窗圖示 Image img = new ImageIcon("D:/icon.png").getImage(); setIconImage(img); } }

輸出結果:一個充滿整個螢幕的框體,標題欄名字叫做Christmas,圖表是自己填充的圖片。

(二)輸出文字

package Swing;

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

/**
 * 
 * @author QuinnNorris
 * 輸出文字
 */
public class HelloWorld {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // 開啟一個執行緒,所有的Swing元件必須由事件分派執行緒進行配置,執行緒將滑鼠點選和按鍵控制轉移到使用者介面元件
        EventQueue.invokeLater(new Runnable() {
            // 匿名內部類,是一個Runnable介面的例項,實現了run方法
            public void run() {

                JFrame frame = new HelloWorldFrame();
                // HelloworldFrame在下面定義,繼承了JFrame,使用其中的構造器方法

                frame.setTitle("HelloWrold");
                // 設定標題

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                // 選擇當用戶關閉框架時進行的操作 ,在有些時候需要將視窗隱藏,不能直接退出需要用到這個方法

                frame.setVisible(true);
                // 將視窗可見化,這樣以便使用者在第一次看見視窗之前我們能夠向其中新增內容
            }
        });

    }

}

// 編寫繼承了JFrame的類,我們的工作在這裡進行
class HelloWorldFrame extends JFrame {
    public HelloWorldFrame() {

        add(new HelloWorldComponent());
        //向其中新增一個例項化的實現JComponent類的子類

        pack();
        //呼叫框架元件的首選大小,或者我們可以用SetSize方法來替換它
    }
}

class HelloWorldComponent 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;

    /**
     * 我們覆蓋了這個以用來書寫內容
     * 
     * @param g
     *            Graphics物件儲存著用於繪製圖像和文字的設定
     */
    public void paintComponent(Graphics g) {
        g.drawString("Hello World!", MESSAGE_X, MESSAGE_Y);
        // 引數:書寫內容,字串中第一個字元位於從左向右75畫素,字串中第一個字元從上向下100畫素
    }

    /**
     * 我們覆蓋了這個方法來表示出這個類的元件的大小
     * 
     * @return 返回這個類的元件本身應該有多大
     */
    public Dimension getPreferredSize() {
        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        // 返回一個Dimension物件,表示這個元件的大小
    }
}

輸出結果:位於左上角的名字叫做HelloWrold的小視窗,在視窗中部有“Hello World!”字樣。

(三)列印圖形

package Swing;

import java.awt.EventQueue;

import javax.swing.*;

import java.awt.*;
import java.awt.geom.*;

/**
 * 
 * @author QuinnNorris
 * 列印圖形
 */
public class DrawTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // 開啟一個執行緒,所有的Swing元件必須由事件分派執行緒進行配置,執行緒將滑鼠點選和按鍵控制轉移到使用者介面元件。
        EventQueue.invokeLater(new Runnable()
        {
            // 匿名內部類,是一個Runnable介面的例項,實現了run方法
            public void run(){

                JFrame frame = new DrawFrame();
                // 建立下面自己定義的SimpleFrame類物件,以便於呼叫構造器方法

                frame.setTitle("DrawTest");
                // 設定標題

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                // 選擇當用戶關閉框架的時候進行的操作 ,在有些時候需要將視窗隱藏,不能直接退出需要用到這個方法

                frame.setVisible(true);
                // 將視窗可見化,這樣以便使用者在第一次看見視窗之前我們能夠向其中新增內容
            }
        });
    }

}


class DrawFrame extends JFrame
{
    public DrawFrame(){

        add(new DrawComponent());
        //向其中新增一個例項化的實現JComponent類的子類

        pack();
        //呼叫框架元件的首選大小,或者我們可以用SetSize方法來替換它
    }
}

class DrawComponent extends JComponent
{
    private static final int DEFAULT_WIDTH = 400;
    private static final int DEFAULT_HEIGHT = 400;

    /**
     * 我們覆蓋了這個以用來列印圖形
     * 
     * @param g
     *            Graphics物件是我們需要用的Graphics2D的父類
     */
    public void paintComponent(Graphics g){

        Graphics2D g2 = (Graphics2D)g;
        //例項化Graphics2D這個類的物件,他是引數Graphics2D的一個子類

        double leftX = 100;
        double topY = 100;
        double width = 200;
        double height = 150;
        //我們設定矩形的四個屬性

        Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height);
        //建立一個Rectangle2D的物件,這個物件繼承了Sharp介面
        //Double是其中的一個靜態內部類,當我們初始化時需要在Double中設定引數

        g2.draw(rect);
        //傳入一個實現Sharp介面的例項,並在畫布上畫出

        Ellipse2D ellipse = new Ellipse2D.Double();
        //建立一個橢圓的例項

        ellipse.setFrame(rect);
        //橢圓和矩形類是兄弟關係,因為他們有著相同的邊界判斷方式
        //這裡我們直接用rect來對橢圓形進行描述(通過橢圓的外接矩形)

        g2.draw(ellipse);
        //傳入一個實現Sharp介面的例項,並在畫布上畫出

        g2.draw(new Line2D.Double(leftX,topY,leftX+width,topY+height));
        //在畫布上畫出一條直線

        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);
        //在畫布上畫出一個圓
    }

    /**
     * 我們覆蓋了這個方法來表示出這個類的元件的大小
     * 
     * @return 返回這個類的元件本身應該有多大
     */
    public Dimension getPreferredSize(){
        return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
        // 返回一個Dimension物件,表示這個元件的大小
    }
}

輸出結果:左上角的視窗中有一個橢圓,外面有一個外界矩形,有一條從矩形左上角到右下角的直線,以這個矩形中心為原點有一個半徑為150畫素的圓。

(四)圖形上色

Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height);
//建立一個Rectangle2D的物件,這個物件繼承了Sharp介面
//Double是其中的一個靜態內部類,當我們初始化時需要在Double中設定引數

g2.setColor(Color.BLUE);
//為g2物件設定一種填充顏色,會影響線條顏色

g2.fill(rect);
//將我們選擇的顏色填充到rect表示的封閉圖形中

g2.draw(rect);
//傳入一個實現Sharp介面的例項,並在畫布上畫出

在上一個程式碼其他部分不改變的情況下,插入這樣兩行程式碼(在1,4行程式碼的原位置中間插入2,3行程式碼)。得到上色效果。

輸出結果:中間為藍色矩形,以矩形中心為原點,150畫素為半徑有個藍色線條的圓形。

(五)特殊字型

package Swing;

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

/**
 * 
 * @author QuinnNorris 特殊字型
 */
public class FontTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // 開啟一個執行緒,所有的Swing元件必須由事件分派執行緒進行配置,執行緒將滑鼠點選和按鍵控制轉移到使用者介面元件。
        EventQueue.invokeLater(new Runnable() {
            // 匿名內部類,是一個Runnable介面的例項,實現了run方法
            public void run() {
                JFrame frame = new FontFrame();
                // 建立下面自己定義的SimpleFrame類物件,以便於呼叫構造器方法

                frame.setTitle("FontTest");
                // 設定標題

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                // 選擇當用戶關閉框架的時候進行的操作 ,在有些時候需要將視窗隱藏,不能直接退出需要用到這個方法

                frame.setVisible(true);
                // 將視窗可見化,這樣以便使用者在第一次看見視窗之前我們能夠向其中新增內容
            }
        });
    }

}

class FontFrame extends JFrame {
    public FontFrame() {
        add(new FontComponent());
        // 向其中新增一個例項化的實現JComponent類的子類

        pack();
        // 呼叫框架元件的首選大小,或者我們可以用SetSize方法來替換它
    }
}

class FontComponent extends JComponent {
    private static final int DEFAULT_WIDTH = 300;
    private static final int DEFAULT_HEIGHT = 200;

    /**
     * 我們覆蓋了這個以用來做一些工作
     * 
     * @param g
     *            Graphics物件是我們需要用的Graphics2D的父類
     */
    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        // 例項化Graphics2D這個類的物件,他是引數Graphics2D的一個子類

        String message = "Hello World!";
        // 寫出我們要操作的文字

        Font f = new Font("Dialog", Font.BOLD, 36);
        // 建立一個字型型別,引數包括字型族,風格型別,大小
        // 也可以通過特殊的方法,呼叫載入得到本地的字型包

        g2.setFont(f);
        // 將f設定在g2之中

        FontRenderContext context = g2.getFontRenderContext();
        // 通過呼叫方法,得到螢幕裝置字型屬性的描述物件

        Rectangle2D bounds = f.getStringBounds(message, context);
        // getStringBounds方法返回一個包圍著字串的矩形

        double x = (DEFAULT_WIDTH - bounds.getWidth()) / 2;
        // bounds.getWidth方法可以獲得字串的寬度

        double y = (DEFAULT_HEIGHT - bounds.getHeight()) / 2;
        // bounds.getHeight方法可以獲得字串的高度

        double ascent = -bounds.getY();
        // 獲得字型的上坡度

        double baseY = y + ascent;
        // 文字的基線位置

        g2.drawString(message, (int) x, (int) y);
        // 設定字串位置

        g2.setPaint(Color.LIGHT_GRAY);
        // 設定線條顏色為亮灰色

        g2.draw(new Line2D.Double(x, baseY, x + bounds.getWidth(), baseY));
        // 在文字的基線上畫下一條橫線

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

        g2.draw(rect);
    }

    /**
     * 我們覆蓋了這個方法來表示出這個類的元件的大小
     * 
     * @return 返回這個類的元件本身應該有多大
     */
    public Dimension getPreferredSize() {
        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        // 返回一個Dimension物件,表示這個元件的大小
    }
}

輸出結果:視窗正中間有文字“Hello World”,外圍被一個灰色矩形包括,在基線的地方有一條橫線分割。

(六)新增圖片

package Swing;

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

/**
 * 
 * @author QuinnNorris 新增圖片
 */
public class ImageTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // 開啟一個執行緒,所有的Swing元件必須由事件分派執行緒進行配置,執行緒將滑鼠點選和按鍵控制轉移到使用者介面元件。
        EventQueue.invokeLater(new Runnable() {
            // 匿名內部類,是一個Runnable介面的例項,實現了run方法
            public void run() {
                JFrame frame = new ImageFrame();
                // 建立下面自己定義的SimpleFrame類物件,以便於呼叫構造器方法

                frame.setTitle("ImageTest");
                // 設定標題

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                // 選擇當用戶關閉框架的時候進行的操作 ,在有些時候需要將視窗隱藏,不能直接退出需要用到這個方法

                frame.setVisible(true);
                // 將視窗可見化,這樣以便使用者在第一次看見視窗之前我們能夠向其中新增內容
            }
        });
    }

}

class ImageFrame extends JFrame {
    public ImageFrame() {
        add(new ImageComponent());
        // 向其中新增一個例項化的實現JComponent類的子類

        pack();
        // 呼叫框架元件的首選大小,或者我們可以用SetSize方法來替換它
    }
}

class ImageComponent extends JComponent {

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

    private Image image;

    /**
     * ImageComponent的建構函式,用來例項化圖片
     */
    public ImageComponent(){
        image = new ImageIcon("D:/image.jpg").getImage();
        //通過路徑得到圖片
    }

    /**
     * 我們覆蓋了這個以用來做一些工作
     * 
     * @param g
     *           
     */
    public void paintComponent(Graphics g) {
        if(image == null ) return;
        //如果圖片不正確,則直接返回避免發生錯誤

        g.drawImage(image, 0,0,null);
        //在畫布上給出圖片
    }

    /**
     * 我們覆蓋了這個方法來表示出這個類的元件的大小
     * 
     * @return 返回這個類的元件本身應該有多大
     */
    public Dimension getPreferredSize() {
        return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        // 返回一個Dimension物件,表示這個元件的大小
    }
}

輸出結果:在畫布以左上角為開始放置你新增的圖片。