Programavimas

Nurodykite savo pasirinkimo grafiko komponentų kelią

Mūsų pasirinktiniams diagramos komponentams reikia piešti rankiniu būdu, todėl turėsime perklijuoti Drobė, kuris yra standartinis komponentas, numatytas tiesioginiam grafikos manipuliavimui. Metodas, kurį naudosime, bus nepaisyti dažyti metodas Drobė su mums reikalingu pasirinktiniu piešiniu. Mes naudosime Grafika objektas, kuris automatiškai perduodamas į dažyti visų komponentų metodas, prieiga prie spalvų ir piešimo metodų.

Sukursime du pasirinktinius diagramų komponentus: juostinę diagramą ir linijinę diagramą. Pirmiausia sukursime bendrą schemų klasę dviem grafikams, kurie dalijasi kai kuriais pagrindiniais elementais.

Sukurti bendrą grafiko sistemą

Linijinė diagrama ir juostinė diagrama, kurią sukursime, yra pakankamai panašios, kad galėtume sukurti bendrą

Grafikas

klasę atlikti nuobodų maketavimo darbą. Tai atlikę, mes galime išplėsti klasę tam tikros rūšies grafikui, kurio mums reikia.

Pirmas dalykas, kurį reikia padaryti kuriant pasirinktinius grafikos komponentus, yra įdėti rašiklį į popierių ir nupiešti tai, ko jums reikia. Kadangi skaičiuojame pikselius, lengva susimaišyti dėl elementų išdėstymo. Pagalvoję apie elementų pavadinimą ir išdėstymą, jūs galėsite išlaikyti kodą švaresnį ir vėliau lengviau perskaityti.

Linijinėje diagramoje ir juostų diagramoje pavadinime ir eilutėse naudojamas tas pats išdėstymas, todėl pradėsime sukurdami bendrą diagramą, kurioje bus šios dvi funkcijos. Maketas, kurį sukursime, parodytas žemiau esančiame paveikslėlyje.

Norėdami sukurti bendrąjį Grafikas klasę, mes paklasį Drobė. Centrinis regionas yra vieta, kur bus rodomi faktiniai diagramos duomenys; paliksime tai pratęsti Grafikas įgyvendinti. Kitus elementus - pavadinimo juostą, vertikalią liniją kairėje, horizontalią liniją apačioje ir diapazono reikšmes - įgyvendinsime pagrindinėje klasėje. Galėtume nurodyti šriftą ir tiksliai koduoti taškų matavimus, tačiau vartotojas negalėtų pakeisti grafiko dydžio. Geresnis požiūris yra įvertinti elementus pagal srovė komponento dydį, todėl pakeitus programos dydį bus teisingai pakeistas grafiko dydis.

Štai mūsų planas: mes imsimės Stygos pavadinimas, an tarpt mažiausia vertė ir tarpt didžiausia vertė konstruktoriuje. Tai suteikia mums visą informaciją, kurios mums reikia norint sudaryti pagrindą. Pasiliksime keturis kintamuosius, skirtus naudoti poklasiuose - viršuje, dugnas, palikoir teisingai grafiko brėžinio regiono kraštų vertės. Šiuos kintamuosius naudosime vėliau apskaičiuodami grafiko elementų padėties nustatymą. Pradėkime nuo greito žvilgsnio į Grafikas klasės deklaracija.

importuoti java.awt. *; importuoti java.util. *; viešosios klasės grafikas išplečia drobę {// kintamieji, reikalingi public int top; public int dugnas; public int left; public int teisė; int titleHeight; int labelWidth; „FontMetrics fm“; int paminkštinimas = 4; Styginių pavadinimas; int min; int max; Vektoriniai daiktai; 

Norėdami apskaičiuoti teisingą grafiko elementų išdėstymą, pirmiausia turime apskaičiuoti regionus mūsų bendrame grafiko išdėstyme, kurie sudaro sistemą. Norėdami pagerinti komponento išvaizdą, prie išorinių kraštų pridedame 4 taškų užpildą. Pavadinimą pridėsime viršuje, atsižvelgdami į užpildymo sritį. Norėdami įsitikinti, kad grafikas nėra nubrėžtas ant teksto, turime atimti teksto aukštį iš pavadinimo srities. Turime daryti tą patį ir dėl min ir maks vertės diapazono etiketės. Šio teksto plotis saugomas kintamajame labelWidth. Kad galėtume atlikti matavimus, turime išsaugoti nuorodą į šrifto metriką. daiktų vektorius naudojamas stebėti visus atskirus elementus, kurie buvo pridėti prie „Graph“ komponento. Klasė, naudojama laikyti kintamuosius, susijusius su grafiko elementais, įtraukiama (ir paaiškinama) po Grafikas klasė, kuri rodoma toliau.

 public Graph (Stygos pavadinimas, int min, int max) {this.title = pavadinimas; tai.min = min; tai.max = max; items = naujas vektorius (); } // pabaigos konstruktorius 

Konstruktorius paima grafiko pavadinimą ir reikšmių diapazoną, o atskiriems grafo elementams sukuriame tuščią vektorių.

 public void reshape (int x, int y, int plotis, int aukštis) {super.reshape (x, y, plotis, aukštis); fm = getFontMetrics (getFont ()); titleHeight = fm.getHeight (); labelWidth = Math.max (fm.stringWidth (naujas sveikasis skaičius (min) .toString ()), fm.stringWidth (naujas sveikasis skaičius (max) .toString ())) + 2; top = padding + titleHeight; dugnas = dydis (). aukštis - paminkštinimas; kairė = kamšalas + labelWidth; dešinė = dydis (). plotis - paminkštinimas; } // pabaigos pertvarkyti 

Pastaba: JDK 1.1 versijoje pertvarkyti metodas pakeičiamas į public void setbounds (stačiakampis r). Išsamesnės informacijos ieškokite API dokumentacijoje.

Mes nepaisome pertvarkyti metodas, kuris grandinėje paveldimas iš Komponentas klasė. pertvarkyti metodas vadinamas, kai komponento dydis keičiamas ir kai jis išdėstomas pirmą kartą. Mes naudojame šį metodą rinkdami matavimus, kad jie visada būtų atnaujinami, jei komponento dydis bus pakeistas. Gauname dabartinio šrifto šrifto metriką ir priskiriame titleHeight kintamas maksimalus to šrifto aukštis. Gauname maksimalų etikečių plotį, išbandydami, kuri iš jų yra didesnė, ir tada naudodami tą etiketę. viršuje, dugnas, palikoir teisingai kintamieji skaičiuojami iš kitų kintamųjų ir atspindi centro grafiko brėžinio regiono ribas. Šiuos kintamuosius naudosime Grafikas. Atkreipkite dėmesį, kad atliekant visus matavimus atsižvelgiama į a srovė komponento dydį, kad perbrėžimas būtų teisingas bet kokiu dydžiu ar aspektu. Jei naudotume sunkiai užkoduotas reikšmes, komponento dydžio pakeisti nepavyko.

Toliau nupiešsime grafiko pagrindą.

 public void paint (Grafika g) {// nupieškite pavadinimą fm = getFontMetrics (getFont ()); g.drawString (pavadinimas, (dydis (). plotis - fm.stringWidth (pavadinimas)) / 2, viršuje); // nubrėžkite max ir min reikšmes g.drawString (new Integer (min) .toString (), padding, bottom); g.drawString (naujas sveikasis skaičius (maks.). įString (), paminkštinimas, viršus + titleHeight); // nubrėžkite vertikalias ir horizontalias linijas g.drawLine (kairė, viršuje, kairėje, apačioje); g.drawLine (kairė, apačia, dešinė, apačia); } // pabaigos dažai 

Pagrindas brėžiamas dažyti metodas. Piešiame pavadinimą ir etiketes atitinkamose vietose. Prie kairės grafiko brėžinio srities brėžiame vertikalią liniją, o apatinėje - horizontalią liniją.

Šiame kitame fragmente mes nustatome pageidaujamą komponento dydį, nepaisydami pageidaujamas dydis metodas. pageidaujamas dydis metodas taip pat paveldimas iš Komponentas klasė. Komponentai gali nurodyti pageidaujamą dydį ir mažiausią dydį. Pasirinkau pageidaujamą plotį 300 ir pageidaujamą aukštį 200. Maketo tvarkyklė iškvies šį metodą, kai išdėstys komponentą.

 public Dimension preferSize () {return (new Dimension (300, 200)); }} // pabaigos grafikas 

Pastaba: JDK 1.1 versijoje pageidaujamas dydis metodas pakeičiamas į viešasis aspektas getPreferredSize ().

Toliau mums reikia galimybės pridėti ir pašalinti elementus, kuriuos reikia pavaizduoti.

 public void addItem (String name, int value, Colour col) {items.addElement (new GraphItem (name, value, col)); } // end addItem public void addItem (String name, int value) {items.addElement (new GraphItem (name, value, Color.black)); } // end addItem public void removeItem (String name) {for (int i = 0; i <items.size (); i ++) {if ((((GraphItem) items.elementAt (i)). title.equals (vardas )) daiktai.removeElementAt (i); }} // end removeItem} // end Graph 

Aš modeliuoju Pridėti daiktą ir pašalinti daiktą metodai po panašių metodų Pasirinkimas klasę, todėl kodas bus pažįstamas. Atkreipkite dėmesį, kad mes naudojame du Pridėti daiktą metodai čia; mums reikia būdo pridėti elementus su spalva arba be jos. Kai elementas pridedamas, naujas „GraphItem“ objektas yra sukurtas ir pridedamas prie elementų vektoriaus. Pašalinus elementą, pirmasis vektoriuje su tokiu pavadinimu bus pašalintas. „GraphItem“ klasė yra labai paprasta; čia yra kodas:

importuoti java.awt. *; klasės GraphItem {String title; int vertė; Spalvos spalva; public GraphItem (eilutės pavadinimas, int reikšmė, spalvos spalva) {this.title = title; this.value = reikšmė; tai.spalva = spalva; } // pabaigos konstruktorius} // pabaigos GraphItem 

„GraphItem“ klasė veikia kaip kintamųjų, susijusių su grafiko elementais, turėtoja. Aš įtraukiau Spalva čia tuo atveju, jei jis bus naudojamas Grafikas.

Įdiegę šią sistemą, galime sukurti plėtinius, kad galėtume tvarkyti kiekvieno tipo grafikus. Ši strategija yra gana patogi; mums nereikia vėl vargti matuojant karkaso pikselius ir galime sukurti poklasius, kad sutelktume dėmesį į grafiko piešimo srities užpildymą.

Stulpelių diagramos sudarymas

Dabar, kai turime grafikų sistemą, galime ją pritaikyti išplėsdami

Grafikas

ir pritaikyti brėžinį. Pradėsime nuo paprastos juostos diagramos, kurią galime naudoti kaip ir bet kurį kitą komponentą. Toliau pavaizduota tipinė juostinė diagrama. Užpildysime grafiko brėžinio sritį, nepaisydami

dažyti

metodas paskambinti antklasei

dažyti

metodas (brėžti sistemą), tada atliksime pasirinktinį piešinį, reikalingą šio tipo grafikams.

importuoti java.awt. *; viešoji klasė „BarChart“ išplečia grafiką {int position; int prieaugis; public BarChart (Styginių pavadinimas, int min, int max) {super (pavadinimas, min, max); } // pabaigos konstruktorius 

Kad daiktai būtų tolygiai išdėstyti, laikome prieaugis kintamasis nurodo sumą, kurią mes perkelsime į dešinę kiekvienam elementui. Padėties kintamasis yra dabartinė padėtis, o prieaugio vertė prie jo pridedama kiekvieną kartą. Konstruktorius tiesiog perima superkonstruktoriaus reikšmes (Grafikas), kurį mes vadiname aiškiai.

Dabar galime pereiti prie kai kurių faktinių piešinių.

 public void paint (grafika g) {super.paint (g); prieaugis = (dešinė - kairė) / (elementai.dydis ()); padėtis = kairė; Spalvos temp = g.getColor (); for (int i = 0; i <items.size (); i ++) {GraphItem item = (GraphItem) items.elementAt (i); int koreguotaVertė = apatinė - (((elemento vertė - min) * (apačia - viršuje) / (maks. - min)); g.drawString (item.title, position + (prieaugis - fm.stringWidth (item.title)) / 2, koreguotaValue - 2); g.setColor (item.color); g.fillRect (padėtis, pakoreguota vertė, prieaugis, iš apačios pakoreguota vertė); padėtis + = prieaugis; g.setColor (temp); }} // pabaigos dažai} // pabaigos juostos diagrama 

Atidžiai apžvelkime, kas čia vyksta. Viduje konors dažyti metodas, mes vadiname superklase dažyti metodas braižyti grafiko sistemą. Tada randame prieaugis atimdami dešinįjį kraštą nuo kairiojo krašto, tada rezultatą padalydami iš elementų skaičiaus. Ši vertė yra atstumas tarp kairiųjų diagramos elementų kraštų. Kadangi norime, kad diagramos dydis būtų keičiamas, šias vertes grindžiame dabartine paliko ir teisingai kintamieji, paveldėti iš Grafikas. Prisiminkime, kad paliko, teisingai, viršujeir dugnas reikšmės yra dabartiniai faktiniai grafiko brėžinio srities pikselių matavimai, atlikti pertvarkyti metodas Grafikas, todėl galima naudoti. Jei matavimai nebūtų pagrįsti šiomis vertėmis, diagramos dydis nebūtų pakeistas.

Nubraižysime stačiakampius tos spalvos, kurią nurodo „GraphItem“. Kad galėtume grįžti prie pradinės spalvos, nustatėme laikiną spalva kintamasis, kad būtų galima išlaikyti dabartinę vertę prieš ją pakeičiant. Mes pereiname per grafiko elementų vektorių, apskaičiuodami kiekvieno iš jų koreguotą vertikalią vertę, nupiešdami elemento pavadinimą ir užpildytą stačiakampį, nurodantį jo vertę. Padidėjimas pridedamas prie x padėties kintamojo kiekvieną kartą per kilpą.

Koreguota vertikali vertė užtikrina, kad jei komponentas bus ištemptas vertikaliai, grafikas vis tiek išliks ištikimas jo brėžtoms vertėms. Norėdami tai padaryti tinkamai, turime paimti procentinę diapazono, kurį rodo elementas, ir padauginti šią vertę iš faktinio grafiko brėžinio regiono pikselių diapazono. Tada atimame rezultatą iš dugnas vertė teisingai nubrėžti tašką.

Kaip matote iš šios diagramos, bendras horizontalių taškų dydis yra dešinė Kairė o bendrą vertikalų dydį vaizduoja apačia - viršuje.

Mes pasirūpiname horizontaliu tempimu inicijuodami poziciją kintamasis į kairįjį kraštą ir padidinamas prieaugis kintamasis kiekvienam elementui. Nes poziciją ir prieaugis kintamieji priklauso nuo faktinių dabartinių pikselių reikšmių, komponento dydis visada teisingai keičiamas horizontalia kryptimi.

Norėdami įsitikinti, kad vertikalus braižymas visada yra teisingas, turime susieti schemos elemento vertes su faktinėmis taškų paskirties vietomis. Yra viena komplikacija: maks ir min reikšmės turėtų būti reikšmingos grafiko elemento vertės padėčiai. Kitaip tariant, jei diagrama prasideda nuo 150 ir eina į 200, elementas, kurio vertė 175, turėtų pasirodyti pusiaukelėje vertikalioje ašyje. Norėdami tai pasiekti, surandame elemento nurodytą diagramos diapazono procentinę dalį ir padauginame iš faktinio pikselių diapazono. Kadangi mūsų grafikas yra apverstas nuo grafikos konteksto koordinačių sistemos, atimame šį skaičių iš dugnas rasti teisingą siužeto tašką. Atminkite, kad pradžia (0,0) yra viršutiniame kairiajame kodo kampe, bet apatiniame kairiajame kampe - mūsų kuriamo grafiko stilius.