Applet pro demonstraci Boyerova-Mooreova algoritmu  1.0
Tabulka.java
Zobrazit dokumentaci tohoto souboru.
1 /******************************************************************************
2  * Název projektu: Aplet pro demonstraci Boyerova-Mooreova algoritmu
3  * Balíček: boyermooredemo
4  * Soubor: Tabulka.java
5  * Datum: 11.4.2008
6  * Poslední změna: 18.4.2008
7  * Autor: Jaroslav Dytrych xdytry00
8  *
9  * Popis: Třída pro vytvoření tabulky, která má záhlaví v jednotlivých řádcích
10  * prvního sloupce, nebo vůbec.
11  * V případě, že se text nevejde do buňky tabulky, buňky jsou
12  * automaticky rozšířeny. První a poslední sloupec mohou mít jinou šířku,
13  * než sloupce ve zbytku tabulky.
14  * Rozměry tabulky lze za běhu měnit. Tabulka by měla být umístěna
15  * ve skrolovacím panelu, jehož skrolovatelnou oblast a krok skrolování
16  * nastavuje v rámci implementace rozhraní Scrollable.
17  *
18  ******************************************************************************/
19 
20 /**
21  * @file Tabulka.java
22  *
23  * @brief Třída Tabulka - vytvoření tabulky se záhlavími řádků
24  */
25 
26 package boyermooredemo;
27 
28 import java.awt.BasicStroke;
29 import java.awt.Color;
30 import java.awt.Dimension;
31 import java.awt.Font;
32 import java.awt.FontMetrics;
33 import java.awt.Graphics;
34 import java.awt.Graphics2D;
35 import java.awt.Rectangle;
36 
37 import javax.swing.JPanel;
38 import javax.swing.Scrollable;
39 
40 /**
41  * Třída pro vytvoření tabulky, která má záhlaví v jednotlivých řádcích prvního
42  * sloupce, nebo vůbec.
43  * V případě, že se text nevejde do buňky tabulky, buňky jsou automaticky
44  * rozšířeny. První a poslední sloupec mohou mít jinou šířku, než sloupce
45  * ve zbytku tabulky.
46  * Rozměry tabulky lze za běhu měnit. Tabulka by měla být umístěna
47  * ve skrolovacím panelu, jehož skrolovatelnou oblast a krok skrolování
48  * nastavuje v rámci implementace rozhraní Scrollable.
49  *
50  * @brief Třída pro vytvoření tabulky se záhlavími řádků
51  */
52 public class Tabulka extends JPanel implements Scrollable {
53  /**
54  * Proměnná pro počet řádků tabulky
55  */
56  private int pocetRadku = 0;
57  /**
58  * Proměnná pro počet sloupců tabulky
59  */
60  private int pocetSloupcu = 0;
61  /**
62  * Tloušťka ohraničení buněk tabulky,
63  * kolem celé tabulky bude ohraničení dvojnásobné.
64  */
65  private int ohraniceni = 0;
66  /**
67  * pole s obsahy buněk tabulky
68  */
69  private String[][] bunky;
70  /**
71  * Pole s barvami buněk
72  *
73  * 3. rozměr rozlišuje barvu písma [0] a barvu pozadí [1]
74  */
75  private Color[][][] barvyBunek;
76  /**
77  * Barva pozadí tabulky
78  */
79  private Color barvaPozadi;
80  /**
81  * Barva písma v tabulce
82  */
83  private Color barvaPisma;
84  /**
85  * Šířka plátna, na kterém bude tabulka vykreslena
86  */
87  private int sirkaPlatna = 0;
88  /**
89  * Výška plátna, na kterém bude tabulka vykreslena
90  */
91  private int vyskaPlatna = 0;
92  /**
93  * Okraje buňky
94  */
95  private int okrajeBunky = 4;
96  /**
97  * Šířka prázdného řetězce v px
98  */
99  private int sirkaPrazdneho = 5;
100  /**
101  * Šířka buňky tabulky
102  */
103  private int sirkaBunky = 5;
104  /**
105  * Výška buňky tabulky
106  */
107  private int vyskaBunky = 10;
108  /**
109  * Metrika fontu - obsahuje metody pro zjišťování šířky a výšky řetězce
110  */
111  private FontMetrics metrikaFontu = null;
112  /**
113  * Proměnná, která určuje, zda bude 1. sloupec hlavička tabulky,
114  * tedy zda mít 1. sloupec jinou šířku
115  */
116  private boolean prvniHlavicka = false;
117  /**
118  * Šířka 1. sloupce tabulky
119  */
120  private int sirkaPrvniho = 5;
121  /**
122  * Proměnná, která určuje, zda bude mít poslední sloupec tabulky jinou šířku
123  */
124  private boolean posledniJiny = false;
125  /**
126  * Šířka posledního sloupce tabulky
127  */
128  private int sirkaPosledniho = 5;
129 
130  /**
131  * Konstanta pro směr posunu vlevo
132  */
133  public static final int POSUN_VLEVO = 0;
134  /**
135  * Konstanta pro směr posunu vpravo
136  */
137  public static final int POSUN_VPRAVO = 1;
138 
139  /**
140  * Konstruktor třídy, vytvoří tabulku a provede inicializaci
141  *
142  * @param radky Počet řádků tabulky
143  * @param sloupce Počet sloupců tabulky
144  * @param ohraniceniTabuky Tloušťka ohraničení buněk tabulky a současně
145  * 1/2 tloušťky ohraničení celé tabulky
146  * @param okrajeBunkyTab Okraje buňky v tabulce
147  * @param barvaPozadiTab Barva pozadí tabulky
148  * @param barvaPismaTab Barva písma v tabulce
149  * @param prvniHlavickaTab Určuje, zda bude 1. sloupec sloužit jako hlavička tabulky
150  * @param posledniSlJiny Určuje, zda bude mít poslední sloupec tabulky jinou šířku
151  */
152  public Tabulka (int radky, int sloupce, int ohraniceniTabuky, int okrajeBunkyTab,
153  Color barvaPozadiTab, Color barvaPismaTab,
154  boolean prvniHlavickaTab, boolean posledniSlJiny)
155  {
156  this.setDoubleBuffered(true); // zapne double-buffer
157  this.ohraniceni = ohraniceniTabuky; // nastaví ohraničení tabulky
158  this.barvaPozadi = barvaPozadiTab; // nastaví nbarvu pozadí
159  this.barvaPisma = barvaPismaTab; // nastaví nbarvu písma
160  this.okrajeBunky = okrajeBunkyTab; // nastaví okraje buňky
161  this.prvniHlavicka = prvniHlavickaTab; // nastaví chování 1. sloupce
162  this.posledniJiny = posledniSlJiny; // nastaví chování posledního sloupce
163  // nastaví rozměry tabulky
164  this.pocetRadku = radky;
165  this.pocetSloupcu = sloupce;
166  // zjistí metriku fontu
167  this.setFont(new Font("Arial",Font.PLAIN,12));
168  this.metrikaFontu = this.getFontMetrics(this.getFont());
169  if (prvniHlavickaTab)
170  { // pokud první sloupec bude tvořit hlavičku tabulky
171  // upraví šířku 1. sloupce (přidá šířku 2. ohraničovací čáry)
172  this.sirkaPrvniho += 2 * this.ohraniceni;
173  }
174 
175  // nastaví výchozí rozměry plátna
176  this.sirkaPlatna = 10;
177  this.vyskaPlatna = 10;
178 
179  this.vyskaBunky = this.metrikaFontu.getMaxAscent(); // určí výšku buňky
180 
181  this.bunky = new String[radky][sloupce]; // inicializace pole obsahů buněk
182  this.barvyBunek = new Color[radky][sloupce][2]; // inicializace pole barev buněk
183 
184  for (int i = 0; i < radky; i++)
185  { // procházení tabulky po řádcích
186  for (int j = 0; j < sloupce; j++)
187  { // procházení tabulky po sloupcích
188  this.bunky[i][j] = ""; // nastaví obsah buňky
189  this.barvyBunek[i][j][0] = barvaPismaTab; // nastaví barvu písma
190  this.barvyBunek[i][j][1] = barvaPozadiTab; // nastaví barvu pozadí
191  }
192  }
193 
194  // vypočítá rozměry plátna
195  // (vnější rámeček má dvojnásobný okraj, kolem tabulky je okraj 5 px)
196  this.sirkaPlatna = sloupce * (this.sirkaBunky + ohraniceniTabuky + this.okrajeBunky * 2)
197  + 4 * ohraniceniTabuky + 10;
198  this.vyskaPlatna = radky * (this.vyskaBunky + ohraniceniTabuky + this.okrajeBunky * 2)
199  + 4 * ohraniceniTabuky + 10;
200  } // public Tabulka
201 
202  /**
203  * Metoda pro vyprázdnění tabulky a nastavení výchozí barvy všech buněk
204  *
205  * @param vcetnePrvniho Pokud je false, první sloupec se ponechá beze změny
206  */
207  public void vyprazdniTabulku(boolean vcetnePrvniho)
208  {
209  int zacatek;
210  if (vcetnePrvniho)
211  { // pokud se má vymazat vše
212  zacatek = 0;
213  if (this.prvniHlavicka)
214  { // pokud je 1. sloupec hlavička
215  this.sirkaPrvniho = this.sirkaPrazdneho + 2 * this.ohraniceni; // šířka 1. buňky
216  }
217  else
218  { // pokud poslední sloupec není hlavička
219  this.sirkaPrvniho = this.sirkaPrazdneho; // šířka 1. buňky
220  }
221  } // pokud se má vymazat vše
222  else
223  { // pokud se má 1. sloupec ponechat
224  zacatek = 1;
225  }
226  this.sirkaBunky = this.sirkaPrazdneho; // nastaví výchozí šířku buněk
227  this.sirkaPosledniho = this.sirkaPrazdneho; // nastaví šířku posledního sloupce
228 
229  for (int i = 0; i < this.pocetRadku; i++)
230  { // procházení tabulky po řádcích
231  for (int j = zacatek; j < this.pocetSloupcu; j++)
232  { // procházení tabulky po sloupcích
233  this.bunky[i][j] = ""; // nastaví obsah buňky
234  this.barvyBunek[i][j][0] = this.barvaPisma; // nastaví barvu písma
235  this.barvyBunek[i][j][1] = this.barvaPozadi; // nastaví barvu pozadí
236  }
237  }
238  // přepočítá rozměry plátna
239  // (vnější rámeček má dvojnásobný okraj, kolem tabulky je okraj 5 px)
240  this.sirkaPlatna = (this.pocetSloupcu - 2) * (this.sirkaBunky + this.ohraniceni + this.okrajeBunky * 2)
241  + this.sirkaPrvniho + this.sirkaPosledniho + 2 * this.ohraniceni + this.okrajeBunky * 4
242  + 4 * this.ohraniceni + 10;
243  this.vyskaPlatna = this.pocetRadku * (this.vyskaBunky + this.ohraniceni + this.okrajeBunky * 2)
244  + 4 * this.ohraniceni + 10;
245  this.prekresliTabulku(); // překreslí tabulku
246  } // public void vyprazdniTabulku()
247 
248  /**
249  * Metoda pro nastavení obsahu buňky
250  *
251  * @param radek Řádek, na kterém se buňka nachází
252  * @param sloupec Sloupec, na kterém se buňka nachází
253  * @param hodnota Nová hodnota v buňce
254  */
255  public void nastavObsah(int radek, int sloupec, String hodnota)
256  {
257  int sirkaObsahu;
258  int porovnavanaSirka;
259  if (this.prvniHlavicka && sloupec == 0)
260  { // pokud se bude aktualizovat šířka 1. sloupce
261  porovnavanaSirka = this.sirkaPrvniho;
262  }
263  else if (this.posledniJiny && sloupec == (this.pocetSloupcu - 1))
264  { // pokud se bude aktualizovat šířka posledního sloupce
265  porovnavanaSirka = this.sirkaPosledniho;
266  }
267  else
268  { // pokud se bude aktualizovat šířka buňky
269  porovnavanaSirka = this.sirkaBunky;
270  }
271  this.bunky[radek][sloupec] = hodnota; // nastaví obsah buňky
272  if (hodnota.length() > 0)
273  { // pokud bnka není prázdná
274  sirkaObsahu = metrikaFontu.stringWidth(hodnota); // zjistí šířku řetězce
275  }
276  else
277  { // pokud je buňka prázdná
278  sirkaObsahu = this.sirkaPrazdneho;
279  }
280  if (sirkaObsahu > porovnavanaSirka)
281  { // pokud je třeba rozšířit buňky
282  if (this.prvniHlavicka && sloupec == 0)
283  { // pokud se jedná o buňku hlavičky
284  this.sirkaPrvniho = sirkaObsahu; // hozšíří hlavičku
285  // upraví šířku 1. sloupce (přidá šířku 2. ohraničovací čáry)
286  this.sirkaPrvniho += 2 * this.ohraniceni;
287  }
288  else if (this.posledniJiny && sloupec == (this.pocetSloupcu - 1))
289  { // pokud se jedná o buňku posledního sloupce
290  this.sirkaPosledniho = sirkaObsahu; // hozšíří buňky
291  }
292  else
293  { // pokud se jedná o obecnou buňku
294  this.sirkaBunky = sirkaObsahu; // hozšíří buňky
295  if (!this.prvniHlavicka)
296  { // pokud 1. sloupec obsahuje obecné buňky
297  this.sirkaPrvniho = sirkaObsahu;
298  }
299  if (!this.posledniJiny)
300  { // pokud poslední sloupec obsahuje obecné buňky
301  this.sirkaPosledniho = sirkaObsahu;
302  }
303  } // pokud se jedná o obecnou buňku
304  // přepočítá rozměry plátna
305  // (vnější rámeček má dvojnásobný okraj, kolem tabulky je okraj 5 px)
306  this.sirkaPlatna = (this.pocetSloupcu - 2) * (this.sirkaBunky + this.ohraniceni + this.okrajeBunky * 2)
307  + this.sirkaPrvniho + this.sirkaPosledniho + 2 * this.ohraniceni + this.okrajeBunky * 4
308  + 4 * this.ohraniceni + 10;
309  this.vyskaPlatna = this.pocetRadku * (this.vyskaBunky + this.ohraniceni + this.okrajeBunky * 2)
310  + 4 * this.ohraniceni + 10;
311  }
312  this.prekresliTabulku(); // překreslí tabulku
313  } // public void nastavObsah()
314 
315  /**
316  * Metoda pro nastavení barev buňky
317  *
318  * @param radek Řádek, na kterém se buňka nachází
319  * @param sloupec Sloupec, na kterém se buňka nachází
320  * @param barvaPozadiB Nová barva pozadí buňky
321  * @param barvaPismaB Nová barva písma v buňce
322  */
323  public void nastavBarvu(int radek, int sloupec, Color barvaPozadiB, Color barvaPismaB)
324  {
325  this.barvyBunek[radek][sloupec][0] = barvaPismaB; // nastaví barvu buňky
326  this.barvyBunek[radek][sloupec][1] = barvaPozadiB; // nastaví barvu písma
327  this.prekresliTabulku(); // překreslí tabulku
328  }
329 
330 
331  /**
332  * Metoda pro minimalizaci šířky buňky tabulky
333  */
334  public void minimalizaceSirky()
335  {
336  int minSirka = this.sirkaPrazdneho;
337  int sirkaObsahu;
338  int zacatek; // pomocná proměnná
339  if (this.prvniHlavicka)
340  { // pokud je 1. sloupec hlavička
341  zacatek = 1;
342  for (int i = 0; i < this.pocetRadku; i++)
343  { // nalezení nejširší buňky sloupce hlavičky
344  sirkaObsahu = this.metrikaFontu.stringWidth(bunky[i][0]);
345  if (sirkaObsahu > minSirka)
346  {
347  minSirka = sirkaObsahu;
348  }
349  }
350  this.sirkaPrvniho = minSirka; // nastaví novou šířku hlavičky
351  // upraví šířku 1. sloupce (přidá šířku 2. ohraničovací čáry)
352  this.sirkaPrvniho += 2 * this.ohraniceni;
353  }
354  else
355  { // pokud 1. sloupec není hlavička
356  zacatek = 0;
357  }
358  int konec = this.pocetSloupcu;
359  if (this.posledniJiny)
360  { // pokud má poslední sloupec jinou šířku
361  konec--; // poslední sloupec se nebude procházet
362  for (int i = 0; i < this.pocetRadku; i++)
363  { // nalezení nejširší buňky posledního sloupce
364  sirkaObsahu = this.metrikaFontu.stringWidth(bunky[i][konec]);
365  if (sirkaObsahu > minSirka)
366  {
367  minSirka = sirkaObsahu;
368  }
369  }
370  this.sirkaPosledniho = minSirka; // nastaví novou šířku posledního sloupce
371  }
372  // nalezení nejširšího obsahu buňky
373  for (int i = 0; i < this.pocetRadku; i++)
374  { // procházení po řádcích
375  for (int j = zacatek; j < konec; j++)
376  {
377  sirkaObsahu = this.metrikaFontu.stringWidth(bunky[i][j]);
378  if (sirkaObsahu > minSirka)
379  {
380  minSirka = sirkaObsahu;
381  }
382  }
383  } // procházení po řádcích
384  this.sirkaBunky = minSirka; // nastaví novou šířku buňky
385  if (!this.prvniHlavicka)
386  { // pokud 1. sloupec netvoří hlavičku
387  this.sirkaPrvniho = minSirka;
388  }
389  if (!this.posledniJiny)
390  { // pokud poslední sloupec není jiný
391  this.sirkaPosledniho = minSirka;
392  }
393  // přepočítá rozměry plátna
394  // (vnější rámeček má dvojnásobný okraj, kolem tabulky je okraj 5 px)
395  this.sirkaPlatna = (this.pocetSloupcu - 2) * (this.sirkaBunky + this.ohraniceni + this.okrajeBunky * 2)
396  + this.sirkaPrvniho + this.sirkaPosledniho + 2 * this.ohraniceni + this.okrajeBunky * 4
397  + 4 * this.ohraniceni + 10;
398  this.vyskaPlatna = this.pocetRadku * (this.vyskaBunky + this.ohraniceni + this.okrajeBunky * 2)
399  + 4 * this.ohraniceni + 10;
400  this.prekresliTabulku(); // překreslí tabulku
401  } // public void minimalizaceSirky
402 
403 
404  /**
405  * Metoda pro změnu rozměrů tabulky
406  *
407  * @param novyPocetRadku
408  * @param novyPocetSloupcu
409  */
410  public void zmenRozmery (int novyPocetRadku, int novyPocetSloupcu)
411  {
412  String[][] noveBunky; // pomocná pole
413  Color[][][] noveBarvyBunek;
414 
415  if (novyPocetRadku > this.pocetRadku)
416  { // pokud má být počet řádků větší, je nutné upravit pole
417  // inicializace nového pole obsahů buněk
418  noveBunky = new String[novyPocetRadku][this.pocetSloupcu];
419  // inicializace nového pole barev buněk
420  noveBarvyBunek = new Color[novyPocetRadku][this.pocetSloupcu][2];
421  // uložení obsahu a barev buněk do nového pole
422  for (int i = 0; i < this.pocetRadku; i++)
423  { // procházení tabulky po řádcích
424  for (int j = 0; j < this.pocetSloupcu; j++)
425  { // procházení tabulky po sloupcích
426  noveBunky[i][j] = this.bunky[i][j]; // nastaví obsah buňky
427  noveBarvyBunek[i][j][0] = this.barvyBunek[i][j][0]; // nastaví barvu písma
428  noveBarvyBunek[i][j][1] = this.barvyBunek[i][j][1]; // nastaví barvu pozadí
429  }
430  }
431  // nastaví výchozí stav nových buněk
432  for (int i = this.pocetRadku; i < novyPocetRadku; i++)
433  { // procházení tabulky po řádcích
434  for (int j = 0; j < this.pocetSloupcu; j++)
435  { // procházení tabulky po sloupcích
436  this.bunky[i][j] = ""; // nastaví obsah buňky
437  this.barvyBunek[i][j][0] = this.barvaPisma; // nastaví barvu písma
438  this.barvyBunek[i][j][1] = this.barvaPozadi; // nastaví barvu pozadí
439  }
440  }
441  this.pocetRadku = novyPocetRadku; // aktualizije počet řádků
442  // záměna polí
443  this.bunky = noveBunky;
444  this.barvyBunek = noveBarvyBunek;
445  } // pokud má být počet řádků větší, je nutné upravit pole
446  else if (novyPocetRadku < this.pocetRadku)
447  { // pokud má být počet menší, stačí jej pouze nastavit
448  this.pocetRadku = novyPocetRadku;
449  }
450 
451  if (novyPocetSloupcu > this.pocetSloupcu)
452  { // pokud má být počet sloupců větší, je nutné upravit pole
453  // inicializace nového pole obsahů buněk
454  noveBunky = new String[this.pocetRadku][novyPocetSloupcu];
455  // inicializace nového pole barev buněk
456  noveBarvyBunek = new Color[this.pocetRadku][novyPocetSloupcu][2];
457  // uložení obsahu a barev buněk do nového pole
458  for (int i = 0; i < this.pocetRadku; i++)
459  { // procházení tabulky po řádcích
460  for (int j = 0; j < this.pocetSloupcu; j++)
461  { // procházení tabulky po sloupcích
462  noveBunky[i][j] = this.bunky[i][j]; // nastaví obsah buňky
463  noveBarvyBunek[i][j][0] = this.barvyBunek[i][j][0]; // nastaví barvu písma
464  noveBarvyBunek[i][j][1] = this.barvyBunek[i][j][1]; // nastaví barvu pozadí
465  }
466  }
467  // nastaví výchozí stav nových buněk
468  for (int i = 0; i < this.pocetRadku; i++)
469  { // procházení tabulky po řádcích
470  for (int j = this.pocetSloupcu; j < novyPocetSloupcu; j++)
471  { // procházení tabulky po sloupcích
472  noveBunky[i][j] = new String(""); // nastaví obsah buňky
473  noveBarvyBunek[i][j][0] = this.barvaPisma; // nastaví barvu písma
474  noveBarvyBunek[i][j][1] = this.barvaPozadi; // nastaví barvu pozadí
475  }
476  }
477  this.pocetSloupcu = novyPocetSloupcu; // aktualizije počet řádků
478  // záměna polí
479  this.bunky = noveBunky;
480  this.barvyBunek = noveBarvyBunek;
481  } // pokud má být počet sloupců větší, je nutné upravit pole
482  else if (novyPocetSloupcu < this.pocetSloupcu)
483  { // pokud má být počet menší, stačí jej pouze nastavit
484  this.pocetSloupcu = novyPocetSloupcu;
485  }
486 
487  // přepočítá rozměry plátna
488  // (vnější rámeček má dvojnásobný okraj, kolem tabulky je okraj 5 px)
489  this.sirkaPlatna = (this.pocetSloupcu - 2) * (this.sirkaBunky + this.ohraniceni + this.okrajeBunky * 2)
490  + this.sirkaPrvniho + this.sirkaPosledniho + 2 * this.ohraniceni + this.okrajeBunky * 4
491  + 4 * this.ohraniceni + 10;
492  this.vyskaPlatna = this.pocetRadku * (this.vyskaBunky + this.ohraniceni + this.okrajeBunky * 2)
493  + 4 * this.ohraniceni + 10;
494  this.prekresliTabulku(); // překreslí tabulku
495  } // private void zmenRozmery()
496 
497  /**
498  * Metoda pro posun obsahu buněk v řádku tabulky
499  * - pouze pro tabulky bez zvláštního prvního a posledního sloupce
500  * - zleva (zprava) přidá prázdná políčka, zprava (zleva) přebytečná políčka zahodí
501  * - neovlivňuje barvy buněk, posouvá pouze obsah
502  *
503  * @param radek Řádek tabulky
504  * @param smer Směr posuvu: POSUN_VLEVO - vlevo, POSUN_VPRAVO - vpravo
505  * @param pocet Počet posuvů
506  */
507  public void posunRadek(int radek, int smer, int pocet)
508  {
509  if (smer == this.POSUN_VLEVO)
510  { // pokud se má posouvat vlevo
511  for (int i = 0; i < (this.pocetSloupcu - pocet); i++)
512  { // posun
513  this.bunky[radek][i] = this.bunky[radek][i+pocet];
514  }
515  for (int i = (this.pocetSloupcu - pocet); i < this.pocetSloupcu; i++)
516  { // doplnění prázdných buněk
517  this.bunky[radek][i] = "";
518  }
519  }
520  else
521  { // pokud se má posouvat vpravo
522  for (int i = (this.pocetSloupcu - 1); (i - pocet) >= 0; i--)
523  { // posun
524  this.bunky[radek][i] = this.bunky[radek][i-pocet];
525  }
526  for (int i = 0; i < pocet; i++)
527  { // doplnění prázdných buněk
528  this.bunky[radek][i] = "";
529  }
530  }
531  } // public void posunRadek()
532 
533  /**
534  * Metoda pro překreslení tabulky
535  */
536  private void prekresliTabulku()
537  {
538  // nastavení rozměrů skrolované oblasti
539  this.setMinimumSize(new Dimension(this.sirkaPlatna,this.vyskaPlatna));
540  this.setPreferredSize(new Dimension(this.sirkaPlatna,this.vyskaPlatna));
541  this.setSize(this.sirkaPlatna,this.vyskaPlatna);
542  this.revalidate(); // vyhodnocení rozměrů
543  this.repaint(); // překreslení
544  }
545 
546  /**
547  * Metoda pro vykreslení tabulky
548  *
549  * @param g Grafický objekt
550  */
551  public void paintComponent(Graphics g)
552  {
553  int zacatek; // pomocná proměnná
554  if (this.prvniHlavicka)
555  { // pokud je 1. sloupec hlavička
556  zacatek = 1;
557  }
558  else
559  { // pokud 1. sloupec není hlavička
560  zacatek = 0;
561  }
562  int konec; // pomocná proměnná
563  if (this.posledniJiny)
564  { // pokud je poslední sloupec jiný
565  konec = this.pocetSloupcu - 1;
566  }
567  else
568  { // pokud poslední sloupec není jiný
569  konec = this.pocetSloupcu;
570  }
571  super.paintComponent(g);
572  Graphics2D g2 = (Graphics2D)g; // přetypování na vylepšenou grafiku
573  int invariant1 = 5 + 2 * this.ohraniceni - this.okrajeBunky; // invariant cyklu
574  int invariant1P = 5 + 2 * this.ohraniceni - this.okrajeBunky
575  + zacatek * (this.sirkaPrvniho - this.sirkaBunky); // invariant cyklu
576  // 2. invariant cyklu (šířka/výška okrajů v buňce)
577  int invariant2 = 2 * this.okrajeBunky;
578  // 3. invariant cyklu (šířka buňky bez okrajů včetně ohraničení)
579  int invariant3 = this.sirkaBunky + this.ohraniceni;
580  // 4. invariant cyklu (výška buňky bez okrajů včetně ohraničení)
581  int invariant4 = this.vyskaBunky + this.ohraniceni;
582  // 5. invariant cyklu (šířka buňky včetně okrajů a ohraničení)
583  int invariant5 = this.sirkaBunky + this.ohraniceni + invariant2;
584  // 6. invariant cyklu (výška buňky včetně okrajů a ohraničení)
585  int invariant6 = this.vyskaBunky + this.ohraniceni + invariant2;
586  for (int i = 0; i < this.pocetRadku; i++)
587  { // vykreslení jednotlivých řádků tabulky
588  for (int j = zacatek; j < konec; j++)
589  { // vykreslení jednotlivých buněk v řádku tabulky
590  // vykreslí pozadí buňky
591  g2.setColor(this.barvyBunek[i][j][1]);
592  g2.fillRect(invariant1P + this.okrajeBunky + j * invariant5,
593  invariant1 + this.okrajeBunky + i * invariant6,
594  this.sirkaBunky + invariant2,
595  this.vyskaBunky + invariant2);
596  // vykreslí obsah buňky
597  g2.setColor(this.barvyBunek[i][j][0]);
598  g2.drawString(this.bunky[i][j],
599  invariant1P + (j + 1) * invariant2 + j * invariant3,
600  invariant1 + (i + 1) * invariant2 + i * invariant4 + this.vyskaBunky);
601  }
602  } // vykreslení jednotlivých řádků tabulky
603  if (this.prvniHlavicka)
604  { // pokud je 1. sloupec hlavička, vykreslí jej
605  for (int i = 0; i < this.pocetRadku; i++)
606  {
607  // vykreslí pozadí buňky
608  g2.setColor(this.barvyBunek[i][0][1]);
609  g2.fillRect(invariant1 + this.okrajeBunky,
610  invariant1 + this.okrajeBunky + i * invariant6,
611  this.sirkaPrvniho + invariant2,
612  this.vyskaBunky + invariant2);
613  // vykreslí obsah buňky
614  g2.setColor(this.barvyBunek[i][0][0]);
615  g2.drawString(this.bunky[i][0],
616  invariant1 + invariant2,
617  invariant1 + (i + 1) * invariant2 + i * invariant4 + this.vyskaBunky);
618 
619  }
620  } // pokud je 1. sloupec hlavička, vykreslí jej
621  if (this.posledniJiny)
622  { // pokud je poslední sloupec jiný, vykreslí jej
623  for (int i = 0; i < this.pocetRadku; i++)
624  { // procházení řádků
625  // vykreslí pozadí buňky
626  g2.setColor(this.barvyBunek[i][konec][1]);
627  g2.fillRect(invariant1P + this.okrajeBunky + konec * invariant5,
628  invariant1 + this.okrajeBunky + i * invariant6,
629  this.sirkaPosledniho + invariant2,
630  this.vyskaBunky + invariant2);
631  // vykreslí obsah buňky
632  g2.setColor(this.barvyBunek[i][konec][0]);
633  g2.drawString(this.bunky[i][konec],
634  invariant1P + (konec + 1) * invariant2 + konec * invariant3,
635  invariant1 + (i + 1) * invariant2 + i * invariant4 + this.vyskaBunky);
636  } // procházení řádků
637  } // pokud je poslední sloupec jiný, vykreslí jej
638 
639  if (this.ohraniceni > 0)
640  { // pokud má tabulka ohraničení
641  g2.setColor(new Color(0,0,0)); // ohraničení tabulky bude černé
642  g2.setStroke(new BasicStroke(this.ohraniceni * 2)); // dvojnásobná tloušťka čáry
643  // vykreslí ohraničení celé tabulky
644  g2.drawRect(5 + this.ohraniceni,
645  5 + this.ohraniceni,
646  this.sirkaPlatna - 10 - 2 * this.ohraniceni,
647  this.vyskaPlatna - 10 - 2 * this.ohraniceni);
648  g2.setStroke(new BasicStroke(this.ohraniceni)); // nastaví tloušťku čáry
649 
650  invariant1 = 5 + 2 * this.ohraniceni; // invariant cyklu
651  invariant1P = 5 + 2 * this.ohraniceni + zacatek * (this.sirkaPrvniho - this.sirkaBunky); // invariant cyklu
652  if (this.ohraniceni > 1)
653  { // pokud je třeba posun na střed čáry
654  invariant1 -= this.ohraniceni / 2;
655  invariant1P -= this.ohraniceni / 2;
656  }
657  // 2. invariant cyklu (mezera mezi čarami)
658  invariant2 = 2 * this.okrajeBunky + this.vyskaBunky + this.ohraniceni;
659  // 3. invariant cyklu (x-ová souřadnice konce čáry)
660  invariant3 = this.sirkaPlatna - 5 - 2 * this.ohraniceni;
661  for (int i = 1; i < this.pocetRadku; i++)
662  { // vykreslí čáry mezi řádky
663  g2.drawLine(invariant1,
664  invariant1 + i * invariant2,
665  invariant3,
666  invariant1 + i * invariant2);
667  }
668  // 2. invariant cyklu (mezera mezi čarami)
669  invariant2 = 2 * this.okrajeBunky + this.sirkaBunky + this.ohraniceni;
670  // 3. invariant cyklu (y-ová souřadnice konce čáry)
671  invariant3 = this.vyskaPlatna - 5 - 2 * this.ohraniceni;
672  for (int i = 1 + zacatek; i < this.pocetSloupcu; i++)
673  { // vykreslí čáry mezi sloupci
674  g2.drawLine(invariant1P + i * invariant2,
675  invariant1,
676  invariant1P + i * invariant2,
677  invariant3);
678  }
679  if (this.prvniHlavicka)
680  { // pokud je 1. sloupec hlavička, vykreslí jeho oddělení od zbytku tabulky
681  g2.drawLine(invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho + this.ohraniceni,
682  invariant1,
683  invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho + this.ohraniceni,
684  invariant3);
685  g2.drawLine(invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho - this.ohraniceni,
686  invariant1,
687  invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho - this.ohraniceni,
688  invariant3);
689  }
690  } // pokud má tabulka ohraničení
691  } // public void paintComponent()
692 
693  /**
694  * Metoda pro zjištění aktuálního obsahu buňky
695  *
696  * @param radek Řádek, na kterém se buňka nachází
697  * @param sloupec Sloupec, na kterém se buňka nachází
698  * @return Vrací obsah požadované buňky
699  */
700  public String vratObsah(int radek, int sloupec)
701  {
702  return this.bunky[radek][sloupec];
703  }
704 
705  /**
706  * Metoda pro zjištění aktuální barvy buňky
707  *
708  * @param radek Řádek, na kterém se buňka nachází
709  * @param sloupec Sloupec, na kterém se buňka nachází
710  * @param pismoPozadi 0 - barva písma v buňce
711  * 1 - barva pozadí buňky
712  * @return Vrací požadovanou barvu
713  */
714  public Color vratBarvu(int radek, int sloupec,int pismoPozadi)
715  {
716  return this.barvyBunek[radek][sloupec][pismoPozadi];
717  }
718 
719  /**
720  * Metoda pro zjištění počtu řádků tabulky
721  *
722  * @return Vrací počet řádků tabulky
723  */
725  {
726  return this.pocetRadku;
727  }
728 
729  /**
730  * Metoda pro zjištění počtu sloupců tabulky
731  *
732  * @return Vrací počet sloupců tabulky
733  */
735  {
736  return this.pocetSloupcu;
737  }
738 
739  /**
740  * Metoda pro zjištění zobrazované oblasti ve skrolovacím panelu
741  *
742  * @return Vrací rozměry oblasti s tabulkou
743  */
745  return new Dimension(this.sirkaPlatna,this.vyskaPlatna);
746  }
747 
748  /**
749  * Metoda pro nastavení jednotky skrolování
750  *
751  * @param visibleRect Viditelný obdélník
752  * @param orientation Orientace
753  * @param direction Směr
754  * @return Vrací jednotku skrolování
755  */
756  public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation,
757  int direction) {
758  return this.sirkaBunky + this.ohraniceni + 2 * this.okrajeBunky;
759  }
760 
761  /**
762  * Metoda pro nastavení bloku skrolování
763  *
764  * @param visibleRect Viditelný obdélník
765  * @param orientation Orientace
766  * @param direction Směr
767  * @return Vrací jednotku skrolování
768  */
769  public int getScrollableBlockIncrement(Rectangle visibleRect,
770  int orientation, int direction) {
771  return 5 * (this.sirkaBunky + this.ohraniceni + 2 * this.okrajeBunky);
772  }
773 
774  /**
775  * Metoda pro získání šířky pohledu skrolovací stopy
776  *
777  * @return Vrací šířku pohledu skrolovací stopy
778  */
780  return false;
781  }
782 
783  /**
784  * Metoda pro získání výšky pohledu skrolovací stopy
785  *
786  * @return Vrací výšku pohledu skrolovací stopy
787  */
789  return false;
790  }
791 } // public class Tabulka
792 
793 /*** Konec souboru Tabulka.java ***/
Tabulka(int radky, int sloupce, int ohraniceniTabuky, int okrajeBunkyTab, Color barvaPozadiTab, Color barvaPismaTab, boolean prvniHlavickaTab, boolean posledniSlJiny)
Definition: Tabulka.java:152
void posunRadek(int radek, int smer, int pocet)
Definition: Tabulka.java:507
static final int POSUN_VPRAVO
Definition: Tabulka.java:137
String [][] bunky
Definition: Tabulka.java:69
void vyprazdniTabulku(boolean vcetnePrvniho)
Definition: Tabulka.java:207
void zmenRozmery(int novyPocetRadku, int novyPocetSloupcu)
Definition: Tabulka.java:410
static final int POSUN_VLEVO
Definition: Tabulka.java:133
Dimension getPreferredScrollableViewportSize()
Definition: Tabulka.java:744
Color vratBarvu(int radek, int sloupec, int pismoPozadi)
Definition: Tabulka.java:714
boolean getScrollableTracksViewportWidth()
Definition: Tabulka.java:779
int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction)
Definition: Tabulka.java:769
void nastavBarvu(int radek, int sloupec, Color barvaPozadiB, Color barvaPismaB)
Definition: Tabulka.java:323
int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction)
Definition: Tabulka.java:756
void nastavObsah(int radek, int sloupec, String hodnota)
Definition: Tabulka.java:255
Color [][][] barvyBunek
Definition: Tabulka.java:75
boolean getScrollableTracksViewportHeight()
Definition: Tabulka.java:788
Třída pro vytvoření tabulky se záhlavími řádků
Definition: Tabulka.java:52
String vratObsah(int radek, int sloupec)
Definition: Tabulka.java:700
FontMetrics metrikaFontu
Definition: Tabulka.java:111
void paintComponent(Graphics g)
Definition: Tabulka.java:551