26 package boyermooredemo;
28 import java.awt.BasicStroke;
29 import java.awt.Color;
30 import java.awt.Dimension;
32 import java.awt.FontMetrics;
33 import java.awt.Graphics;
34 import java.awt.Graphics2D;
35 import java.awt.Rectangle;
37 import javax.swing.JPanel;
38 import javax.swing.Scrollable;
52 public class Tabulka extends JPanel implements Scrollable {
152 public Tabulka (
int radky,
int sloupce,
int ohraniceniTabuky,
int okrajeBunkyTab,
153 Color barvaPozadiTab, Color barvaPismaTab,
154 boolean prvniHlavickaTab,
boolean posledniSlJiny)
156 this.setDoubleBuffered(
true);
157 this.ohraniceni = ohraniceniTabuky;
158 this.barvaPozadi = barvaPozadiTab;
159 this.barvaPisma = barvaPismaTab;
160 this.okrajeBunky = okrajeBunkyTab;
161 this.prvniHlavicka = prvniHlavickaTab;
162 this.posledniJiny = posledniSlJiny;
164 this.pocetRadku = radky;
165 this.pocetSloupcu = sloupce;
167 this.setFont(
new Font(
"Arial",Font.PLAIN,12));
168 this.metrikaFontu = this.getFontMetrics(this.getFont());
169 if (prvniHlavickaTab)
176 this.sirkaPlatna = 10;
177 this.vyskaPlatna = 10;
179 this.vyskaBunky = this.metrikaFontu.getMaxAscent();
181 this.bunky =
new String[radky][sloupce];
182 this.barvyBunek =
new Color[radky][sloupce][2];
184 for (
int i = 0; i < radky; i++)
186 for (
int j = 0; j < sloupce; j++)
188 this.bunky[i][j] =
"";
189 this.barvyBunek[i][j][0] = barvaPismaTab;
190 this.barvyBunek[i][j][1] = barvaPozadiTab;
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;
213 if (this.prvniHlavicka)
215 this.sirkaPrvniho = this.sirkaPrazdneho + 2 * this.
ohraniceni;
233 this.bunky[i][j] =
"";
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;
258 int porovnavanaSirka;
259 if (this.prvniHlavicka && sloupec == 0)
263 else if (this.posledniJiny && sloupec == (this.pocetSloupcu - 1))
271 this.bunky[radek][sloupec] = hodnota;
272 if (hodnota.length() > 0)
274 sirkaObsahu = metrikaFontu.stringWidth(hodnota);
280 if (sirkaObsahu > porovnavanaSirka)
282 if (this.prvniHlavicka && sloupec == 0)
284 this.sirkaPrvniho = sirkaObsahu;
288 else if (this.posledniJiny && sloupec == (this.pocetSloupcu - 1))
290 this.sirkaPosledniho = sirkaObsahu;
294 this.sirkaBunky = sirkaObsahu;
295 if (!this.prvniHlavicka)
297 this.sirkaPrvniho = sirkaObsahu;
299 if (!this.posledniJiny)
301 this.sirkaPosledniho = sirkaObsahu;
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;
323 public void nastavBarvu(
int radek,
int sloupec, Color barvaPozadiB, Color barvaPismaB)
325 this.barvyBunek[radek][sloupec][0] = barvaPismaB;
326 this.barvyBunek[radek][sloupec][1] = barvaPozadiB;
339 if (this.prvniHlavicka)
344 sirkaObsahu = this.metrikaFontu.stringWidth(bunky[i][0]);
345 if (sirkaObsahu > minSirka)
347 minSirka = sirkaObsahu;
350 this.sirkaPrvniho = minSirka;
359 if (this.posledniJiny)
364 sirkaObsahu = this.metrikaFontu.stringWidth(bunky[i][konec]);
365 if (sirkaObsahu > minSirka)
367 minSirka = sirkaObsahu;
370 this.sirkaPosledniho = minSirka;
375 for (
int j = zacatek; j < konec; j++)
377 sirkaObsahu = this.metrikaFontu.stringWidth(bunky[i][j]);
378 if (sirkaObsahu > minSirka)
380 minSirka = sirkaObsahu;
384 this.sirkaBunky = minSirka;
385 if (!this.prvniHlavicka)
387 this.sirkaPrvniho = minSirka;
389 if (!this.posledniJiny)
391 this.sirkaPosledniho = minSirka;
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;
410 public void zmenRozmery (
int novyPocetRadku,
int novyPocetSloupcu)
412 String[][] noveBunky;
413 Color[][][] noveBarvyBunek;
415 if (novyPocetRadku > this.pocetRadku)
418 noveBunky =
new String[novyPocetRadku][this.
pocetSloupcu];
420 noveBarvyBunek =
new Color[novyPocetRadku][this.
pocetSloupcu][2];
426 noveBunky[i][j] = this.bunky[i][j];
427 noveBarvyBunek[i][j][0] = this.barvyBunek[i][j][0];
428 noveBarvyBunek[i][j][1] = this.barvyBunek[i][j][1];
432 for (
int i = this.pocetRadku; i < novyPocetRadku; i++)
436 this.bunky[i][j] =
"";
441 this.pocetRadku = novyPocetRadku;
443 this.bunky = noveBunky;
444 this.barvyBunek = noveBarvyBunek;
446 else if (novyPocetRadku < this.pocetRadku)
448 this.pocetRadku = novyPocetRadku;
451 if (novyPocetSloupcu > this.pocetSloupcu)
454 noveBunky =
new String[this.
pocetRadku][novyPocetSloupcu];
456 noveBarvyBunek =
new Color[this.
pocetRadku][novyPocetSloupcu][2];
462 noveBunky[i][j] = this.bunky[i][j];
463 noveBarvyBunek[i][j][0] = this.barvyBunek[i][j][0];
464 noveBarvyBunek[i][j][1] = this.barvyBunek[i][j][1];
470 for (
int j = this.pocetSloupcu; j < novyPocetSloupcu; j++)
472 noveBunky[i][j] =
new String(
"");
477 this.pocetSloupcu = novyPocetSloupcu;
479 this.bunky = noveBunky;
480 this.barvyBunek = noveBarvyBunek;
482 else if (novyPocetSloupcu < this.pocetSloupcu)
484 this.pocetSloupcu = novyPocetSloupcu;
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;
509 if (smer == this.POSUN_VLEVO)
511 for (
int i = 0; i < (this.pocetSloupcu - pocet); i++)
513 this.bunky[radek][i] = this.bunky[radek][i+pocet];
515 for (
int i = (this.pocetSloupcu - pocet); i < this.
pocetSloupcu; i++)
517 this.bunky[radek][i] =
"";
522 for (
int i = (this.pocetSloupcu - 1); (i - pocet) >= 0; i--)
524 this.bunky[radek][i] = this.bunky[radek][i-pocet];
526 for (
int i = 0; i < pocet; i++)
528 this.bunky[radek][i] =
"";
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);
554 if (this.prvniHlavicka)
563 if (this.posledniJiny)
565 konec = this.pocetSloupcu - 1;
571 super.paintComponent(g);
572 Graphics2D g2 = (Graphics2D)g;
573 int invariant1 = 5 + 2 * this.ohraniceni - this.
okrajeBunky;
574 int invariant1P = 5 + 2 * this.ohraniceni - this.okrajeBunky
575 + zacatek * (this.sirkaPrvniho - this.
sirkaBunky);
579 int invariant3 = this.sirkaBunky + this.
ohraniceni;
581 int invariant4 = this.vyskaBunky + this.
ohraniceni;
583 int invariant5 = this.sirkaBunky + this.ohraniceni + invariant2;
585 int invariant6 = this.vyskaBunky + this.ohraniceni + invariant2;
588 for (
int j = zacatek; j < konec; j++)
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);
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);
603 if (this.prvniHlavicka)
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);
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);
621 if (this.posledniJiny)
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);
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);
639 if (this.ohraniceni > 0)
641 g2.setColor(
new Color(0,0,0));
642 g2.setStroke(
new BasicStroke(this.ohraniceni * 2));
644 g2.drawRect(5 + this.ohraniceni,
646 this.sirkaPlatna - 10 - 2 * this.ohraniceni,
647 this.vyskaPlatna - 10 - 2 * this.ohraniceni);
648 g2.setStroke(
new BasicStroke(this.ohraniceni));
651 invariant1P = 5 + 2 * this.ohraniceni + zacatek * (this.sirkaPrvniho - this.
sirkaBunky);
652 if (this.ohraniceni > 1)
654 invariant1 -= this.ohraniceni / 2;
655 invariant1P -= this.ohraniceni / 2;
658 invariant2 = 2 * this.okrajeBunky + this.vyskaBunky + this.
ohraniceni;
660 invariant3 = this.sirkaPlatna - 5 - 2 * this.
ohraniceni;
663 g2.drawLine(invariant1,
664 invariant1 + i * invariant2,
666 invariant1 + i * invariant2);
669 invariant2 = 2 * this.okrajeBunky + this.sirkaBunky + this.
ohraniceni;
671 invariant3 = this.vyskaPlatna - 5 - 2 * this.
ohraniceni;
674 g2.drawLine(invariant1P + i * invariant2,
676 invariant1P + i * invariant2,
679 if (this.prvniHlavicka)
681 g2.drawLine(invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho + this.ohraniceni,
683 invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho + this.ohraniceni,
685 g2.drawLine(invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho - this.ohraniceni,
687 invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho - this.ohraniceni,
702 return this.bunky[radek][sloupec];
714 public Color
vratBarvu(
int radek,
int sloupec,
int pismoPozadi)
716 return this.barvyBunek[radek][sloupec][pismoPozadi];
745 return new Dimension(this.sirkaPlatna,this.vyskaPlatna);
758 return this.sirkaBunky + this.ohraniceni + 2 * this.
okrajeBunky;
770 int orientation,
int direction) {
771 return 5 * (this.sirkaBunky + this.ohraniceni + 2 * this.
okrajeBunky);
Tabulka(int radky, int sloupce, int ohraniceniTabuky, int okrajeBunkyTab, Color barvaPozadiTab, Color barvaPismaTab, boolean prvniHlavickaTab, boolean posledniSlJiny)
void posunRadek(int radek, int smer, int pocet)
int vratPocetSloupcuTabulky()
static final int POSUN_VPRAVO
void vyprazdniTabulku(boolean vcetnePrvniho)
void zmenRozmery(int novyPocetRadku, int novyPocetSloupcu)
static final int POSUN_VLEVO
int vratPocetRadkuTabulky()
Dimension getPreferredScrollableViewportSize()
Color vratBarvu(int radek, int sloupec, int pismoPozadi)
boolean getScrollableTracksViewportWidth()
int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction)
void nastavBarvu(int radek, int sloupec, Color barvaPozadiB, Color barvaPismaB)
int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction)
void nastavObsah(int radek, int sloupec, String hodnota)
boolean getScrollableTracksViewportHeight()
Třída pro vytvoření tabulky se záhlavími řádků
String vratObsah(int radek, int sloupec)
void paintComponent(Graphics g)