java Swing基礎(chǔ)教程之圖形化實(shí)例代碼
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,提供網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,是專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
與多線程、泛型等不同,Swing主要在于使用。
下面主要放代碼和注釋?zhuān)僬f(shuō)話。
(一)基本框架
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 // 開(kāi)啟一個(gè)線程,所有的Swing組件必須由事件分派線程進(jìn)行配置,線程將鼠標(biāo)點(diǎn)擊和按鍵控制轉(zhuǎn)移到用戶接口組件。 EventQueue.invokeLater(new Runnable() { // 匿名內(nèi)部類(lèi),是一個(gè)Runnable接口的實(shí)例,實(shí)現(xiàn)了run方法 public void run() { SimpleFrame frame = new SimpleFrame(); // 創(chuàng)建下面自己定義的SimpleFrame類(lèi)對(duì)象,以便于調(diào)用構(gòu)造器方法 frame.setExtendedState(Frame.MAXIMIZED_BOTH); // 將窗口最大化 // 其他可選屬性:Frame.NORMAL ICONIFIED MAXIMIZED_HORIZ MAXIMIZED_VERT // MAXIMIZED_BOTH frame.setTitle("Christmas"); // 設(shè)置窗口標(biāo)題 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 選擇當(dāng)用戶關(guān)閉框架時(shí)進(jìn)行的操作 ,在有些時(shí)候需要將窗口隱藏,不能直接退出需要用到這個(gè)方法 frame.setVisible(true); // 將窗口可見(jiàn)化,這樣以便用戶在第一次看見(jiàn)窗口之前我們能夠向其中添加內(nèi)容 } }); } // main結(jié)束時(shí),程序并沒(méi)有結(jié)束,而是結(jié)束了主線程,知道所有框架關(guān)閉或者調(diào)用了 System.exit事才終止程序 } class SimpleFrame extends JFrame { public SimpleFrame() { Toolkit kit = Toolkit.getDefaultToolkit(); // 修改窗口在屏幕上面的位置,改變窗口大小 // Toolkit類(lèi)包含很多與本地窗口交互的方法 Dimension screenSize = kit.getScreenSize(); // Toolkit的獲取頻幕大小的方法返回一個(gè)Dimension的類(lèi)對(duì)象 setSize((int) (screenSize.getWidth()), (int) (screenSize.getHeight())); // setBounds(0,0,(int)(screenSize.getWidth()),(int)(screenSize.getHeight())); // 定義窗口的位置和大小 // setLocation(0,0); 定位窗口距離左上角的位置 // setLocationByPlatform(true); 讓窗口系統(tǒng)控制窗口位置,距離上一個(gè)窗口很小的偏移量 // 用圖片來(lái)替換窗口圖標(biāo) Image img = new ImageIcon("D:/icon.png").getImage(); setIconImage(img); } }
輸出結(jié)果:一個(gè)充滿整個(gè)屏幕的框體,標(biāo)題欄名字叫做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 // 開(kāi)啟一個(gè)線程,所有的Swing組件必須由事件分派線程進(jìn)行配置,線程將鼠標(biāo)點(diǎn)擊和按鍵控制轉(zhuǎn)移到用戶接口組件 EventQueue.invokeLater(new Runnable() { // 匿名內(nèi)部類(lèi),是一個(gè)Runnable接口的實(shí)例,實(shí)現(xiàn)了run方法 public void run() { JFrame frame = new HelloWorldFrame(); // HelloworldFrame在下面定義,繼承了JFrame,使用其中的構(gòu)造器方法 frame.setTitle("HelloWrold"); // 設(shè)置標(biāo)題 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 選擇當(dāng)用戶關(guān)閉框架時(shí)進(jìn)行的操作 ,在有些時(shí)候需要將窗口隱藏,不能直接退出需要用到這個(gè)方法 frame.setVisible(true); // 將窗口可見(jiàn)化,這樣以便用戶在第一次看見(jiàn)窗口之前我們能夠向其中添加內(nèi)容 } }); } } // 編寫(xiě)繼承了JFrame的類(lèi),我們的工作在這里進(jìn)行 class HelloWorldFrame extends JFrame { public HelloWorldFrame() { add(new HelloWorldComponent()); //向其中添加一個(gè)實(shí)例化的實(shí)現(xiàn)JComponent類(lèi)的子類(lèi) pack(); //調(diào)用框架組件的首選大小,或者我們可以用SetSize方法來(lái)替換它 } } 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; /** * 我們覆蓋了這個(gè)以用來(lái)書(shū)寫(xiě)內(nèi)容 * * @param g * Graphics對(duì)象保存著用于繪制圖像和文本的設(shè)置 */ public void paintComponent(Graphics g) { g.drawString("Hello World!", MESSAGE_X, MESSAGE_Y); // 參數(shù):書(shū)寫(xiě)內(nèi)容,字符串中第一個(gè)字符位于從左向右75像素,字符串中第一個(gè)字符從上向下100像素 } /** * 我們覆蓋了這個(gè)方法來(lái)表示出這個(gè)類(lèi)的組件的大小 * * @return 返回這個(gè)類(lèi)的組件本身應(yīng)該有多大 */ public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); // 返回一個(gè)Dimension對(duì)象,表示這個(gè)組件的大小 } }
輸出結(jié)果:位于左上角的名字叫做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 // 開(kāi)啟一個(gè)線程,所有的Swing組件必須由事件分派線程進(jìn)行配置,線程將鼠標(biāo)點(diǎn)擊和按鍵控制轉(zhuǎn)移到用戶接口組件。 EventQueue.invokeLater(new Runnable() { // 匿名內(nèi)部類(lèi),是一個(gè)Runnable接口的實(shí)例,實(shí)現(xiàn)了run方法 public void run(){ JFrame frame = new DrawFrame(); // 創(chuàng)建下面自己定義的SimpleFrame類(lèi)對(duì)象,以便于調(diào)用構(gòu)造器方法 frame.setTitle("DrawTest"); // 設(shè)置標(biāo)題 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 選擇當(dāng)用戶關(guān)閉框架的時(shí)候進(jìn)行的操作 ,在有些時(shí)候需要將窗口隱藏,不能直接退出需要用到這個(gè)方法 frame.setVisible(true); // 將窗口可見(jiàn)化,這樣以便用戶在第一次看見(jiàn)窗口之前我們能夠向其中添加內(nèi)容 } }); } } class DrawFrame extends JFrame { public DrawFrame(){ add(new DrawComponent()); //向其中添加一個(gè)實(shí)例化的實(shí)現(xiàn)JComponent類(lèi)的子類(lèi) pack(); //調(diào)用框架組件的首選大小,或者我們可以用SetSize方法來(lái)替換它 } } class DrawComponent extends JComponent { private static final int DEFAULT_WIDTH = 400; private static final int DEFAULT_HEIGHT = 400; /** * 我們覆蓋了這個(gè)以用來(lái)打印圖形 * * @param g * Graphics對(duì)象是我們需要用的Graphics2D的父類(lèi) */ public void paintComponent(Graphics g){ Graphics2D g2 = (Graphics2D)g; //實(shí)例化Graphics2D這個(gè)類(lèi)的對(duì)象,他是參數(shù)Graphics2D的一個(gè)子類(lèi) double leftX = 100; double topY = 100; double width = 200; double height = 150; //我們?cè)O(shè)置矩形的四個(gè)屬性 Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height); //創(chuàng)建一個(gè)Rectangle2D的對(duì)象,這個(gè)對(duì)象繼承了Sharp接口 //Double是其中的一個(gè)靜態(tài)內(nèi)部類(lèi),當(dāng)我們初始化時(shí)需要在Double中設(shè)置參數(shù) g2.draw(rect); //傳入一個(gè)實(shí)現(xiàn)Sharp接口的實(shí)例,并在畫(huà)布上畫(huà)出 Ellipse2D ellipse = new Ellipse2D.Double(); //創(chuàng)建一個(gè)橢圓的實(shí)例 ellipse.setFrame(rect); //橢圓和矩形類(lèi)是兄弟關(guān)系,因?yàn)樗麄冇兄嗤倪吔缗袛喾绞? //這里我們直接用rect來(lái)對(duì)橢圓形進(jìn)行描述(通過(guò)橢圓的外接矩形) g2.draw(ellipse); //傳入一個(gè)實(shí)現(xiàn)Sharp接口的實(shí)例,并在畫(huà)布上畫(huà)出 g2.draw(new Line2D.Double(leftX,topY,leftX+width,topY+height)); //在畫(huà)布上畫(huà)出一條直線 double centerX = rect.getCenterX(); double centerY = rect.getCenterY(); double radius = 150; //定義圓心坐標(biāo)和半徑 Ellipse2D circle = new Ellipse2D.Double(); //創(chuàng)建一個(gè)圓的實(shí)例 circle.setFrameFromCenter(centerX, centerY, centerX+radius, centerY+radius); //設(shè)置坐標(biāo)和半徑 g2.draw(circle); //在畫(huà)布上畫(huà)出一個(gè)圓 } /** * 我們覆蓋了這個(gè)方法來(lái)表示出這個(gè)類(lèi)的組件的大小 * * @return 返回這個(gè)類(lèi)的組件本身應(yīng)該有多大 */ public Dimension getPreferredSize(){ return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT); // 返回一個(gè)Dimension對(duì)象,表示這個(gè)組件的大小 } }
輸出結(jié)果:左上角的窗口中有一個(gè)橢圓,外面有一個(gè)外界矩形,有一條從矩形左上角到右下角的直線,以這個(gè)矩形中心為原點(diǎn)有一個(gè)半徑為150像素的圓。
(四)圖形上色
Rectangle2D rect = new Rectangle2D.Double(leftX,topY,width,height); //創(chuàng)建一個(gè)Rectangle2D的對(duì)象,這個(gè)對(duì)象繼承了Sharp接口 //Double是其中的一個(gè)靜態(tài)內(nèi)部類(lèi),當(dāng)我們初始化時(shí)需要在Double中設(shè)置參數(shù) g2.setColor(Color.BLUE); //為g2對(duì)象設(shè)置一種填充顏色,會(huì)影響線條顏色 g2.fill(rect); //將我們選擇的顏色填充到rect表示的封閉圖形中 g2.draw(rect); //傳入一個(gè)實(shí)現(xiàn)Sharp接口的實(shí)例,并在畫(huà)布上畫(huà)出
在上一個(gè)代碼其他部分不改變的情況下,插入這樣兩行代碼(在1,4行代碼的原位置中間插入2,3行代碼)。得到上色效果。
輸出結(jié)果:中間為藍(lán)色矩形,以矩形中心為原點(diǎn),150像素為半徑有個(gè)藍(lán)色線條的圓形。
(五)特殊字體
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 // 開(kāi)啟一個(gè)線程,所有的Swing組件必須由事件分派線程進(jìn)行配置,線程將鼠標(biāo)點(diǎn)擊和按鍵控制轉(zhuǎn)移到用戶接口組件。 EventQueue.invokeLater(new Runnable() { // 匿名內(nèi)部類(lèi),是一個(gè)Runnable接口的實(shí)例,實(shí)現(xiàn)了run方法 public void run() { JFrame frame = new FontFrame(); // 創(chuàng)建下面自己定義的SimpleFrame類(lèi)對(duì)象,以便于調(diào)用構(gòu)造器方法 frame.setTitle("FontTest"); // 設(shè)置標(biāo)題 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 選擇當(dāng)用戶關(guān)閉框架的時(shí)候進(jìn)行的操作 ,在有些時(shí)候需要將窗口隱藏,不能直接退出需要用到這個(gè)方法 frame.setVisible(true); // 將窗口可見(jiàn)化,這樣以便用戶在第一次看見(jiàn)窗口之前我們能夠向其中添加內(nèi)容 } }); } } class FontFrame extends JFrame { public FontFrame() { add(new FontComponent()); // 向其中添加一個(gè)實(shí)例化的實(shí)現(xiàn)JComponent類(lèi)的子類(lèi) pack(); // 調(diào)用框架組件的首選大小,或者我們可以用SetSize方法來(lái)替換它 } } class FontComponent extends JComponent { private static final int DEFAULT_WIDTH = 300; private static final int DEFAULT_HEIGHT = 200; /** * 我們覆蓋了這個(gè)以用來(lái)做一些工作 * * @param g * Graphics對(duì)象是我們需要用的Graphics2D的父類(lèi) */ public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; // 實(shí)例化Graphics2D這個(gè)類(lèi)的對(duì)象,他是參數(shù)Graphics2D的一個(gè)子類(lèi) String message = "Hello World!"; // 寫(xiě)出我們要操作的文字 Font f = new Font("Dialog", Font.BOLD, 36); // 創(chuàng)建一個(gè)字體類(lèi)型,參數(shù)包括字體族,風(fēng)格類(lèi)型,大小 // 也可以通過(guò)特殊的方法,調(diào)用加載得到本地的字體包 g2.setFont(f); // 將f設(shè)置在g2之中 FontRenderContext context = g2.getFontRenderContext(); // 通過(guò)調(diào)用方法,得到屏幕設(shè)備字體屬性的描述對(duì)象 Rectangle2D bounds = f.getStringBounds(message, context); // getStringBounds方法返回一個(gè)包圍著字符串的矩形 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); // 設(shè)置字符串位置 g2.setPaint(Color.LIGHT_GRAY); // 設(shè)置線條顏色為亮灰色 g2.draw(new Line2D.Double(x, baseY, x + bounds.getWidth(), baseY)); // 在文字的基線上畫(huà)下一條橫線 Rectangle2D rect = new Rectangle2D.Double(x, y, bounds.getWidth(), bounds.getHeight()); g2.draw(rect); } /** * 我們覆蓋了這個(gè)方法來(lái)表示出這個(gè)類(lèi)的組件的大小 * * @return 返回這個(gè)類(lèi)的組件本身應(yīng)該有多大 */ public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); // 返回一個(gè)Dimension對(duì)象,表示這個(gè)組件的大小 } }
輸出結(jié)果:窗口正中間有文字“Hello World”,外圍被一個(gè)灰色矩形包括,在基線的地方有一條橫線分割。
(六)添加圖片
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 // 開(kāi)啟一個(gè)線程,所有的Swing組件必須由事件分派線程進(jìn)行配置,線程將鼠標(biāo)點(diǎn)擊和按鍵控制轉(zhuǎn)移到用戶接口組件。 EventQueue.invokeLater(new Runnable() { // 匿名內(nèi)部類(lèi),是一個(gè)Runnable接口的實(shí)例,實(shí)現(xiàn)了run方法 public void run() { JFrame frame = new ImageFrame(); // 創(chuàng)建下面自己定義的SimpleFrame類(lèi)對(duì)象,以便于調(diào)用構(gòu)造器方法 frame.setTitle("ImageTest"); // 設(shè)置標(biāo)題 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 選擇當(dāng)用戶關(guān)閉框架的時(shí)候進(jìn)行的操作 ,在有些時(shí)候需要將窗口隱藏,不能直接退出需要用到這個(gè)方法 frame.setVisible(true); // 將窗口可見(jiàn)化,這樣以便用戶在第一次看見(jiàn)窗口之前我們能夠向其中添加內(nèi)容 } }); } } class ImageFrame extends JFrame { public ImageFrame() { add(new ImageComponent()); // 向其中添加一個(gè)實(shí)例化的實(shí)現(xiàn)JComponent類(lèi)的子類(lèi) pack(); // 調(diào)用框架組件的首選大小,或者我們可以用SetSize方法來(lái)替換它 } } class ImageComponent extends JComponent { private static final int DEFAULT_WIDTH = 300; private static final int DEFAULT_HEIGHT = 200; private Image image; /** * ImageComponent的構(gòu)造函數(shù),用來(lái)實(shí)例化圖片 */ public ImageComponent(){ image = new ImageIcon("D:/image.jpg").getImage(); //通過(guò)路徑得到圖片 } /** * 我們覆蓋了這個(gè)以用來(lái)做一些工作 * * @param g * */ public void paintComponent(Graphics g) { if(image == null ) return; //如果圖片不正確,則直接返回避免發(fā)生錯(cuò)誤 g.drawImage(image, 0,0,null); //在畫(huà)布上給出圖片 } /** * 我們覆蓋了這個(gè)方法來(lái)表示出這個(gè)類(lèi)的組件的大小 * * @return 返回這個(gè)類(lèi)的組件本身應(yīng)該有多大 */ public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); // 返回一個(gè)Dimension對(duì)象,表示這個(gè)組件的大小 } }
輸出結(jié)果:在畫(huà)布以左上角為開(kāi)始放置你添加的圖片。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
網(wǎng)站名稱:java Swing基礎(chǔ)教程之圖形化實(shí)例代碼
分享鏈接:http://jinyejixie.com/article40/ppiceo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、微信小程序、企業(yè)建站、虛擬主機(jī)、網(wǎng)站改版、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
全網(wǎng)營(yíng)銷(xiāo)推廣知識(shí)