Mūsu pielāgotajiem grafu komponentiem ir vajadzīga manuāla zīmēšana, tāpēc mums būs jāpaklasa Audekls
, kas ir standarta komponents, kas paredzēts tiešai grafikas manipulācijai. Metode, kuru mēs izmantosim, būs ignorēt krāsot
metode Audekls
ar mums nepieciešamo pielāgoto zīmējumu. Mēs izmantosim Grafika
objekts, kas automātiski tiek pārsūtīts uz krāsot
visu komponentu metode, lai piekļūtu krāsām un zīmēšanas metodēm.
Mēs izveidosim divus pielāgotus grafiku komponentus: joslu diagrammu un līniju diagrammu. Mēs sāksim izveidot vispārēju ietvara klasi abiem grafikiem, kuriem ir kopīgi daži pamata elementi.
Vispārīga grafu ietvara veidošana
Līniju diagramma un joslu diagramma, kuru mēs veidosim, ir pietiekami līdzīgas, lai mēs varētu izveidot vispārēju
Grafiks
klasē, lai veiktu dažus no nogurdinošajiem maketēšanas darbiem. Kad tas ir izdarīts, mēs varam paplašināt klasi konkrētajam vajadzīgajam grafika veidam.
Pirmais, kas jādara, izstrādājot pielāgotus grafikas komponentus, ir likt pildspalvu uz papīra un uzzīmēt nepieciešamo attēlu. Tā kā mēs skaitām pikseļus, ir viegli sajaukt elementu izvietojumu. Pārdomājot elementu nosaukumus un pozicionēšanu, jūs varēsit saglabāt kodu tīrāku un vieglāk lasāmu vēlāk.
Līniju diagrammā un joslu diagrammā virsrakstam un līnijām tiek izmantots viens un tas pats izkārtojums, tāpēc vispirms mēs izveidosim vispārēju diagrammu, kas satur šīs divas funkcijas. Izkārtojums, kuru mēs izveidosim, ir parādīts zemāk redzamajā attēlā.
Lai izveidotu vispārīgo Grafiks
klasē, mēs apakšklasē Audekls
. Centra reģions ir vieta, kur tiks parādīti faktiskie diagrammas dati; mēs to atstāsim pagarinājumam Grafiks
īstenot. Citus elementus - virsraksta joslu, vertikālu līniju pa kreisi, horizontālu līniju apakšā un diapazona vērtības - mēs ieviesīsim bāzes klasē. Mēs varētu norādīt fontu un kodēt pikseļu mērījumus, taču lietotājs nevarētu mainīt diagrammas lielumu. Labāka pieeja ir elementu salīdzināšana ar pašreizējais komponenta lielums, tā, ka, mainot lietojumprogrammas lielumu, tiks pareizi mainīta diagramma.
Šis ir mūsu plāns: mēs veiksim a Stīga
nosaukums, an int
minimālā vērtība un int
maksimālā vērtība konstruktorā. Tie sniedz mums visu nepieciešamo informāciju, lai izveidotu sistēmu. Mēs saglabāsim četrus mainīgos, lai tos izmantotu apakšklasēs tops
, apakšā
, pa kreisi
, un pa labi
vērtības grafika zīmēšanas reģiona robežām. Mēs izmantosim šos mainīgos, lai vēlāk aprēķinātu diagrammas vienumu pozicionēšanu. Sāksim ar ātru ieskatu Grafiks
klases deklarācija.
importēt java.awt. *; importēt java.util. *; public class Graph paplašina Canvas {// mainīgos, kas nepieciešami public int top; public int bottom; public int left; public int tiesības; int nosaukumsAugstums; int labelWidth; FontMetrics fm; int polsterējums = 4; Stīgu nosaukums; int min; int max; Vektoru priekšmeti;
Lai aprēķinātu grafa elementu pareizu izvietojumu, mums vispirms ir jāaprēķina reģioni mūsu vispārējā diagrammas izkārtojumā, kas veido ietvaru. Lai uzlabotu komponenta izskatu, mēs ārējām malām pievienojam 4 pikseļu polsterējumu. Nosaukumu pievienosim augšpusē, ņemot vērā polsterējuma laukumu. Lai pārliecinātos, ka diagramma nav uzzīmēta virs teksta, mums jāatņem teksta augstums no virsraksta reģiona. Mums tas pats jādara arī min
un maks
vērtību diapazona etiķetes. Šī teksta platums tiek saglabāts mainīgajā labelWidth
. Lai veiktu mērījumus, mums jāsaglabā atsauce uz fontu metriku. The preces
vektors tiek izmantots, lai izsekotu visiem atsevišķajiem vienumiem, kas pievienoti grafa komponentam. Klase, ko izmanto, lai turētu mainīgos, kas saistīti ar diagrammas vienumiem, ir iekļauta (un paskaidrota) pēc Grafiks
klase, kas tiek parādīta nākamajā.
publiskais grafiks (virknes nosaukums, int min, int max) {this.title = nosaukums; tas.min = min; tas.max = max; items = jauns Vector (); } // beigu konstruktors
Konstruktors paņem grafika virsrakstu un vērtību diapazonu, un mēs atsevišķiem grafa elementiem izveidojam tukšu vektoru.
public void reshape (int x, int y, int platums, int augstums) {super.reshape (x, y, platums, augstums); fm = getFontMetrics (getFont ()); titleHeight = fm.getHeight (); labelWidth = Math.max (fm.stringWidth (jauns Integer (min) .toString ()), fm.stringWidth (jauns Integer (max) .toString ())) + 2; top = polsterējums + titleHeight; dibens = izmērs (). augstums - polsterējums; pa kreisi = polsterējums + labelWidth; pa labi = izmērs (). platums - polsterējums; } // beigt pārveidot
Piezīme. JDK 1.1 pārveidot
metode tiek aizstāta ar public void setBounds (taisnstūris r)
. Sīkāku informāciju skatiet API dokumentācijā.
Mēs ignorējam pārveidot
metode, kas tiek mantota ķēdē no Komponents
klasē. The pārveidot
metodi sauc, kad komponenta izmērs tiek mainīts un kad tas tiek izlikts pirmo reizi. Mēs izmantojam šo metodi mērījumu apkopošanai, lai tie vienmēr tiktu atjaunināti, ja komponenta izmērs tiks mainīts. Mēs iegūstam pašreizējā fonta fontu metriku un piešķiram nosaukumsAugstums
mainīt šī fonta maksimālo augstumu. Mēs iegūstam maksimālo etiķešu platumu, pārbaudot, kurš no tiem ir lielāks, un pēc tam izmantojot šo. The tops
, apakšā
, pa kreisi
, un pa labi
mainīgie tiek aprēķināti no citiem mainīgajiem lielumiem un attēlo centra grafa zīmēšanas reģiona robežas. Mēs šos mainīgos izmantosim apakšklasēs Grafiks
. Ņemiet vērā, ka visos mērījumos ņem vērā a pašreizējais komponenta izmēru, lai pārzīmēšana būtu pareiza jebkurā izmērā vai aspektā. Ja mēs izmantojām stingri kodētas vērtības, komponenta lielumu nevarēja mainīt.
Tālāk mēs uzzīmēsim grafika ietvaru.
public void paint (Grafika g) {// uzzīmē nosaukumu fm = getFontMetrics (getFont ()); g.drawString (nosaukums, (izmērs (). platums - fm.stringWidth (nosaukums)) / 2, augšpusē); // uzzīmējiet maksimālās un minimālās vērtības g.drawString (new Integer (min) .toString (), polsterējums, dibens); g.drawString (jauns Integer (max) .toString (), polsterējums, top + titleHeight); // uzzīmē vertikālās un horizontālās līnijas g.drawLine (pa kreisi, augšā, pa kreisi, apakšā); g.drawLine (pa kreisi, apakšā, pa labi, apakšā); } // beigu krāsa
Sistēma ir izstrādāta krāsot
metodi. Virzienu un etiķetes uzzīmējam attiecīgajās vietās. Pie grafika zīmēšanas apgabala kreisās robežas mēs zīmējam vertikālu līniju, bet apakšējā - horizontālu līniju.
Šajā nākamajā fragmentā mēs iestatījām vēlamo komponenta izmēru, ignorējot PreferredSize
metodi. The PreferredSize
metode tiek mantota arī no Komponents
klasē. Komponenti var norādīt vēlamo un minimālo izmēru. Es izvēlējos vēlamo platumu 300 un vēlamo augstumu 200. Izkārtojuma pārvaldnieks izsauks šo metodi, kad tā izkārtos komponentu.
public Dimension preferenceSize () {return (new Dimension (300, 200)); }} // beigu grafiks
Piezīme. JDK 1.1 PreferredSize
metode tiek aizstāta ar publiskā dimensija getPreferredSize ()
.
Tālāk mums ir nepieciešama iespēja grafisko vienumu pievienošanai un noņemšanai.
public void addItem (String name, int value, Color col) {items.addElement (new GraphItem (name, value, col)); } // end addItem public void addItem (virknes nosaukums, int vērtība) {items.addElement (jauns GraphItem (nosaukums, vērtība, Color.black)); } // end addItem public void removeItem (virknes nosaukums) {for (int i = 0; i <items.size (); i ++) {if ((((GraphItem) items.elementAt (i)). title.equals (nosaukums )) preces.removeElementAt (i); }} // end removeItem} // beigu grafiks
Esmu modelējis addItem
un removeItem
metodes pēc līdzīgām metodēm Izvēle
klase, tāpēc kodam būs pazīstama izjūta. Ievērojiet, ka mēs izmantojam divus addItem
metodes šeit; mums ir nepieciešams veids, kā pievienot priekšmetus ar krāsu vai bez tās. Kad vienums ir pievienots, jauns GraphItem
objekts tiek izveidots un pievienots vienumu vektoram. Kad vienums tiek noņemts, pirmais vektorā ar šo nosaukumu tiks noņemts. The GraphItem
klase ir ļoti vienkārša; šeit ir kods:
importēt java.awt. *; klase GraphItem {Stīgas nosaukums; int vērtība; Krāsas krāsa; public GraphItem (virknes nosaukums, int vērtība, krāsu krāsa) {this.title = nosaukums; this.value = vērtība; šī.krāsa = krāsa; } // beigu konstruktors} // beigs GraphItem
The GraphItem
klase darbojas kā turētājs mainīgajiem, kas attiecas uz grafika vienumiem. Esmu iekļāvis Krāsa
šeit gadījumā, ja to izmantos Grafiks
.
Izmantojot šo sistēmu, mēs varam izveidot paplašinājumus, lai apstrādātu katra veida diagrammas. Šī stratēģija ir diezgan ērta; mums nav atkārtoti jāmēģina izmērīt ietvara pikseļus, un mēs varam izveidot apakšklases, lai koncentrētos uz grafu zīmēšanas reģiona aizpildīšanu.
Joslu diagrammas veidošana
Tagad, kad mums ir grafiku sistēma, mēs to varam pielāgot, paplašinot
Grafiks
un pielāgotu zīmējumu ieviešana. Mēs sāksim ar vienkāršu joslu diagrammu, kuru mēs varam izmantot tāpat kā jebkuru citu komponentu. Tipiska joslu diagramma ir ilustrēta zemāk. Mēs aizpildīsim diagrammas zīmēšanas reģionu, ignorējot
krāsot
metodi, lai izsauktu superklasi
krāsot
metodi (lai uzzīmētu ietvaru), tad mēs veiksim pielāgoto zīmējumu, kas nepieciešams šāda veida grafikam.
importēt java.awt. *; publiskā klase BarChart paplašina Graph {int position; int pieaugums; public BarChart (Stīgas nosaukums, int min, int max) {super (nosaukums, min, max); } // beigu konstruktors
Lai preces vienmērīgi izvietotu, mēs saglabājam pieaugums
mainīgais lielums, lai norādītu summu, kuru katram priekšmetam novirzīsim pa labi. Pozīcijas mainīgais ir pašreizējā pozīcija, un pieauguma vērtība tam tiek pievienota katru reizi. Konstruktors vienkārši uzņem superkonstruktora vērtības (Grafiks
), ko mēs skaidri saucam.
Tagad mēs varam nonākt pie kāda faktiskā zīmējuma.
public void paint (Grafika g) {super.paint (g); pieaugums = (pa labi - pa kreisi) / (vienumi.izmērs ()); pozīcija = pa kreisi; Krāsu temp = g.getColor (); for (int i = 0; i <items.size (); i ++) {GraphItem item = (GraphItem) items.elementAt (i); int AdjustValue = apakšā - (((vienums.vērtība - min) * (apakšā - augšā)) / (max - min)); g.drawString (item.title, position + (pieaugums - fm.stringWidth (item.title)) / 2, koriģētaisValue - 2); g.setColor (item.color); g.fillRect (pozīcija, koriģētā vērtība, pieaugums, apakšā koriģētā vērtība); pozīcija + = pieaugums; g.setColor (temp); }} // beigt krāsu} // beigt BarChart
Apskatīsim tuvāk, kas šeit notiek. Iekš krāsot
metodi mēs saucam par superklasi krāsot
metode grafa ietvara zīmēšanai. Pēc tam mēs atrodam pieaugums
atņemot labo malu no kreisās malas un pēc tam rezultātu dalot ar vienumu skaitu. Šī vērtība ir attālums starp diagrammas vienumu kreisajām malām. Tā kā mēs vēlamies, lai diagrammas izmērs būtu maināms, mēs šīs vērtības pamatojam ar pašreizējo pa kreisi
un pa labi
mainīgie, kas mantoti no Grafiks
. Atgādināt, ka pa kreisi
, pa labi
, tops
, un apakšā
vērtības ir grafika zīmēšanas apgabala pašreizējie faktiskie pikseļu mērījumi, kas veikti pārveidot
metode Grafiks
, un tāpēc ir pieejams mūsu lietošanai. Ja mēs nepamatotu mērījumus uz šīm vērtībām, diagrammas lielums nebūtu maināms.
Mēs uzzīmēsim taisnstūrus krāsā, kuru norādījusi GraphItem
. Lai mēs varētu atgriezties pie sākotnējās krāsas, mēs iestatījām pagaidu krāsa
mainīgais, lai saglabātu pašreizējo vērtību, pirms mēs to mainām. Mēs pārvietojamies pa grafiku vienumu vektoru, aprēķinot katram pielāgotu vertikālo vērtību, uzzīmējot vienuma nosaukumu un aizpildītu taisnstūri, kas atspoguļo tā vērtību. Pieaugums tiek pievienots x pozīcijas mainīgajam katru reizi caur cilpu.
Pielāgotā vertikālā vērtība nodrošina, ka, ja komponents tiek izstiepts vertikāli, grafiks joprojām paliks uzticīgs tā attēlotajām vērtībām. Lai to izdarītu pareizi, mums jāņem diapazona procentuālais daudzums, ko vienums pārstāv, un šī vērtība jāreizina ar grafika zīmēšanas reģiona faktisko pikseļu diapazonu. Pēc tam mēs atņemam rezultātu no apakšā
vērtību, lai pareizi uzzīmētu punktu.
Kā redzams no šīs diagrammas, kopējo horizontālo pikseļu izmēru apzīmē ar labais - kreisais un kopējo vertikālo lielumu attēlo apakšā - augšā.
Mēs rūpējamies par horizontālo stiepšanos, inicializējot pozīciju
mainīgais līdz kreisajai malai un palielinot to par pieaugums
mainīgais katram vienumam. Tāpēc ka pozīciju
un pieaugums
mainīgie ir atkarīgi no faktiskajām pašreizējām pikseļu vērtībām, komponenta izmērs vienmēr tiek pareizi mainīts horizontālā virzienā.
Lai pārliecinātos, ka vertikālā zīmēšana vienmēr ir pareiza, mums ir jāapzīmē diagrammas vienumu vērtības ar faktiskajiem pikseļu izvietojumiem. Ir viena komplikācija: maks
un min
vērtībām jābūt nozīmīgām attiecībā uz diagrammas vienuma vērtības pozīciju. Citiem vārdiem sakot, ja diagramma sākas ar 150 un iet uz 200, vienumam ar vērtību 175 vajadzētu parādīties vertikālās ass vidū. Lai to panāktu, mēs atrodam grafika diapazona procentuālo daudzumu, ko vienums pārstāv, un reizinām to ar faktisko pikseļu diapazonu. Tā kā mūsu grafiks ir otrādi no grafikas konteksta koordinātu sistēmas, mēs no šī skaitļa atņemam apakšā
lai atrastu pareizo sižeta punktu. Atcerieties, ka koda izcelsme (0,0) atrodas augšējā kreisajā stūrī, bet apakšējais kreisais stūris - mūsu izveidotā grafika stilam.