您好,登錄后才能下訂單哦!
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對象,表示這個組件的大小 } }
輸出結果:在畫布以左上角為開始放置你添加的圖片。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。