Programmēšana

Diagramma veids, kā pielāgot diagrammas komponentus

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.

$config[zx-auto] not found$config[zx-overlay] not found