25 package boyermooredemo;
27 import java.awt.Color;
28 import java.awt.Component;
29 import java.awt.Dimension;
31 import java.awt.Rectangle;
33 import java.awt.event.MouseAdapter;
34 import java.awt.event.MouseEvent;
36 import java.util.ArrayList;
37 import java.util.ListIterator;
39 import javax.swing.BorderFactory;
40 import javax.swing.JFrame;
41 import javax.swing.JButton;
42 import javax.swing.JLabel;
43 import javax.swing.JOptionPane;
44 import javax.swing.JScrollPane;
45 import javax.swing.JTextArea;
46 import javax.swing.JTextField;
47 import javax.swing.SwingConstants;
72 public ArrayList<ZmenaZobrazeni>
prubehViz =
new ArrayList<ZmenaZobrazeni>();
114 0,2,
new Color(255,255,255),
115 new Color(0,0,0),
false,
false);
123 1,4,
new Color(255,255,255),
124 new Color(0,0,0),
true,
true);
132 1,4,
new Color(255,255,255),
133 new Color(0,0,0),
true,
false);
219 this.addWindowListener(
new java.awt.event.WindowAdapter() {
220 public void windowClosing(java.awt.event.WindowEvent e) {
227 }
catch (Exception e) {
231 this.setVisible(
true);
237 public static void main(String[] args) {
248 this.getContentPane().setLayout(null);
250 this.setSize(
new Dimension(964, 720));
251 this.setFont(
new Font(
"Dialog", 1, 12));
255 jLabelNadpis.setText(
"Demonstrace Boyerova-Mooreova algoritmu");
256 jLabelNadpis.setToolTipText(
"null");
257 jLabelNadpis.setFont(
new Font(
"Dialog", 1, 14));
258 jLabelNadpis.setBounds(
new Rectangle(20, 10, 385, 15));
259 jLabelHledanyRetezec.setText(
"Hledaný řetězec:");
260 jLabelHledanyRetezec.setBounds(
new Rectangle(20, 35, 135, 20));
261 jLabelHledanyRetezec.setLabelFor(jTextFieldHledanyRetezec);
262 jTextFieldHledanyRetezec.setBounds(
new Rectangle(140, 35, 305, 20));
263 jLabelProhledavanyText.setText(
"Prohledávaný text:");
264 jLabelProhledavanyText.setBounds(
new Rectangle(20, 60, 140, 20));
265 jScrollPaneProhledavanyText.setBounds(
new Rectangle(20, 80, 425, 65));
266 jTextAreaProhledavanyText.setColumns(20);
267 jTextAreaProhledavanyText.setRows(4);
268 jScrollPaneAlgoritmus.setBounds(
new Rectangle(460, 25, 475, 610));
269 jLabelAlgoritmus.setText(
"Algoritmus:");
270 jLabelAlgoritmus.setBounds(
new Rectangle(460, 5, 135, 20));
271 jScrollPaneTabulkaSR.setBounds(
new Rectangle(20, 155, 425, 65));
272 jScrollPaneTabulkaDelta1.setBounds(
new Rectangle(20, 245, 425, 75));
273 jScrollPaneTabulkaDelta2.setBounds(
new Rectangle(20, 345, 425, 120));
274 jLabelTabulkaDelta1.setText(
"Tabulka delta1 (CharJump):");
275 jLabelTabulkaDelta2.setText(
"Tabulka delta2 (MatchJump):");
276 jLabelTabulkaDelta1.setBounds(
new Rectangle(20, 225, 225, 20));
277 jLabelTabulkaDelta2.setBounds(
new Rectangle(20, 325, 225, 20));
278 jButtonZpet.setText(
"Zpět");
279 jButtonZpet.setBounds(
new Rectangle(25, 525, 70, 25));
280 jButtonVpred.setText(
"Vpřed");
281 jButtonVpred.setBounds(
new Rectangle(110, 525, 90, 25));
283 jButtonReset.setText(
"Reset");
284 jButtonReset.setBounds(
new Rectangle(365, 525, 75, 25));
285 jLabelNapoveda.setText(
"Nápověda:");
286 jLabelNapoveda.setBounds(
new Rectangle(25, 550, 75, 20));
287 jScrollPaneNapoveda.setBounds(
new Rectangle(25, 570, 420, 95));
288 jLabelLegenda.setText(
"Legenda:");
289 jLabelLegenda.setBounds(
new Rectangle(465, 640, 80, 20));
290 jLabelLegenda.setFont(
new Font(
"Dialog", 1, 12));
291 jLabeli.setText(
"i = ");
292 jLabeli.setBounds(
new Rectangle(100, 470, 25, 20));
293 jLabelj.setBounds(
new Rectangle(170, 470, 25, 20));
294 jLabelj.setText(
"j = ");
295 jTextFieldi.setBounds(
new Rectangle(125, 470, 35, 20));
296 jTextFieldi.setBackground(
new Color(99, 255, 99));
297 jTextFieldj.setBounds(
new Rectangle(195, 470, 35, 20));
298 jTextFieldj.setBackground(
new Color(115, 255, 255));
299 jLabelm.setText(
"m = ");
300 jLabelm.setBounds(
new Rectangle(25, 470, 40, 20));
301 jLabelm.setToolTipText(
"Délka hledaného řetězce");
302 jTextFieldm.setBounds(
new Rectangle(55, 470, 35, 20));
303 jTextFieldm.setToolTipText(
"Délka hledaného řetězce");
304 jTextFieldm.setBackground(Color.white);
305 jLabelmj.setText(
"m-j+1 = ");
306 jLabelmj.setBounds(
new Rectangle(332, 470, 65, 20));
307 jTextFieldmj.setBounds(
new Rectangle(395, 470, 35, 20));
308 jTextFieldmj.setBackground(
new Color(255, 165, 165));
309 jLabelij.setText(
"i-j+1 = ");
310 jLabelij.setBounds(
new Rectangle(240, 470, 55, 20));
311 jTextFieldij.setBounds(
new Rectangle(290, 470, 35, 20));
312 jTextFieldij.setBackground(
new Color(255, 255, 66));
313 jLabeln.setText(
"n = ");
314 jLabeln.setBounds(
new Rectangle(25, 495, 30, 20));
315 jLabeln.setToolTipText(
"Délka prohledávaného textu");
316 jTextFieldn.setBounds(
new Rectangle(55, 495, 35, 20));
317 jTextFieldn.setToolTipText(
"Délka prohledávaného textu");
318 jTextFieldn.setBackground(Color.white);
319 jLabels.setText(
"s = ");
320 jLabels.setBounds(
new Rectangle(100, 495, 25, 20));
321 jTextFields.setBounds(
new Rectangle(125, 495, 35, 20));
322 jTextFields.setBackground(
new Color(255, 165, 214));
323 jLabelt.setText(
"t = ");
324 jLabelt.setBounds(
new Rectangle(170, 495, 25, 20));
325 jTextFieldt.setBounds(
new Rectangle(195, 495, 35, 20));
326 jTextFieldt.setBackground(
new Color(198, 198, 255));
327 jLabelL.setText(
" L = ");
328 jLabelL.setBounds(
new Rectangle(245, 495, 50, 20));
329 jTextFieldL.setBounds(
new Rectangle(290, 495, 35, 20));
330 jTextFieldL.setBackground(
new Color(255, 222, 214));
331 jLabelpoz.setText(
"poz = ");
332 jLabelpoz.setBounds(
new Rectangle(350, 495, 45, 20));
333 jLabelpoz.setToolTipText(
"Pozice hledaného řetězce v textu");
334 jTextFieldpoz.setBounds(
new Rectangle(395, 495, 35, 20));
335 jTextFieldpoz.setBackground(
new Color(255, 181, 99));
336 jTextFieldpoz.setToolTipText(
"Pozice hledaného řetězce v textu");
337 jLabelPocitadloKroku.setBounds(
new Rectangle(210, 525, 115, 25));
338 jLabelPocitadloKroku.setHorizontalAlignment(SwingConstants.CENTER);
339 jLabelPocitadloKroku.setToolTipText(
"null");
340 jLabel1LegendaZvyrazneny.setText(
"Zvýraznění naposledy provedeného řádku zdrojového kódu");
341 jLabel1LegendaZvyrazneny.setBounds(
new Rectangle(555, 640, 370, 20));
342 jLabel1LegendaZvyrazneny.setFont(
new Font(
"Dialog", 0, 10));
343 jTextFieldLegendaZvyrazneny.setBounds(
new Rectangle(535, 645, 15, 10));
345 jTextFieldLegendaZvyrazneny.setEditable(
false);
348 jButtonVpred.addMouseListener(
new MouseAdapter() {
349 public void mouseClicked(MouseEvent e)
355 jButtonZpet.addMouseListener(
new MouseAdapter() {
356 public void mouseClicked(MouseEvent e)
362 jButtonReset.addMouseListener(
new MouseAdapter() {
363 public void mouseClicked(MouseEvent e)
386 barevnyTextPaneAlgoritmus.setEditable(
false);
392 jTextAreaNapoveda.setEditable(
false);
396 zobrazenaNapoveda = 0;
399 jTextFieldm.setEditable(
false);
400 jTextFieldn.setEditable(
false);
401 jTextFieldi.setEditable(
false);
402 jTextFieldj.setEditable(
false);
403 jTextFieldij.setEditable(
false);
404 jTextFieldmj.setEditable(
false);
405 jTextFields.setEditable(
false);
406 jTextFieldt.setEditable(
false);
407 jTextFieldL.setEditable(
false);
408 jTextFieldpoz.setEditable(
false);
411 jTextFieldm.setBorder(BorderFactory.createLineBorder(
new Color(148,148,148), 1));
412 jTextFieldn.setBorder(BorderFactory.createLineBorder(
new Color(148,148,148), 1));
413 jTextFieldi.setBorder(BorderFactory.createLineBorder(
new Color(148,148,148), 1));
414 jTextFieldj.setBorder(BorderFactory.createLineBorder(
new Color(148,148,148), 1));
415 jTextFieldij.setBorder(BorderFactory.createLineBorder(
new Color(148,148,148), 1));
416 jTextFieldmj.setBorder(BorderFactory.createLineBorder(
new Color(148,148,148), 1));
417 jTextFields.setBorder(BorderFactory.createLineBorder(
new Color(148,148,148), 1));
418 jTextFieldt.setBorder(BorderFactory.createLineBorder(
new Color(148,148,148), 1));
419 jTextFieldL.setBorder(BorderFactory.createLineBorder(
new Color(148,148,148), 1));
420 jTextFieldpoz.setBorder(BorderFactory.createLineBorder(
new Color(148,148,148), 1));
424 jScrollPaneTabulkaSR.setViewportView(tabulkaSR);
425 jScrollPaneTabulkaDelta1.setViewportView(tabulkaDelta1);
426 jScrollPaneTabulkaDelta2.setViewportView(tabulkaDelta2);
427 jScrollPaneAlgoritmus.setViewportView(barevnyTextPaneAlgoritmus);
428 jScrollPaneNapoveda.setViewportView(jTextAreaNapoveda);
429 jScrollPaneProhledavanyText.setViewportView(jTextAreaProhledavanyText);
432 this.getContentPane().add(jTextFieldLegendaZvyrazneny, null);
433 this.getContentPane().add(jLabel1LegendaZvyrazneny, null);
434 this.getContentPane().add(jLabelPocitadloKroku, null);
435 this.getContentPane().add(jTextFieldpoz, null);
436 this.getContentPane().add(jLabelpoz, null);
437 this.getContentPane().add(jTextFieldL, null);
438 this.getContentPane().add(jLabelL, null);
439 this.getContentPane().add(jTextFieldt, null);
440 this.getContentPane().add(jLabelt, null);
441 this.getContentPane().add(jTextFields, null);
442 this.getContentPane().add(jLabels, null);
443 this.getContentPane().add(jTextFieldn, null);
444 this.getContentPane().add(jLabeln, null);
445 this.getContentPane().add(jTextFieldij, null);
446 this.getContentPane().add(jLabelij, null);
447 this.getContentPane().add(jTextFieldmj, null);
448 this.getContentPane().add(jLabelmj, null);
449 this.getContentPane().add(jTextFieldm, null);
450 this.getContentPane().add(jLabelm, null);
451 this.getContentPane().add(jTextFieldj, null);
452 this.getContentPane().add(jTextFieldi, null);
453 this.getContentPane().add(jLabelj, null);
454 this.getContentPane().add(jLabeli, null);
455 this.getContentPane().add(jLabelLegenda, null);
456 this.getContentPane().add(jScrollPaneNapoveda, null);
457 this.getContentPane().add(jLabelNapoveda, null);
458 this.getContentPane().add(jButtonReset, null);
459 this.getContentPane().add(jButtonVpred, null);
460 this.getContentPane().add(jButtonZpet, null);
461 this.getContentPane().add(jLabelTabulkaDelta1, null);
462 this.getContentPane().add(jLabelTabulkaDelta2, null);
463 this.getContentPane().add(jScrollPaneTabulkaSR, null);
464 this.getContentPane().add(jLabelAlgoritmus, null);
465 this.getContentPane().add(jScrollPaneAlgoritmus, null);
466 this.getContentPane().add(jScrollPaneProhledavanyText, null);
467 this.getContentPane().add(jLabelProhledavanyText, null);
468 this.getContentPane().add(jTextFieldHledanyRetezec, null);
469 this.getContentPane().add(jLabelHledanyRetezec, null);
470 this.getContentPane().add(jLabelNadpis);
471 this.getContentPane().add(jScrollPaneTabulkaDelta1, null);
472 this.getContentPane().add(jScrollPaneTabulkaDelta2, null);
475 jButtonZpet.setEnabled(
false);
484 if (e.getButton()==e.BUTTON1 && ((Component)e.getSource()).isEnabled())
488 if (jTextFieldHledanyRetezec.getText().length() < 1)
490 JOptionPane.showMessageDialog(
this,
"Nebyl zadán hledaný řetězec",
491 "Chyba",JOptionPane.ERROR_MESSAGE);
494 if (jTextAreaProhledavanyText.getText().length() < 1)
496 JOptionPane.showMessageDialog(
this,
"Nebyl zadán prohledávaný text",
497 "Chyba",JOptionPane.ERROR_MESSAGE);
502 jTextFieldHledanyRetezec.setEditable(
false);
503 jTextAreaProhledavanyText.setEditable(
false);
513 algBMA.
BMA(jTextFieldHledanyRetezec.getText(),jTextAreaProhledavanyText.getText());
515 iteratorViz = prubehViz.listIterator();
518 jLabelPocitadloKroku.setText(
"krok 1 z " + pocetKroku);
521 zobrazenaNapoveda = 1;
522 jTextAreaNapoveda.setText(kon.
textyNapovedy[zobrazenaNapoveda]);
531 if (aktKrok < pocetKroku)
535 if (aktKrok >= pocetKroku)
537 jButtonVpred.setEnabled(
false);
540 jButtonZpet.setEnabled(
true);
544 jButtonVpred.setEnabled(
false);
556 if (e.getButton()==e.BUTTON1 && ((Component)e.getSource()).isEnabled())
564 jButtonZpet.setEnabled(
false);
567 jButtonVpred.setEnabled(
true);
571 jButtonZpet.setEnabled(
false);
582 if (e.getButton()==e.BUTTON1 && ((Component)e.getSource()).isEnabled())
585 jButtonZpet.setEnabled(
false);
586 jButtonVpred.setEnabled(
true);
590 this.jLabelPocitadloKroku.setText(
"");
592 this.prubehViz =
new ArrayList<ZmenaZobrazeni>();
610 zobrazenaNapoveda = 0;
621 jTextFieldm.setText(
"");
622 jTextFieldn.setText(
"");
623 jTextFieldi.setText(
"");
624 jTextFieldj.setText(
"");
625 jTextFieldij.setText(
"");
626 jTextFieldmj.setText(
"");
627 jTextFields.setText(
"");
628 jTextFieldt.setText(
"");
629 jTextFieldL.setText(
"");
630 jTextFieldpoz.setText(
"");
632 jTextFieldHledanyRetezec.setEditable(
true);
633 jTextAreaProhledavanyText.setEditable(
true);
647 this.zobrazenyBlokAlgoritmu = 0;
665 new Color(255,255,255),
668 this.zobrazenyBlokAlgoritmu = cislo;
685 for (
int i = zacatek; i <= konec; i++)
695 for (
int i = zacatek; i <= konec; i++)
700 zvyraznenyRadek = cislo;
712 pomI = Integer.valueOf(hodnota);
729 this.jTextFieldm.setText(hodnota);
731 else if (cislo == kon.
PROM_N)
733 this.jTextFieldn.setText(hodnota);
735 else if (cislo == kon.
PROM_I)
737 this.jTextFieldi.setText(hodnota);
739 else if (cislo == kon.
PROM_J)
741 this.jTextFieldj.setText(hodnota);
745 this.jTextFieldij.setText(hodnota);
749 this.jTextFieldmj.setText(hodnota);
751 else if (cislo == kon.
PROM_S)
753 this.jTextFields.setText(hodnota);
755 else if (cislo == kon.
PROM_T)
757 this.jTextFieldt.setText(hodnota);
759 else if (cislo == kon.
PROM_L)
761 this.jTextFieldL.setText(hodnota);
765 this.jTextFieldpoz.setText(hodnota);
780 return jTextFieldm.getText();
782 else if (cislo == kon.
PROM_N)
784 return jTextFieldn.getText();
786 else if (cislo == kon.
PROM_I)
788 return jTextFieldi.getText();
790 else if (cislo == kon.
PROM_J)
792 return jTextFieldj.getText();
796 return jTextFieldij.getText();
800 return jTextFieldmj.getText();
802 else if (cislo == kon.
PROM_S)
804 return jTextFields.getText();
806 else if (cislo == kon.
PROM_T)
808 return jTextFieldt.getText();
810 else if (cislo == kon.
PROM_L)
812 return jTextFieldL.getText();
816 return jTextFieldpoz.getText();
827 boolean konec =
false;
832 jLabelPocitadloKroku.setText(
"krok " + aktKrok +
" / " + pocetKroku);
834 if (!iteratorViz.hasNext())
956 zobrazenaNapoveda = zmena.
cislo;
981 if (iteratorViz.hasNext())
1004 boolean konec =
false;
1006 if (!iteratorViz.hasPrevious())
1014 while (!konec && zmena.
cisloKroku == aktKrok)
1133 if (iteratorViz.hasPrevious())
1152 jLabelPocitadloKroku.setText(
"krok " + aktKrok +
" / " + pocetKroku);
static final int ZADNY_RADEK
void jButtonReset_mouseClicked(MouseEvent e)
static final int POPISEK_L
void nastavVychoziBarvu(int cisloUseku)
static final int [] TAB_D2_VR
static final Color BARVA_ZVYRAZNENI_T
void posunRadek(int radek, int smer, int pocet)
int vratPocetSloupcuTabulky()
Vyhledávání v řetězci a tvorba seznamu změn GUI.
static final int [] TAB_D1_VR
static final String TEXTY_POPISKU_MJ
static final int BLOK_DELTA1
static final int POSUN_VPRAVO
static final int PROM_POZ
JScrollPane jScrollPaneProhledavanyText
static final int [] TAB_SR_VR
ArrayList< ZmenaZobrazeni > prubehViz
void vyprazdniTabulku(boolean vcetnePrvniho)
void zmenRozmery(int novyPocetRadku, int novyPocetSloupcu)
static final int POSUN_VLEVO
Applet pro demonstraci BMA, základ projektu.
int BMA(String P, String T)
static final String [] textyAlgoritmu
int vratPocetRadkuTabulky()
static final boolean [] tucneCastiAlgoritmu
static final int [][] blokyAlgoritmu
void pridejText(String vkladanyText, Color barva, Color barvaPozadi, boolean tucnePismo)
static void main(String[] args)
JTextField jTextFieldHledanyRetezec
Textový panel s barevnými bloky textu.
JScrollPane jScrollPaneNapoveda
Color vratBarvu(int radek, int sloupec, int pismoPozadi)
JTextArea jTextAreaNapoveda
JLabel jLabelHledanyRetezec
void nastavBarvu(int cisloUseku, Color barva, Color barvaPozadi)
static final int BLOK_BMA
BarevnyTextPane barevnyTextPaneAlgoritmus
void nastavBarvu(int radek, int sloupec, Color barvaPozadiB, Color barvaPismaB)
int zobrazenyBlokAlgoritmu
String vratObsahPolePromenne(int cislo)
void nastavObsah(int radek, int sloupec, String hodnota)
void jButtonVpred_mouseClicked(MouseEvent e)
static final int [][] radkyAlgoritmu
static final int BLOK_DEKLARACE
JScrollPane jScrollPaneAlgoritmus
static final int POPISEK_MJ
JScrollPane jScrollPaneTabulkaDelta2
static final String [] textyNapovedy
JScrollPane jScrollPaneTabulkaSR
JLabel jLabel1LegendaZvyrazneny
JLabel jLabelPocitadloKroku
static final int POPISEK_IJ
JTextArea jTextAreaProhledavanyText
static final Color [] barvyAlgoritmu
void vypisBlokAlgoritmu(int cislo, boolean vymazat)
JLabel jLabelTabulkaDelta1
JTextField jTextFieldLegendaZvyrazneny
Třída pro vytvoření tabulky se záhlavími řádků
String vratObsah(int radek, int sloupec)
void nastavPolePromenne(int cislo, String hodnota)
Uchování informací o změnách zobrazení při vizualizaci.
JLabel jLabelTabulkaDelta2
void zvyrazniRadek(int cislo)
void jButtonZpet_mouseClicked(MouseEvent e)
static final int BLOK_DELTA2
JScrollPane jScrollPaneTabulkaDelta1
static final Color BARVA_ZVYRAZNENI_P
void nastavPolePromenne(int cislo, int hodnota)
JLabel jLabelProhledavanyText
static final String TEXTY_POPISKU_IMJ
static final String TEXTY_POPISKU_L