Java畫板實驗報告_第1頁
Java畫板實驗報告_第2頁
Java畫板實驗報告_第3頁
Java畫板實驗報告_第4頁
Java畫板實驗報告_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

二、Java畫板的設(shè)計一、實驗名稱及其要求A、實驗名稱:Java畫板的設(shè)計B、實驗要求:.實驗目的:圖形界面設(shè)計。熟悉java.awt包中的組件,掌握圖形界面設(shè)計方法,理解委托事件處理模型。.實驗要求:(1)設(shè)計圖形界面添加菜單:窗口上添加各種組件及菜單,并處理組件及菜單的事件監(jiān)聽程序。(2)實現(xiàn)畫板的基本功能。二、程序設(shè)計本程序完成的是一個類似于Windows畫圖板的繪圖程序。由于不是開發(fā)和設(shè)計專業(yè)的繪圖和圖像制作軟件,所以,完成的程序的簡單功能包括以下幾項:.新建一個空白圖形文件:用于繪制新的圖形。.打開或保存一個圖形文件,便于對圖形文件的管理。.繪制一些基本的畫圖組件:直線、矩形、實心矩形、橢圓、實心橢圓、圓、實心圓、圓角矩形、實心圓角矩形等。.可以用鼠標在繪圖面板上單擊拖動進行隨筆畫。.橡皮擦:可以將已繪制好的圖形擦掉。.添加文字:可以在繪圖區(qū)域內(nèi)添加文字。.選擇文字的字體:通過一個下拉式的選擇條,可以選中所需要的字體。本程序中包括:宋體、隸書、華文彩云、仿宋_GB2312華文行楷、方正舒體、TimesNewRomanSerif、MonospacedSonsSerif、Garamond當然,在下面的的程序分析中可以看到,由于我們靈活設(shè)置了字體數(shù)組,是的可以隨意添加系統(tǒng)支持的任何字體。大大方便和簡化了程序設(shè)計。.選擇文字的字體風格:通過兩個復選框按鈕,可以選擇需要的字體風格,包括:粗體、斜體,使用者有三種選擇方式,包括:①同時選中兩者、②只選擇其中一種、③兩者都不選中。.設(shè)置畫筆的顏色:可以選擇當前繪制圖形的畫筆顏色,讓圖形更加豐富多彩、生動活潑。.設(shè)置畫筆的粗細:該選項在作用于基本圖形組件和文字時,它的效果是不一樣的。①當作用于繪制圖形組件時,它的作用是改變畫筆繪制線條的粗細;②當作用于文字時,它的作用是改變文字的大小。由此可以看到,雖然我們的畫圖板程序不及那些專業(yè)的繪圖程序,但是,“麻雀雖小,五臟俱全”,它已經(jīng)具備了一個繪圖軟件所應該有的基本功能和操作。通過對本程序的分析,我們可以更加系統(tǒng)地學習和了解如何從整體上設(shè)計和實現(xiàn)一個程序。(一):程序基本組成框架和結(jié)構(gòu).一組基本圖形按鈕,包括:pencil(隨筆畫)、line(直線)、rect(矩形)、frect(實心矩形)、oval(橢圓)、foval(實心橢圓)、circle(圓)、fcircle(實心圓)、roundrect(圓角矩形)、frrect(實心圓角矩形)、rubber(橡皮擦)、word(文字)。這些基本圖形都繼承于同一個父類:drawings。drawings具有變量(屬性)intx1,x2,y1,y2;//用來存放相應圖形元素的坐標intR,G,B;//用來存放圖形色彩顏色信息floatstroke;//用來存放畫筆粗細inttype;//用來保存圖形類型Strings1;//用來保存輸入文字字符串Strings2;//用來保存字體類型字符串同時,drawing還具有方法:voiddraw(Graphics2Dg2d)。;draw()方法中用到了Java繪圖里面的Graphics2D類,所有28承drawings類的圖形子類都重寫了此方法。這就是Java程序中類的繼承的概念。它對于程序代碼的重用是很重要的,將極大的方便和簡略程序代碼。.止匕外,程序中還包括一下三個基本操作按鈕:新建(New:新建一個圖形文件。打開(Ope。:打開一個圖形文件。保存(Save):保存當前圖形文件。.選擇顏色和設(shè)置當前畫筆粗細的按鈕分別為:顏色(Color)、線條粗細(Stroke)<.選擇當前字體風格的選擇框為:粗體(BOLD、斜體(ITALIC),用以設(shè)置當前字體的風格。.選擇當前字體的下拉式復選框為:Styles。.菜單條及其組成:文件(File)菜單項,包括:New(新建一個圖形文件)、Load(打開一個圖形文件)、Save(保存當前圖形文件)、Exit(退出程序)。顏色(Color)菜單項:用來設(shè)置當前顏色。線條粗細(Stroke)菜單項:用來設(shè)置當前畫筆粗細。幫助(Help)菜單項:有關(guān)的程序幫助提示。完成的程序界面效果如下圖:):畫圖板相關(guān)操作.新建一個圖形文件選才?File-New菜單,則清除當前所繪制的圖像,回到初始畫面。.打開已有的文件選才?File-Load菜單,則清除當前所繪制的圖像,并彈出打開文件對話框要求選擇要打開的文件。如下圖:3.保存選才¥File-Save菜單,則彈出要求保存文件對話框4.繪制基本圖形基本圖形包括以下幾種:pencilline:rect::隨筆畫,圖標為pencilline:rect::隨筆畫,圖標為:直線,圖標為:矩形,圖標為:口frect:實心矩形,圖標為:oval:橢圓,圖標為:fovalcirclefcircle實心橢圓,圖標為fovalcirclefcircle實心橢圓,圖標為:圓,圖標為::實心圓,圖標為:roundrect:圓角矩形,圖標為:frrect:實心圓角矩形,圖標為:*Rrubber:橡皮擦,圖標為:0繪圖時,單擊工具欄上相應圖形的圖標,然后用鼠標拖動,在繪圖區(qū)域內(nèi)進行繪圖即可。5.設(shè)置畫筆大小單擊工具欄上的圖標,或單擊Stroke-SetStroke菜單,則彈出相應的設(shè)置當前畫筆粗細對話框。如下圖:6.選擇顏色6.選擇顏色單擊工具欄區(qū)域W,單擊工具欄區(qū)域W,或單擊ColorfChooseColor菜單,則彈出相應的選擇當前畫圖顏色對話框。如下圖::樣本si網(wǎng)卸曬工鎮(zhèn)的⑥}?k子貢比n~rn-n?.rrn-n-n?n-mTi■--JdJJJB-m—1-rn?m-n-rn?rrrn-n子貢比n~rn-n?.rrn-n-n?n-mTi■--JdJJJB-m—1-rn?m-n-rn?rrrn-n」?□duds確至示例文本示例文本取消重置示)示例文本示例文本.選擇字體風格粗體口斜儀在工具欄區(qū)域可以選擇相應的字體風格,有粗體、斜體和粗斜體三種可供選擇。在工具欄區(qū)域.選擇字體在工具欄區(qū)域,可以選擇字體,本程序中有如下幾種字體可供選擇:宋體、隸書、華文彩云、仿宋_GB2312、華文行楷、方正舒體、TimeNewRoman、Serif、Monospaced、SonsSerif、Garamond。三:系統(tǒng)功能設(shè)計分析畫板主要由以下幾個部分組成:主窗體的設(shè)計。主類(DrawPa。用來生成主界面,完成畫圖板的主要框架。主類由JFrame派生出來。主界面由菜單欄、工具欄和畫圖區(qū)域三部分組成,布局格式采用BorderLayout布局形式。菜單欄和工具欄的設(shè)計。菜單欄包括文件菜單欄、顏色菜單欄、線條粗細菜單欄和提示菜單欄。其中①文件菜單欄包括文件的新建、打開、保存等選項;②顏色菜單欄可以進行顏色選擇;③線條粗細菜單欄設(shè)置線條的粗細;④提示菜單欄給出提示信息。工具欄由新建、打開和保存文件按鈕、基本圖形的按鈕、選擇字體風格復選框和字體下拉列表框組成。在主類中添加并對菜單欄和工具欄添加事件監(jiān)聽。事件響應的處理。對菜單欄、工具欄和用鼠標畫圖的事件響應進行處理。菜單欄中文件的新建、打開和保存菜單事件的處理:Java把每個文件都視作順序字節(jié)流。如果要在Java中進行文件處理,則必須用到Java.io包。這個包定義了一些流類,選用FileInputStream(從文件中讀入數(shù)據(jù))和FIleOutputStream(向文件輸出數(shù)據(jù)),通過建立這些文件的對象便可以打開文件。這些流相應地從InputStream和OutputStream派生,這些文件均使用文件流,所以必須將文件結(jié)構(gòu)化以適應程序的要求。我們需要對保存的對象序列化,然后以輸出流的方式保存。在程序中用newFile()、loadFile()和saveFile()三個函數(shù)分別實現(xiàn)文件的新建、打開和保存。工具欄事件的處理:主要有一些Button組成。我們用ButtonHandler內(nèi)部類處理基本單元事件,ButtonHandleU內(nèi)部類處理新建、打開和保存文件按鈕,在畫圖類DrawPanel中定義CreateNewItem()函數(shù)處理工具欄中的畫圖事件。鼠標畫圖:由于畫圖板主要是用來畫圖,所以需要在程序中添加對鼠標按下、拖動、進入、退出、移動和單機事件進行監(jiān)聽并進行處理。內(nèi)部類mouseAS義了完成鼠標按下、松開、進入、退出事件響應。內(nèi)部類mouse睨成鼠標拖動和移動事件響應。畫圖的基本功能。在程序設(shè)計中用到了動態(tài)綁定,我們可以提取他們的公共屬性,先建立一個父類,然后建立各個子類,繼承父類中的方法并將父類中的draw函數(shù)重寫。一些關(guān)于圖形形狀的類,最主要是用于畫圖、字體和橡皮擦等基本類型。如Circle、Triangle、Rectangle,它們都是有超類(Object類)派生的。在面向?qū)ο缶幊讨校總€類都有畫出自己的能力,每個類都有自己的draw函數(shù),但每種形狀的draw函數(shù)都不一樣,但在繪制任何形狀時,只需簡單調(diào)用父類drawing的draw方法,然后讓程序動態(tài)地根據(jù)對象的類型決定使用哪個子類的draw方法。為了使畫出的圖形更加美觀,我們在draw函數(shù)中使用了Graphics2D的對象的引用。這樣可以在不改變原程序的情況下,添加擴展的圖形,是程序變得更加強大。同時,為了文件的保存,父類實現(xiàn)Serialize接口,將對象線性化。四:程序結(jié)構(gòu)說明本程序主體為一個文件:QingDrawPad.java。其中包括的程序段有:①DrawPad():構(gòu)造函數(shù),用以初始化。②chooseC010r():選擇當前繪圖顏色程序段。③setStroke():設(shè)置當前畫筆粗細程序段。④loadFile():調(diào)用圖形文件程序段。⑤newFile():新建一個圖形文件程序段。⑥saveFile():保存當前所繪制圖形程序段。⑦creatNewItem():新建一個基本圖形單元程序段。相應的內(nèi)部類有:①ButtonHandler:用來處理基本圖形單元的按鈕事件。②ButtonHandleU:用來處理NewOpenSave三個操作按鈕的按鈕事件。③DrawPanel:用來創(chuàng)建繪圖區(qū)域的子類。④MouseA繼承了MouseAdapter,用來完成鼠標相應事件的操作,如單擊、松開、進入和離開等。⑤MouseB繼承了MouseMotionAdapter,用來完成鼠標拖動和鼠標移動的相應事件操作。此外,還繼承了父類drawings的基本圖形子類,如前所述,這里不再重復。五:程序繪圖效果示意圖我們可以看到,整個程序界面很簡潔,而且界面操作、提示內(nèi)容全部是中文,一目了然。在左上方的菜單欄里有文件、顏色、線條粗細、幫助4個下拉式菜單,可以對繪圖文件進行相應的操作。下面一排是工具欄的工具按鈕,從左到右依次為:新建文件、打開文件、保存文件、隨筆畫、直線、空心矩形、實心矩形、空心橢圓、空心圓、實心圓、空心圓角矩形、實心圓角矩形、橡皮擦、顏色選擇按鈕、線條粗細設(shè)置按鈕、文字添加按鈕、粗體字體選擇框、斜體字體選擇框、字體選擇下拉式選擇框。整個工具欄是可以拖動的,可以將它拖動到程序窗口的任意位置。工具欄下面的整個白色區(qū)域就是繪圖區(qū)域,即繪圖面板,它的大小可以隨著窗口的大小自動調(diào)整。在窗口的最底部是程序設(shè)計作者標注,以及鼠標狀態(tài)提示條,可以顯示當前的鼠標狀態(tài),包括進出窗口、移動、單擊、松開等。具體效果如下列圖所示:importjava.awt.*;importjava.awt.geom.*;importjava.awt.event.*;importjavax.swing.*;importjava.io.*;importjava.util.*;publicclassDrawPadextendsJFrame//主類,擴展了JFrame類,用來生成主界面{privateObjectInputStreaminput;privateObjectOutputStreamoutput;//定義輸入輸出流,用來調(diào)用和保存圖像文件privateJButtonchoices口;〃按鈕數(shù)組,存放以下名稱的功能按鈕privateStringnames口={"New","Open","Save",//這三個是基本操作按鈕,包括"新建"、"打開"、"保存"/*下面是我們的畫圖板上面有的基本的幾個繪圖單元按鈕*/"pen","line","rect","frect","oval","foval","circle","fcircle","roundrect","frect","rubber","color","stroke","word"};privateStringstyleNames口={"宋體","隸書","華文彩云","仿宋_GB2312","華文行楷","方正舒體","TimesNewRoman","Serif","Monospaced","SonsSerif","Garamond"};privateIconitems口;privateStringtipText口={//這里是鼠標移動到相應按鈕上面上停留時給出的提示說明條”新建一個文件",”打開一個文件","保存當前文件","繪制線條","繪制直線","繪制空心矩形","繪制實心矩形",”繪制空心橢圓","繪制實心橢圓","繪制空心圓形","繪制實心圓形","繪制空心圓角矩形","繪制實心圓角矩形","橡皮擦","選擇顏色","設(shè)置線條粗細","輸入文字”};JToolBarbuttonPanel;〃定義按鈕面板privateJLabelstatusBar;//顯示鼠標狀態(tài)的提示條privateDrawPaneldrawingArea;//畫圖區(qū)域privateintwidth=850,height=550;drawings口itemList=newdrawings[5000];//用來存放基本圖形的數(shù)組privateintcurrentChoice=3;〃設(shè)置默認畫圖狀態(tài)為隨筆畫intindex=0;//當前已經(jīng)繪制的圖形數(shù)目privateColorcolor=Color.black;〃當前畫筆顏色intR,G,B;//用來存放當前色彩值intf1,f2;//用來存放當前字體風格Stringstyle1;〃用來存放當前字體privatefloatstroke=1.0f;//設(shè)置畫筆粗細,默認值為1.0fJCheckBoxbold,italic;//bold為粗體,italic為斜體,二者可以同時使用JComboBoxstyles;publicDrawPad(){super("繪圖畫板(中國風)");JMenuBarbar=newJMenuBar();//定義菜單條JMenufileMenu=newJMenu("文件");//新建文件菜單條JMenuItemnewItem=newJMenuItem("新建");newItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){newFile();〃如果被觸發(fā),則調(diào)用新建文件函數(shù)段});fileMenu.add(newItem);//保存文件菜單項JMenuItemsaveitem=newJMenuItem("保存");saveItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){saveFile();〃如果被觸發(fā),則調(diào)用保存文件函數(shù)段}});fileMenu.add(saveitem);//打開文件菜單項JMenuItemloaditem=newJMenuItem("打開");loadItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){loadFile();〃如果被觸發(fā),則調(diào)用打開文件函數(shù)段}});fileMenu.add(loaditem);fileMenu.addSeparator();//退出菜單項JMenuItemexititem=newJMenuItem("退出");exitItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){System.exit(O);〃如果被觸發(fā),則退出畫圖板程序}});fileMenu.add(exititem);bar.add(fileMenu);//設(shè)置顏色菜單條JMenucolorMenu=newJMenu("顏色");//選擇顏色菜單項JMenuItemcoloritem=newJMenuItem("選擇顏色");colorItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){chooseColor();〃如果被觸發(fā),則調(diào)用選擇顏色函數(shù)段}});colorMenu.add(coloritem);bar.add(colorMenu);//設(shè)置線條粗細菜單條JMenustrokeMenu=newJMenu("線條粗細");//設(shè)置線條粗細菜單項JMenuItemstrokeitem=newJMenuItem("設(shè)置線條粗細”);strokeItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){setStroke();}});strokeMenu.add(strokeltem);bar.add(strokeMenu);//設(shè)置提示菜單條JMenuhelpMenu=newJMenu("幫助");//設(shè)置提示菜單項JMenuItemaboutItem=newJMenuItem("關(guān)于畫板");aboutItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){JOptionPane.showMessageDialog(null,"此軟件僅用于測試","畫圖板說明",JOptionPane.INFORMATION_MESSAGE);}});helpMenu.add(aboutltem);bar.add(helpMenu);items=newImageIcon[names.length];//創(chuàng)建各種基本圖形的按鈕drawingArea=newDrawPanel();choices=newJButton[names.length];buttonPanel=newJToolBar(JToolBar.VERTICAL);buttonPanel=newJToolBar(JToolBar.HORIZONTAL);ButtonHandlerhandler=newButtonHandler();ButtonHandlerlhandleri=newButtonHandler1();//導入我們需要的圖形圖標,這些圖標都存放在與源文件相同的目錄下面for(inti=3;i<choices.length;i++){items[i]=newImageIcon("F:\\eclipse\\eclipse\\workspace\\Test\\src\\icon\\"+names[i]+".jpg");choices[i]=newJButton(items[i]);choices[i].setToolTipText(tipText[i]);buttonPanel.add(choices[i]);}//將動作偵聽器加入按鈕里面for(inti=3;i<choices.length-3;i++){choices[i].addActionListener(handler);}/*choices[0].addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){newFile();}});choices[1].addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){loadFile();}});choices[2].addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){saveFile();}});*/choices[choices.length-3].addActionListener(handler1);choices[choices.length-2].addActionListener(handler1);choices[choices.length-1].addActionListener(handler1);//字體風格選擇styles=newJComboBox(styleNames);styles.setMaximumRowCount(8);styles.addItemListener(newItemListener(){publicvoiditemStateChanged(ItemEvente){style1=styleNames[styles.getSelectedIndex()];}});//字體選擇bold=newJCheckBox("粗體");italic=newJCheckBox("斜體");checkBoxHandlercHandler=newcheckBoxHandler();bold.addltemListener(cHandler);italic.addltemListener(cHandler);JPanelwordPanel=newJPanel();buttonPanel.add(bold);buttonPanel.add(italic);buttonPanel.add(styles);styles.setMinimumSize(newDimension(50,20));styles.setMaximumSize(newDimension。。。,20));Containerc=getContentPane();super.setJMenuBar(bar);c.add(buttonPanel,BorderLayout.NORTH);c.add(drawingArea,BorderLayout.CENTER);statusBar=newJLabel();c.add(statusBar,BorderLayout.SOUTH);statusBar.setText("");createNewItem();setSize(width,height);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setVisible(true);}//按鈕偵聽器ButtonHanler類,內(nèi)部類,用來偵聽基本按鈕的操作publicclassButtonHandlerimplementsActionListener{publicvoidactionPerformed(ActionEvente){for(intj=3;j<choices.length-3;j++){if(e.getSource()==choices[j]){currentchoice=j;createNewItem();repaint();}}}}//按鈕偵聽器ButtonHanlerl類,用來偵聽顏色選擇、畫筆粗細設(shè)置、文字輸入按鈕的操作publicclassButtonHandlerlimplementsActionListener{publicvoidactionPerformed(ActionEvente){if(e.getSource()==choices[choices.length-3]){chooseColor();}if(e.getSource()==choices[choices.length-2]){setStroke();}if(e.getSource()==choices[choices.length-1]){JOptionPane.showMessageDialog(null,"請點擊繪圖板選擇輸入文本的位置","提示",JOptionPane.INFORMATION_MESSAGE);currentchoice=14;createNewItem();repaint();}//鼠標事件mouseA類,繼承了MouseAdapter,用來完成鼠標相應事件操作classmouseAextendsMouseAdapter{publicvoidmousePressed(MouseEvente){statusBar.setText("作者:吳斌偉一廈門理工學院數(shù)理系09級信計1班一鼠標按下位置:["+e.getX()+","+e.getY()+"]");//設(shè)置狀態(tài)提示itemList[index].x1=itemList[index].x2=e.getX();itemList[index].y1=itemList[index].y2=e.getY();//如果當前選擇的圖形是隨筆畫或者橡皮擦,則進行下面的操作if(currentChoice==3||currentChoice==13){itemList[index].x1=itemList[index].x2=e.getX();itemList[index].y1=itemList[index].y2=e.getY();index++;createNewItem();}//如果當前選擇的圖形式文字輸入,則進行下面操作if(currentChoice==14){itemList[index].x1=e.getX();itemList[index].y1=e.getY();Stringinput;input=JOptionPane.showInputDialog("請輸入你想要輸入的文本");itemList[index].s1=input;itemList[index].x2=f1;itemList[index].y2=f2;itemList[index].s2=style1;index++;currentchoice=14;createNewItem();drawingArea.repaint();}}publicvoidmouseReleased(MouseEvente){statusBar.setText("鼠標的位置:"+e.getX()+","+e.getY()+"]");if(currentChoice==3||currentChoice==13){itemList[index].x1=e.getX();itemList[index].y1=e.getY();}itemList[index].x2=e.getX();itemList[index].y2=e.getY();repaint();index++;createNewItem();}publicvoidmouseEntered(MouseEvente){statusBar.setText("鼠標的位置:["+e.getX()+","+e.getY()+"]");}publicvoidmouseExited(MouseEvente){statusBar.setText("鼠標的位置:["+e.getX()+","+e.getY()+"]");}}//鼠標事件mouseB類繼承了MouseMotionAdapter,用來完成鼠標拖動和鼠標移動時的相應操作classmouseBextendsMouseMotionAdapter{publicvoidmouseDragged(MouseEvente){statusBar.setText("鼠標的位置:["+e.getX()+","+e.getY()+"]");if(currentChoice==3||currentChoice==13){itemList[index-1].x1=itemList[index].x2=itemList[index].x1=e.getX();itemList[index-1].y1=itemList[index].y2=itemList[index].y1=e.getY();index++;createNewItem();}else{itemList[index].x2=e.getX();itemList[index].y2=e.getY();}repaint();}publicvoidmouseMoved(MouseEvente){statusBar.setText("鼠標的位置:["+e.getX()+","+e.getY()+"]");}}//選擇字體風格時候用到的事件偵聽器類,加入到字體風格的選擇框中privateclasscheckBoxHandlerimplementsItemListener{publicvoiditemStateChanged(ItemEvente){if(e.getSource()==bold)if(e.getStateChange()==ItemEvent.SELECTED)f1=Font.BOLD;elsef1=Font.PLAIN;if(e.getSource()==italic)if(e.getStateChange()==ItemEvent.SELECTED)f2=Font.ITALIC;elsef2=Font.PLAIN;}}//畫圖面板類,用來畫圖classDrawPanelextendsJPanel{publicDrawPanel(){setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));setBackground(Color.white);//鼠標監(jiān)聽事件addMouseListener(newmouseA());//鼠標移動監(jiān)聽事件addMouseMotionListener(newmouseB());}publicvoidpaintComponent(Graphicsg){super.paintComponent(g);Graphics2Dg2d=(Graphics2D)g;//定義畫筆intj=0;while(j<=index){draw(g2d,itemListlj]);j++;}}voiddraw(Graphics2Dg2d,drawingsi){.draw(g2d);//將畫筆傳入到各個子類中,用來完成各自的繪圖}}//新建一個畫圖基本單元對象的程序段voidcreateNewItem(){switch(currentChoice){itemList[index]=newPencil。;break;itemList[index]=newLine();break;itemList[index]=newRect();break;itemList[index]=newfillRect();break;itemList[index]=newOval();break;itemList[index]=newfillOval();break;itemList[index]=newCircle。;break;itemList[index]=newfillCircle();break;itemList[index]=newRoundRect();break;itemList[index]=newfillRoundRect();break;itemList[index]=newRubber。;break;itemList[index]=newWord();break;}itemList[index].type=currentChoice;itemList[index].R=R;itemList[index].G=G;itemList[index].B=B;itemList[index].stroke=stroke;}//選擇當前顏色程序段publicvoidchooseColor(){color=JColorChooser.showDialog(DrawPad.this,”請選擇一種顏色",color);R=color.getRed();G=color.getGreen();B=color.getBlue();itemList[index].R=R;itemList[index].G=G;itemList[index].B=B;}//選擇當前線條粗細程序段publicvoidsetStroke(){Stringinput;input=JOptionPane.showInputDialog("請輸入一個浮點型線條粗細值(>0)");stroke=Float.parseFloat(input);itemList[index].stroke=stroke;}//保存圖形文件程序段publicvoidsaveFile(){JFileChooserfileChooser=newJFileChooser();fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);intresult=fileChooser.showSaveDialog(this);if(result==JFileChooser.CANCEL_OPTION)return;FilefileName=fileChooser.getSelectedFile();fileName.canWrite();if(fileName==null||fileName.getName().equals(""))JOptionPane.showMessageDialog(fileChooser,"文件名無效","文件名無效JOptionPane.ERROR_MESSAGE);else{try{fileName.delete();FileOutputStreamfos=newFileOutputStream(fileName);output=newObjectOutputStream(fos);drawingsrecord;output.writelnt(index);for(inti=0;i<index;i++){drawingsp=itemList[i];output.writeObject(p);output.flush();//將所有圖形信息強制轉(zhuǎn)換成父類線性化存儲到文件中}output.close();fos.close();}catch(lOExceptionioe){ioe.printStackTrace();}}}//打開一個圖形文件程序段,loadFile函數(shù)通過建立FileInputStream對象讀入文件publicvoidloadFile(){JFileChooserfileChooser=newJFileChooser();fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);intresult=fileChooser.showOpenDialog(this);if(result==JFileChooser.CANCEL_OPTION)return;FilefileName=fileChooser.getSelectedFile();fileName.canRead();if(fileName==null||fileName.getName().equals(""))JOptionPane.showMessageDialog(fileChooser,"文件名無效",”文件名無效",JOptionPane.ERROR_MESSAGE);else{try{FileInputStreamfis=newFileInputStream(fileName);input=newObjectInputStream(fis);drawingsinputRecord;intcountNumber=0;countNumber=input.readInt();for(index=0;index<countNumber;index++){inputRecord=(drawings)input.readObject();itemList[index]=inputRecord;}createNewItem();input.close();repaint();}catch(EOFExceptionendofFileException){JOptionPane.showMessageDialog(this,"文件里沒有更多的記錄","無法找到類",JOptionPane.ERROR_MESSAGE);}catch(ClassNotFoundExceptionclassNotFoundException){JOptionPane.showMessageDialog(this,"不能創(chuàng)建對象","文件結(jié)束",JOptionPane.ERROR_MESSAGE);}catch(IOExceptionioException){JOptionPane.showMessageDialog(this,"從文件讀取資料出錯","讀出錯誤",JOptionPane.ERROR_MESSAGE);}}}//新建一個文件程序段publicvoidnewFile(){index=0;currentChoice=3;color=Color.black;stroke=1.0f;createNewItem();repaint();〃將有關(guān)值設(shè)置為初始狀態(tài),并且重畫}//主函數(shù)段publicstaticvoidmain(Stringargs[]){try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch(Exceptione){}//將界面設(shè)置為當前windows風格DrawPadnewPad=newDrawPad();newPad.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});}}//定義畫圖的基本圖形單元classdrawingsimplementsSerializable//父類,基本圖形單元,用到串行化接口,保存時所用{intx1,y1,x2,y2;//定義坐標屬性intR,G,B;〃定義色彩屬性floatstroke;//定義線條粗細屬性inttype;//定義字體屬性Strings1;Strings2;//定義字體風格屬性voiddraw(Graphics2Dg2d){};//定義繪圖函數(shù)}/**************************************************下面是各種基本圖形單元的子類,都繼承自父類drawings,請仔細理解繼承的概念**************************************************/classLineextendsdrawings//直線類{voiddraw(Graphics2Dg2d){g2d.setPaint(newColor(R,G,B));g2d.setStroke(newBasicStroke(stroke,BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL));g2d.drawLine(x1,y1,x2,y2);}}classRectextendsdrawings//矩形類{voiddraw(Graphics2Dg2d){g2d.setPaint(newColor(R,G,B));g2d.setStroke(newBasicStroke(stroke));g2d.drawRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));}}classfillRectextendsdrawings//實心矩形類{voiddraw(Graphics2Dg2d){g2d.setPaint(newColor(R,G,B));g2d.setStroke(newBasicStroke(stroke));g2d.fillRect(Math.min(x1,x2),Math.min(y1,y2),Math.abs(x1-x2),Math.abs(y1-y2));}}classOvalextendsdrawings//橢圓類{voiddraw

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論