Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 36 ] Choď na stránku: 1, 2 ďalšia
AutorSpráva
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok NapísalOffline : 05.06.2015 15:31

Caute, chcem sa spytat znalych, ako sa da nejak normalne pracovat v Jave s oknami, ktore si povytvaram. Pretoze zatial sa mi to javi hodne debilne...

Robim v netbeans 8.0.2

Na porovnanie, kedysi som robil v Delphi a tam to bolo jednoduche:
- spravis si new project a hned mas unit1, kde pises zdrojak, a nejake okno, ktore si mozes editovat
- ak chces mat dalsie okno, das si ho do unit2, ktoru si vytvoris. A ked si ju pridas so "uses" v unit1, tak mas zo zdrojaku pristup k oknu ktore mas v unit2 vytvorene a ku vsetkym jeho prvkom a k ostatnemu zdrojaku a funkciam co tam mas.

Ako toto nejak normalne spravit v jave? Vytvorim si new project, tudiz mi to vytvori subor napr. okno.java, ktory povazujem za daco ako hlavnu class. No neviem ako tam vytorit nejake okno. Cize okno.java je len zdrojak, bez akehokolvek GUI. Potom si vytvorim cez
new file-swing gui forms-application sample form, cize mi pribudne dalsi *.java subor. V zdrojaku co v nom je je sice na konci pekne napisane ze sa to nastavi na setvisible(true), ale nic nevidim, ziadne okno neukaze.

Ako to spravit aby vobec daco ten debo ukazal? uz mam z toho pekne nervy a nerozumiem preco to nejde.
A ako pristupovat z okno.java k veciam co mam v to druhom *.java subore, ktory sa mi vytvoril s oknom?

Chcem mat proste hlavny zdrojak appky v jednom *.java subore a v druhom bude len vytvorene okno, pripadne nejake funkcie okolo neho. A ked budem chciet napr. doplnit nejaky item do comboboxu, tak z prveho "zdrojakoveho" java suboru si zavolam combobox v druhom "oknovom" java subore a pracujem s nim.

Nechcem riesit ziadne konstruktory vsetkycg GUI prvkov, potrebujem si okno pekne wysiwyg nadizajnovat, nie naslepo urcovat kazdej kravine suradnice...

V delphi je to jednouche a ihned funkcne. Tuna ani za boha...ani len okno neukaze...

Vie dakto ako na to?







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Správca fóra
Správca fóra
Ako pracovat v Jave s GUI oknami?

Registrovaný: 08.08.09
Príspevky: 12449
Témy: 39
Príspevok NapísalOffline : 05.06.2015 15:56

Veď keď vytvoríš jFrame, ktorý reprezentuje okno tvojej aplikácie, mal by sa ti dať upravovať v "Design" režime.
kde môžeš wysiwyg umiestňovať jednotlivé prvky (tlačidlá, form,...) či som to nepochopil?

Ako pracovat v Jave s GUI oknami?

Po spustení jFrame.java

Ako pracovat v Jave s GUI oknami?


Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 05.06.2015 16:16

Ano to mi funguje.
Aj ked som to na zaciatku robil kus inac, daval som aj vytvarat main class, a to som asi nemal... :-)
Lebo potom mi main class spustalo nie z toho java suboru, kde som mal vytvorene okno, ale z toho druheho. Cize jasne, ze som okno nevidel.

Ako si popisoval, okno si takto vytvorim. Uz miho zobrazuje a vidim ho. Ale ako sa dostanem z javaaplication20.java na newjframe.java a na pripadne buttony, ktore tam su?
Ako dosiahnem, aby som mohol v javaaplication20 jednoducho napisat nieco ako newjframe.button1.text("blabla") - cize zmenit mu napr. nazov?

Myslim ze musim niekde do javaaplication20 zadeklarovat, aby to nejak vedelo ze ma daco ako newjframe.java a tym padom vedelo zavolat nejaku funkciu co tam mama napr. spravenu, nie?







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 19.05.08
Prihlásený: 23.04.24
Príspevky: 664
Témy: 28
Bydlisko: Slovensko
Príspevok NapísalOffline : 05.06.2015 16:40

No najjednoduchsie to mas tak, ze ako main class oznacis dany JFrame form co bude vlastne hlavne okno aplikacie, s tym ze jeden *.java subor mat pri normalnom GUIku nebudes ... Vsetky veci ako praca s databazou pripadne nejake casovo narocnejsie veci musis riesit vo Workeroch aby to bezalo na separatnom vlakne -> aby ti nezamrzlo GUIko kym sa dana operacia nevykona.

Ked si v danom JFrame forme v netbeanse pridas nejake veci, tak on ti vygeneruje kod k nemu, ktory ty upravovat nemozes, mozes upravovat dane veci iba pomocou toho Designeru kde si nastavis properties daneho Swing componentu.

Kazdy swing komponent ked das nanho pravym a das properties v tabe Code si nastavis VariableName, to bude premenna ktora bude predstavovat dany komponent, ma urcite metody, napriklad ako si chcel pre to nastavenie textu v tlacitku napriklad: buttonAddCustomer.setText("Pridať zákazníka")

Pri buttonoch sa ti vygeneruje metoda s listenerom tak ze nanho v designeri dva krat kliknes, prehodi ta do sourcu kde napises co chces aby to vykonalo.

Pri tabulkach si urob zvlast classu pre dany TableModel(CustomerTableModel()) kde pridas "extends AbstractTableModel" a das implementov vsetky abstraktne metody,
nato aby sa to priradilo k danej tabulke urobis v dizajneri, pravy klik na tabulku -> Table Contents... -> Custom code: kam das nieco ako toto
new CustomerTableModel()
V classe nastavis veci:
metoda getValueAt parametrom su x,y pozicie danej bunky kde vracias Object ktory ma byt v danej bunke.
getRowCount - pocet riadkov tabulky (ak mas vsetky objekty v nejakom liste len "return list.size()" )
getColumnNames - nazvy stlpcov z nejakeho string[] columns si ich mozes povytahovat a nastavit
getColumnCount - return columns.length
Ak budes chciet pridavat do tabulky dalsie zaznamy musis 1. pridat do listu z ktoreho vytahujes 2. oznamit tabulke ze nastala zmena :
list.add(object);
fireTableDataChanged();//vseobecne - prekresli vsetky data, casovo narocnejsie da sa zavolat konkretne fireTableRowsInserted(pozicia-1,pozicia)

Pisem to na rychlo moze byt vela chyb ale aspon zhruba aby si mal predstavu.


Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 05.06.2015 17:23

Dik za vycerpavajuce info.
S javou iba zacinam tak si osahavam nejake zaklady. Takze zatial nejaka praca s db ci tabulkami nehrozi. Mozno casom, potom to zuzitkujem :-)
Dikes.







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 19.05.08
Prihlásený: 23.04.24
Príspevky: 664
Témy: 28
Bydlisko: Slovensko
Príspevok NapísalOffline : 05.06.2015 17:28

Za malicko, este tuto najdes nejake info pokope:
http://kore.fi.muni.cz/wiki/index.php/Kategorie:PV168
Swing 1,2,3 sa ti moze hodit.


Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 05.06.2015 18:45

Diky.
Este sa chcem spytat, ako sa v jave robi s timermi. Z toho co som nasiel som dost mimo, kazdy tam pise inu vec alebo co.
Robim si obycajne hodiny v okne a potrebujem akurat nastavit aby sa to raz za sekundu refreshlo - cize to bude ukazovat presny cas.
Kod pre zobrazenie casu mam a funguje.

No ani za svateho to neviem nejak napchat do timera, aby sa to robilo kazdu sekundu...ani neviem ako ho nastavit aby kazdu sekndu daco robil.
Nasiel som same zlozite navody cez action listenery a podbne...to fakt to nejde nejak jednoducho?

Zatial mam hotove toto:
Kód:
public static void main(String args[]) {
       int second, minute, hour;
       int delay = 1000;
       
        GregorianCalendar time = new GregorianCalendar();
        hour = time.get(Calendar.HOUR);
        minute = time.get(Calendar.MINUTE);
        second = time.get(Calendar.SECOND);
       
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
             
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(ui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(ui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(ui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ui.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

         /* Create and display the form */
       
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ui().setVisible(true);   
            jLabel1.setText("Time:  "+hour+" : "+minute+" : "+second);
           
            }
       
        });
       
    }







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 19.05.08
Prihlásený: 23.04.24
Príspevky: 664
Témy: 28
Bydlisko: Slovensko
Príspevok NapísalOffline : 05.06.2015 19:25

V separatnom vlakne -> nefreezne GUIko, dane vlakno mozes tym padom s kludom Sleepovat bez toho aby ti zamrzlo -> tym padom mas delay co si chcel.
Endless loop aby bezali hodinky non stop.
Jednoduchsie to spravit asi ani nejde :D
Vypichol by som este jednu vec, v druhom kode ked sa pozries tak pouzivam int a Integer, v jave to nie je to iste. (int) je primitivny typ -> nevies s tym takmer nic robit, nema to ziadne metody. (Integer) je trieda, ma vsetky mozne metody. (int) je tym padom logicky rychlejsie kedze nemusi riesit ako objekt.

Kód:
 
new Thread(){
            public void run(){
                while(true){
                    Calendar kal = new GregorianCalendar();
                    int min = kal.get(Calendar.MINUTE);
                    int sec = kal.get(Calendar.SECOND);
                    clockLabel.setText(   //nastavenie casu do labelu
                      new String(           //vytvorenie stringu z tych vsetkych veci -> setText berie String
                            kal.get(Calendar.HOUR)        + ":" +   //netreba komentar
                            (min<10? "0"+min : min)       + ":" + //ternarny operator asi poznas, pridanie nuly aby neskakali pozicie v case a je to standard
                            (sec<10? "0"+sec : sec)       + "." +  //detto ako o riadok vyssie
                            kal.get(Calendar.MILLISECOND) + " " + //netreba komentar
                            (kal.get(Calendar.AM_PM) == 0? "AM":"PM") //Calendar.AM_PM vracia 0 ak je AM a 1 ak je PM
                      )
                    );
                    try {
                        Thread.sleep(100);  // 100milisekundovy sleep vlakna, nech to nebezi 1000 krat za sekundu, zere vela CPU ...
                    } catch (InterruptedException ex) {
                        Logger.getLogger(clocks.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        }.start();


Inak zapisane, ako komu vyhovuje:
Kód:
 new Thread(){
            public void run(){
                while(true){
                    Calendar cal = new GregorianCalendar();
                    int AM_PM = cal.get(Calendar.AM_PM);
                    int hour = cal.get(Calendar.HOUR);
                    Integer min = cal.get(Calendar.MINUTE);
                    Integer sec = cal.get(Calendar.SECOND);
                    Integer mil = cal.get(Calendar.MILLISECOND);

                    String min_str = min<10?  "0"+min : min.toString();
                    String sec_str = sec<10?  "0"+sec : sec.toString();
                    String mil_str = mil<100? mil+"0" : mil.toString();
                    String AM_PM_str = AM_PM==0? "AM" : "PM";
                    String time = hour + ":" + min_str + ":" + sec_str + "." + mil_str + " "+ AM_PM_str ;

                    clockLabel.setText(time);
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(clocks.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        }.start();


Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 05.04.11
Príspevky: 1693
Témy: 50
Bydlisko: Žilina, Pop...
Príspevok NapísalOffline : 05.06.2015 22:46

Ak si si vsimol Java ma 2 timer triedy.
Prvy java.util.Timer vytvara pre kazdy timer task privatne vlakno a je urceny pre dlhsie trvajuce operacie.(priklad: http://supportweb.cs.bham.ac.uk/documentation/java/tutorial/essential/threads/timer.html), zial nema pristup ku EDT (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html) a preto je tu druha trieda javax.swing.Timer ktora pouziva ActionListener a pristupuje ku EDT bez potreby nejakeho InvokeLater ... (http://albertattard.blogspot.sk/2008/09/practical-example-of-swing-timer.html).

V Jave existuje aj nieco ako http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html ale to som este asi nepouzil, ale Android ma nieco podobne, co sa vola AsyncTask a pouzitie vyzera byt dost podobne.

Tak ako to napisal expresado to vyzera okej, ale ja by som miesto vytvarania novych objektov v cykle radsej zobral cas pomocou http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#currentTimeMillis(), ale pre nejaku zlozitejsiu appku to urcite nie je dobre riesenie kvoli casovym zonam a pod., ale v tvojom pripade by to mohlo fungovat snad okej :) urobis trosku matiky a mas.
Dalej je dobre to napisat do triedy, ktora implementuje interfejs Runnable https://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html a potom danu instanciu spustit vo vlakne https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html







_________________
rMBP 13 2015
iPhone 7
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 06.06.2015 7:45

No ty vole, posrate hodiny a ake zlozite.... :-)
Ano, o dvoch timeroch som pocul. Ale to, o rozdieloch medzi int a integer nie. Som samouk, nejaky cas som sa s tym nehral, tak som pozabudal :-)

V jave si mozem takto vytvarat thready len napisanim new Thread() ?
Ten thread bezi neustale dookola kvoli comu? Ako ta vec vie, ze sa ma stale opakovat, cim to je sposobene? testovanim podmienky while(true) ?

Akurat ten logger som stade vyhodil, nevedelo ho to najst vraj.

A ked uz o threadoch, bezi potom kazdy v ramci jedneho cpu jadra alebo ho hodi na ine?







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Skúsený užívateľ
Skúsený užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 06.06.2015 9:23

Shiro, ty chceš normálne celú príručku programovacieho jazyka :lol: Pre tvoje vlastné dobro, choď na to postupne, inak v tom budeš mať neskutočný guláš.







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 06.06.2015 9:46

Aj to :-)
Mam nejaku stiahnutu, no nech som akokolvek skusal, ziadna sa mi zatial neosvedcila. Je to pisane vsetko stylom ako ked s aucis jazyky a preberas tam sklonovanie a podobne debiliny zbytocne. A ked kecas s nemcom, tak kym si ty vysklonujes vsetky slova vo vete, on vypije dve kavy. :-)

Mate dakto tip na nieco dobre, pisane pre ludi? Zatial sa snazim veci v jave prirovnavat k veciam v delphi, ktorym rozumiem a tak chapem co ako funguje.







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 19.05.08
Prihlásený: 23.04.24
Príspevky: 664
Témy: 28
Bydlisko: Slovensko
Príspevok NapísalOffline : 06.06.2015 10:37

No ak sa chces vyhnut tomu vytvaraniu toho Date dokola, mozes pouzit ten System.currentTimeMillis(), ale nie nemusis to prepocitavat sam, mozes to spravit tak ze si definujes mimo vlakno Calendar cal = new GregorianCalendar(); a vnutri vo vlakne len cas updatnes
Kód:
cal.setTimeInMillis(System.currentTimeMillis());
.
Ano zavolanim new Thread a vyhradenou metodou run() definujes nove vlakno. Na to je dalsich zopar sposobov, ako pisal XOLOO, potom dedenim Thread, potom si mozes priamo v triede definovat
Kód:
       
Runnable threadBody = new Runnable() {
            @Override
            public void run() { //kod vo vlakne
            }
};

A potom si len vytvaras vlakien kolko chces:
Kód:
       
Thread t1 = new Thread(threadBody, "Vlakno1"),
t2 = new Thread(threadBody, "Vlakno2"),
t3 = new Thread(threadBody, "Vlakno3");
t1.start();
t2.start();
t3.start();

Len treba davat pozor, tie vlakna nie su takto synchronizovane, ked si tam vnutri das nejaky napriklad counter, musis to synchronizovat aby to islo v poradi a bolo vsetko iba raz.
Kód:
            private final Object LOCK = new Object();
           
            @Override
            public void run() {
                while(true) {
                    synchronized(LOCK) {
                        if(counter > 100) break;
                        System.out.println(Thread.currentThread().getName() + ": " + counter);
                        counter++;
                    }
                    doWait();
                }
            }

            private void doWait() {
                for(long i=0; i<100000; i++);//toto zalezi od rychlosti CPU afaik
            }



Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 05.04.11
Príspevky: 1693
Témy: 50
Bydlisko: Žilina, Pop...
Príspevok NapísalOffline : 06.06.2015 12:54

@shiro - neskusal si najst nejake prednasky z vysokych skol ? Na FRI mame 3 predmety zaoberajuce sa Javou. A este by som aj odporucal nejaku knizku ku operacnym systemom :) tam su vlakna dobre vysvetlene a pochopil by si ze thready ako take su sucastou procesu.







_________________
rMBP 13 2015
iPhone 7
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 06.06.2015 15:13

Hladam hladam, mam aj nejaky ebook stiahnuty, tak to musim preluskat. ale to bola len taka otazka zo zaujmu.

Skorej ma teraz stve, ze aj taka banalita ako pridavanie textu napisaneho v jTextfield do JListu sa mi javi ako neprekonatelna prekazka...na kery chuj tam musim vyrabat nejaky list model ci co?
Kód:
 
import javax.swing.*;
DefaultListModel listModel = new DefaultListModel();
JList list = new JList(listModel);


Sak to hodim do okna pri navrhu GUI (ten JList) a pristupujem k tomu, nie? Naco vytvarat nejaky model ci co a potom sa na neho odvolavat a robit veci cez neho? Ani neviem co to je a naco to je dobre.

Ved uz mam vytvoreny jeden JList na okne, ktore si navrhujem. Tak naco robit druhy konstruktorom v zdrojaku, alebo nejaky model druheho ci co? Alebo je to nejak sparovane, ze ten model sa vytvori k tomu co mam uz hodeny v GUI okne?
Lebo len cez model sa viem dostat k .addElement("hocijaky string sem"); , cez ktory tam pridam novu polozku. Inac nie. Preco?

Potom som nasiel toto:
Citácia:
Swing makes a distinction between the JList (your GUI for displaying a list), and the "model" (the list itself). You add items to the model, not the GUI

Preco je to robene tak? naco JList delia na GUI co sa zobrazuje a na list samotny?

Kokso, to iste v delphi hotove za 10 minut vratane instalu delphi a tuna ani za svateho neviem sa pohnut... neviem ci sa mam smiat ci plakat.







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Skúsený užívateľ
Skúsený užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 06.06.2015 15:35

Kvôli tomu, aby si nemal úzko spárovanú svoju aplikáciu s konkrétnym implementovaným UI.
Swing implementuje MVC ak ti to niečo hovorí, tj. aplikácia nie je jedno veľké klbko prepletených vecí, ale viacero vrstiev. Keď sa rozhodneš, že sa ti swing nepáči, ale chceš použiť niečo iné (kľudne zrazu nebudeš chcieť desktop aplikáciu, ale budeš chcieť spraviť to isté ako webstránku), nebudeš musieť zahodiť celú aplikáciu, ale iba zmeníš UI.
Ty si mal naposledy dotyk s programovaním pri Delphi, čo? Plakať budeš asi ešte dlho.. :lol:

Btw, je nejaký konkrétny dôvod, prečo vlastne používaš Swing a nie JavaFX? (MVC sa dnes už ale nevyhneš nikde)







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 07.06.2015 10:07

A je ta zmena prostredia potom spravena nejak jednoducho, kvoli tomuto?
Ved tym padom aj tak budes musiet prepisovat nejake prvky, ked zmenis GUI a zrazu zmiznu komponenty ako JList a podobne, lebo v inom "GUI systeme", alebo ako to nazvat sa to moze volat inac....ved to vyhadze milion chyb ze take veci uz nie su a zdrojak na ne odkazuje.

Ano, posledne som s Delphi robil, no z hladiska buducnosti, ak mam v tom pokracovat bude asi lepsie prejst na Javu, nie? Aj keby som sa tym chcel zivit. A teraz pozeram ze Java je uplne odlisny system, ktory neviem pochopit (zatial)

MVC neviem co je, ale prave som si to vygooglil a pripada mi to ako zbytocna komplikacia, hadzanie polien pod nohy. Naco delit nejaky objekt na tri casti? Spravis si objekt a potom este separatne classy na jeho kontrolu a zobrazenie, ak som to spravne pochopil. Preco to nemat ako jednu vec, ktora obsluzi vsetko co od nej potrebujes? A navyse, musis tieto veci ty sam vytvarat = praca navyse ktora by nemusela byt. Nechapem takuto zbytocnu komplikaciu, neznasam ked musim robit pracu, ktora davno mohla byt poriesena efektivnejsie uz len samotnym navrhom program. jazyka.

Na porovnanie, ako som posledne pisal, v delphi mi staci napisat do udalosti pri stlaceni buttonu:
Kód:
listbox1.items.add(edit1.text);

a text z editu1 (textove policko) sa mi hadze pri kazdom stlaceni buttonu do listboxu (obdoba JList) automaticky, stale do noveho riadku, tak ako to ma byt, ako to kazdy caka a ako to kazdy chce.

Kdezto java potrebuje asi 10x tolko zdrojaku + vytvaranie modelov, classov a co ja viem co. Navyse to same dalsi text nehodi do noveho riadku, este aj to si musis napisat sam. Nieje ucelom programovania veci zjednodusovat?
Preto to nechapem a logicky cakam minimalne rovnako jednoduche riesenie ako v delphi.

Dalsia vec co ma matie - robim GUI a dam na nejaky prvok (napr. ten JList) pravy klik-customize code
Co je to tam za kod? Viem, ze je to konstruktor toho JListu. Co sa stane ked ho vymazem, budem si musiet vsetko napisat rucne do mojho zdrojaku, aby mi ten JList zobrazilo a vytvorilo? Pretoze v mojom zdrojaku, kde mam vygenerovane vytvorenie okna a pod. som to nenasiel, (alebo som slepy). Alebo mam ten kod v customize code ignorovat?

Pozeram sa akurat po tom JavaFX...okno v ramci jednej class tam vytvorim ako doteraz? Pretoze ked dam vytvorit iba new app, tak ju mam jasne ze bez GUI.
Doteraz som to robil tak, ze som vytvoril novu app, nedal som vytvorit main class a potom, po vytvoreni app som dal new file-swing gui forms-JFrame form. Tam som potom vyplnil nazov mojej class, ktory som si zadal aky potrebujem.
A mal som GUI + zdrojak v ramci jednej class. Inac by mi to vytvorilo druhu class, kde bolo len okno a tam mam problem, ze neviem ako sa dostat k prvkom toho okna. resp. ako tie dve classy (zdrojakovu a oknovu) medzi sebou prepojit...

...takze je to nejake ine opat...ked chcem spustit JavaFX appku s vytvorenym GUI ako som popisal vyssie, tak mi to neponukne ziadnu class na vyber a tudiz to nespustim. A neviem preco.







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Skúsený užívateľ
Skúsený užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 07.06.2015 10:38

Zmena bude tak jednoduchá, ako si aplikáciu navrhneš. Pokiaľ všetko previažeš napevno s UI prvkami, tak tú aplikáciu môžeš potom zahodiť, pretože akékoľvek rozsiahlejšie úpravy by znamenali kompletné prekopanie systému.
Podľa toho, čo píšeš, to vidíš strašne krátkodobo. Snažíš sa o rýchly vývoj, ale pri tom ignoruješ nejakú spravovateľnosť kódu, prehľadnosť a podobne. Ako keby pre teba programovanie skončilo v momente, kedy aplikácia urobí to, čo potrebuješ. Bohužiaľ v reálnej praxi to tak nikdy nefunguje. Potrebuješ vidieť 10 krokov dopredu a navrhnúť program tak, aby v prípade zmien si nad tým nemusel stráviť pol roka úpravami.

Vidím, že si MVC nepochopil. Vôbec nejde o delenie objektu na 3 časti. Pri MVC (MVVM/MVP/...) delíš vrstvy programu tak, aby boli na sebe navzájom čo najviac nezávislé. Aby si nemal na jednom mieste prístup do databázy, biznis logiku a ešte aj UI. Pointa je v tom, že na projekte väčšinou pracuje viac ľudí, ktorí sú špecializovaní pre svoj obor. Vo firme máš DB špecialistu, frontend developera, backend developera, dizajnéra atď. Tým, že je aplikácia rozdelená do vrstiev, nezískaš len lepšiu prehľadnosť, ľahšiu upravovateľnosť a vyššiu modularitu, ale zabezpečíš aj to, že každý špecialista sa môže venovať svojej časti aplikácie bez toho, aby kafral do kódu niekoho iného. Napríklad, ak jeden rieši UI, je predsa nezmysel, aby musel ovládať aj SQL, k tomu programovací jazyk a ktovie ešte čo. Ten človek sa vie postarať o to, aby sa aplikácia/webstránka/.. dobre zobrazila a o to, že to bude správne fungovať, sa postará niekto iný, bez toho, aby sa z aplikácie stal jeden veľký súbor s prepletenými závislosťami.
Ďalší príklad - čo ak príde tvoj šéf a povie, že súčasnú aplikáciu treba prerobiť pre cloud? Ak to máš prepletené tak, ako si sa naučil pri Delphi (pokiaľ viem, tam by sa to malo tiež dať od seba oddeliť, kebyže to správne naprogramuješ), tak môžeš maximálne odvetiť "ok, ale musíme to urobiť komplet nanovo". Ak máš ale oddelenú logiku od UI, odvetíš len "jasné, do týždňa to má klient nahodené", pretože všetko potrebné naprogramované máš, jedine čo ťa zaujíma budú rozdiely v naprogramovaní UI. Všetko, čo by bolo treba spraviť, by bolo len napojenie samotnej aplikácie (v MVC je to M vrstva) na nové UI.
A ešte jeden príklad - databáza, ktorú si využíval, zmenila licenčné podmienky a nie je možné ju naďalej využívať povedzme bez zaplatenia drahej licencie, takže sa rozhodneš, že by bolo fajn prejsť na nejaký iný spôsob ukladania dát. Keď je aplikácia rozdelená na vrstvy, častokrát je takáto zmena otázkou nahradenia pár súborov, kde máš kód špecifický pre danú databázu. Častokrát stačí dokonca len zmeniť pár detailov v SQL kóde a je to hotovo. Čo ak je ale prístup k db riešený na mnohých miestach aplikácie? Môžeš sa zblázniť, lebo zmena povedzme z Oracle DB na nejakú NoSQL databázu (MongoDB, CouchDB...) by znamenala úpravu v omnoho väčšom merítku.

Pokiaľ si nechceš programovať len nejaké prkotinky pre svoje potešenie, musíš sa naučiť návrhové vzory, niečo o architektúre programu (tým nemyslím architektúru PC samozrejme) atď. Vynikajúce prednášky má napr Robert C. Martin a jeho knihu "Clean Code" by si mal prečítať každý programátor, kto to myslí aspoň trošku vážnejšie.

Čo sa týka konkrétne Javy, JavaFX, swing a podobne, to ti ja moc neporadím, nakoľko ja osobne javu moc nemusím. Čo sa ale týka tej tvojej otázky (pravý gombík na JList a podobne), tak predpokladám, že ide o kód, ktorý pochádza z knižníc swingu. Java samotná nerieši nejaké architektonické vzory aplikácie, to je len jazyk. Nepleť si jazyk s frameworkom, lebo sú to dve odlišné veci :) Väčšina moderných frameworkov v dnešnej dobe ale vyžaduje/implementuje/odporúča minimálne MVC alebo jednu z jeho variant. Z krátkodobého hľadiska ti to príde ako strata času, ale správnym navrhnutím aplikácie si do budúcnosti ušetríš neskutočne veľa šedín. A hej, samozrejme má Java svetlejšiu budúcnosť ako Delphi, hlavne ak zvažuješ komrečnejšie využitie ako len pre svoje potešenie.

Dúfam, že sa mi podarí dakedy v dohľadnej dobe dokopať k pokračovaniu tých svojich tutoriálov, lebo toto je jedna z vecí, ktoré som v nich chcel vysvetliť a rovno aj s príkladmi a tak, lebo viesť to celé len v teoretickej rovine nie je práve ideálne. Na konkrétnych príkladoch je ale výhoda správnej architektúry krásne vidieť.







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 07.06.2015 11:27

Ohladom delenia MVC - je mozne to riesit napr. ze mas viacero suborov *.java? Predstavoval som si to tak, ze mas v pripade aplikacie na prehravanie mp3 napr. gui.java, prehravanie_mp3.java, vizualizacia_hudby.java
A v kazdom subore riesis konkretnu vec. A su medzi sebou previazane, takze v gui.java dokazes zobrazit nazov pesnicky, ktory zistis nejakou funkciou v subore prehravanie_mp3.java, ktory sa stara o pracu s mp3 suborom.

Preto som z toho tak mimo, ze kazdy tutorial je vacsinou iny, co som nasiel. Vacsinou si kazdy (kvoli tomu ze je to tutorial) dany prvok GUI (napr ten JList) vytvara za behu, a nie ze si naklika GUI ake chce mat a s tym potom pracuje.
Ale ved to je nonsens, takto sa normalne vyzerajuca appka navrhnut neda. Vzdy si nejak navrhnes GUI vopred a potom pracujes s buttonmi, listami, menu a inymi vecami co tam mas. Nemozes vyrabat GUI za behu naslepo, ciste v zdrojaku.
Potom mam z toho gulas, lebo tam zacne dakto vyrabat novy model, napr. toho JListu, da tomu nejaky nazov pod ktorym to bude dalej vystupovat v zdrojaku. A teraz co, bude mi to pracovat s tym prvkom GUI co mam, alebo to vytvori novy, nejako, niekde? A kde? To mi uz tutorial nepovie.

Tutorialy co som zatial nasiel, sa ohanali classmi, metodami, property a kadejakymi inymi vyrazmi syntaxe zdrojaku, ktore mi nelezu do hlavy a pletu sa mi. Uz od zakl. skoly som zistil ze veci potrebujem vysvetlovat po lopate, postupne rovno na tom s cim robim. Potrebujem si spojit prax s teoriou, preto vzdy hladam tutorialy kde bude konkretna vec rovno spravena na kuse zdrojaku. Nech si mozem text rovno sparovat so zdrojakom ze to robi toto. A nie klasickym vyucbovym systemom ala Slovencina, kde ta ucia sklonovat tak a tak, preto, lebo. Potom v tom nevidim ziaden system, previazanie. Ano, som mozno divny, ale je to tak :-)
Napr. kde si mozem "vyrobit" vlastnu class? V ktorom mieste zdrojaku, v main metode, pred nou ci za nou?
Alebo aj vytvaranie noveho JFramu:
Kód:
JFrame frame = new JFrame("FrameDemo");

Preco je tam JFrame frame, ked je tam potom priradenie, ze co slovo frame ma byt: = new JFrame ("nazov_okna_v_jeho_hlavicke");
Preco to nieje napr.
Kód:
frame = new JFrame ("nazov_okna_v_jeho_hlavicke");

Ved aj tak je to priradenie, nie?

Toto som nasiel teraz, tutorial na webe oraclu:
Kód:
list = new JList(data); //data has type Object[]

cize vytvorili novy JList. Preco je to zapisane tak a nie tak ako vidim vsade, pri vytvarani JFrame?
Ved by to malo byt takto, nie?
Kód:
JList list = new JList(data)



A dalej, vytvaraju list model:
Kód:
listModel = new DefaultListModel();

kde tomu poviem ktoremu JListu ten listmodel patri, ked mam v GUI JListov viac? Ako to funguje? Ved neviem co tym modelom ovladam.

A podobne uplne "sedliacko rozumove" veci, co v tutorialoch nenajdes. Preto aj moje otazky vyzeraju ako vyzeraju, ako keby sa ta na daco pytal sedliak Pista z dediny co chodi traktorom :-) Delphi som sa ucil systemom pokus-omyl+helpy samotneho IDE a veci z netu. Ale to som mal 14 a kopu casu :-)







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Skúsený užívateľ
Skúsený užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 07.06.2015 11:46

Pri OOP jazykoch platí jedno pravidlo - jedna trieda = jeden súbor.
Myslím, že tebe by bolo fajn začať niečím úplne jednoduchým, aby si sa zoznámil s OOP a jazykom, lebo mi to príde, že ty bojuješ už so základnou syntaxou.. Potom ťažko vysvetľovať pokročilejšie veci :/

Citácia:
Preco je tam JFrame frame, ked je tam potom priradenie, ze co slovo frame ma byt

Pretože to tak funguje pri väčšine staticky typových jazykoch, že premennú musíš zadefinovať aj spolu s jej typom. Akonáhle povieš "JFrame frame", je jasné, že definuješ novú premennú. To, že priraďuješ zároveň niekedy aj hodnotu je irelevantné.

Citácia:
cize vytvorili novy JList. Preco je to zapisane tak a nie tak ako vidim vsade, pri vytvarani JFrame?

pretože niekde inde v kóde už danú premennú vytvorili a teraz jej len priradili hodnotu. Nevidím kód, takže netuším kde presne, ale niekde by si určite našiel jej definíciu.

Keby si programoval napr v C#, vedel by som ti viac povedať, takto si musíš počkať na nejakého javistu, ak ťa zaujímajú špecifiká implementovania aplikácie v swingu.







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 07.06.2015 12:01

ved by som si to rad rozhadzal do suborov, len neviem ako ich medzi sebou prepojit...
v delphi sa to robi cez uses, kde si napises ostatne subory s unitami a nasledne mas pristup k hocicomu co v nich je, aj k prvkom gui okien, ak mas nejake okno v unit2 alebo unit3. Prisieva to k prehladnosti, nemas kilo zdrojaku v jednom subore.

napises:
Kód:
uses unit2;

a nasledne mozes napisat daco do textlabelu v okne, ktore mas vytvorene v ramci unit2:
Kód:
unit2.label1.text("blabla");

a podobne.

V jave toto spravim ako? Cez getter a setter, myslim, nie? A ked ano, tak kde dam set a kde dam get? Set davam do toho *.java suboru v ktorom mam vec ku ktorej chcem pristupovat a v inom *.java subore pouzijem setter aby som nastavil nejaku hodnotu alebo text do tej veci?

A hned mam potriedene veci :-)

Mam vzneseny ciel, spravit si vlastnu kopiu jdownloadera (viem, teraz sa vsetci smejete :-) )ale ako pises, vratil som sa na zaciatok - riesim stale to vkladanie poloziek do JListu, spravil som si na to maly priklad s ktorym sa hram.







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 05.04.11
Príspevky: 1693
Témy: 50
Bydlisko: Žilina, Pop...
Príspevok NapísalOffline : 07.06.2015 12:27

V jave je to import a dobre IDE by to malo robit za teba.

V principe ako hovoris gettery a settery. Ale podla mna su settery celkom nepekna vec. Radsej definujem vsetky mozne atributy triedy ako final tym padom ich neni mozne uz menit.

A tak isto sa radsej vyhybam vytvaraniu objektov priamo v konstruktore triedy ako napriklad v :
Kód:
class UserManager {
   
    private ApiService apiService;
    private UserStore userStore;
 
    public UserManager() {
        this.apiService = new ApiSerivce();
        this.userStore = new UserStore();
    }
 
    void registerUser() {/*  */}
 
}


ale radsej takto :

Kód:
class UserManager {
 
    private ApiService apiService;
    private UserStore userStore;
 
    public UserManager(ApiService apiService, UserStore userStore) {
        this.apiService = apiService;
        this.userStore = userStore;
    }
 
    void registerUser() {/*  */}
 
}


kedy poslem zavislosti ako parametre. Ma to vyhodu napriklad keby ApiService potrebovalo pre svoju funkcnost Context (co je objekt v Androide, ale to je len priklad), tak by som ho musel posielat najprv ako parameter objektu UserManager a potom az ApiService (to ale len v prvom pripade), inak UserManager vobec nemusi o Context-e vediet (druhy pripad) :)







_________________
rMBP 13 2015
iPhone 7
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 07.06.2015 13:01

Cize takto:
mam subor DveOkna.java ktory mam ako "hlavny" kde chcem mat zdrojak a subor okno.java, kde mam vytvorene okno s JLabelom

v subore okno.java napisem jlabel1.getText(); (poskytne mi to pristup k zadavaniu textu do jlabelu)
a v subore DveOkna.java napisem jlabel1.setText("blabla"); - a ono to zapise do jlabelu text blabla?

ako som cakal, predstavoval som si to az moc jednoducho a samozrejme ma java poslala do prdele :)

Napisem jLabel1.getText(); ale ked to dam nad "public static void main(String args[])", tak to pinda ze "package jLabel1 does not exist".
Ked to dam do "public static void main(String args[])", tak to pinda ze "non-static variable jLabel1 cannot be referenced from a static context"
...pricom vobec nechapem o com to mele, sak nech tam proste nacpe text a basta. Jake static a non-static zase?

Pokial dam na jLabel pravy klik a customize code, zaciarknem tam policko "static" , tak to potom nepinda. Ale vobec neviem co som spravil. Preco to nemoze byt staticke alebo co to je.

Vratim sa do suboru DveOkna.java a napisem do "public static void main(String args[])"
jLabel1. ....a nic. Hlasi to "not a statement" "<identifier expected>" ...preco?

A ked na zaciatok suboru DveOkna.java, hned pod "package dve.okna;" napisem:
"import okno.java;"

tak to zase pinda ze "package okno does not exist" ....preco to mam mat v samostatnom package? Preco si nemozem importnut subor z rovnakeho packagu?

A ked si vytvorim package Okno a do neho dam ten subor okno.java, tak mi to samozrejme importnut ide, no aj tak sa nedostanem k jLabelu zo suboru okno.java. Preco?
Ked opat napisem jLabel1, tak to znova hlasi "not a statement" "<identifier expected>"
Ako to, ze ho to nevidi, ked mam importnuty subor okno.java z package Okno?







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 05.04.11
Príspevky: 1693
Témy: 50
Bydlisko: Žilina, Pop...
Príspevok NapísalOffline : 07.06.2015 17:34

Samozrejme ze sa to da ale tebe chybaju nejake zaklady proste :D Ak chapem tak ty chces urobit nieco taketo :
Kód:
class DveOkna {

    public DveOkna(Okno okno, String newText){ //sem ako parameter moze ist bud JLabel alebo referencia na Okno triedu ako chces
        okno.getLabelReference().setText(newText);
    }

}

class Okno {

    private final jLabel mojlabel;

    public Okno(){
        // sem vytvoris JFrame
               JFrame frame = new JFrame("JFrame Example");

      JPanel panel = new JPanel();
      panel.setLayout(new FlowLayout());

      mojlabel = new JLabel("Tento chcem editovat"); //nas label

      panel.add(label);

      frame.add(panel);
      frame.setSize(300, 300);
      frame.setLocationRelativeTo(null);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
    }

    public Jlabel getLabelReference(){
        return this.mojlabel;
    }
}

class Program {

    public static void main(String [] args){
        Okno o = new Okno();
        DveOkna dv = new DveOkna(o,"lalalalaala");
        // a nasledne mozeme aj
        o.getLabelReference.setText("lalalallala2");

}


Samozrejme pisem z hlavy mozu byt chyby :P Takto do jedneho Java suboru by si to nemal pisat ale pekne si to rozdelit a importy by za teba malo urobit IDE. Hlavne si z tohto neber nejaky top priklad. Gui triedy by mali byt samotne a ziadna ina trieda by nemala vediet o implementacii gui triedy a komponentov. Preto existuju veci ako interface, ktory sa na komunikaciu modelovych tried s gui triedami hodi ovela viac.

Static ti to pinda preto, pretoze main metoda je staticka a nemozes v statickych metodach referencovat nestaticke veci, teda tie ktore nemaju identifikator static.







_________________
rMBP 13 2015
iPhone 7
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 08.06.2015 9:32

No ano, zacinam s tym, takze moje zaklady su fakt zakladne :-)
A chcem si to prerozdelit do viacerych java suborov, no skapal som na tom, ze ich neviem medzi sebou "poprepajat".

Tomu kodu vytvarania JFrame rozumiem, to uz mam zmaknute. Urobi to za mna netbeans, kedze si okno spravim v separatnom *.java subore.

Mam to takto: okno mam spravene v subore okno.java
Kód:
package dveokna;

public class okno extends javax.swing.JFrame {

    public okno() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("jLabel1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(179, 179, 179)
                .addComponent(jLabel1)
                .addContainerGap(187, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(119, 119, 119)
                .addComponent(jLabel1)
                .addContainerGap(167, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                       

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(okno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(okno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(okno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(okno.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new okno().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                   
}


A v subore DveOkna.java (chcem aby to bol nieco ako "hlavny subor", kde budem riesit nejaky zdrojak, ktory riesi co sa ma ukazovat v okne) mam len toto:
Kód:
package dveokna;

public class DveOkna {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    }
   
}

No a ako mam pristupovat zo suboru DveOkna.java do suboru Okno.java, kde mam jLabel1 ?
Ako spravim, aby som v subore DveOkna.java mohol jednoducho zadat "jLabel1.setText("jLabel1");" a ono to zapise nejaky text to tam dam do jLabelu, ktory mam v subore Okno.java?
Toto neviem. Taketo zaklady. A stve ma to :-)
Lebo ked napisem do DveOkna.java text "jlabel1" tak to pinda ze "<identifier expected> not an statement". Z toho usudzujem ze to nema pristup do suboru Okno.java a treba ho nejak vytvorit.
Cez import sa to nerobi, to som uz zistil, importovat mozes iba packagy. A ked mam oba subory v jednej package?







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 02.12.06
Prihlásený: 22.04.24
Príspevky: 690
Témy: 35
Bydlisko: Rimavská So...
Príspevok NapísalOffline : 08.06.2015 9:48

nemôžeš mať v jednej aplikácii v dvoch súboroch (triedach) main metódu tá musí byť práve v jednom súbore
veď ak sú v jednom package tak normálne vytvoríš inštanciu
okno ok= new okno()
najlepšie je vždy urobiť get metódu a priamo nepristupovať ku premennej
teda v okno urob verejnú metódu getLabel ktorá bude vracať JLabel1
v dveokna potom dostaneš JLabel1 ako ok.getLabel()
hlavne si uvedom, že nestatické premenné sa vždy viažu ko konkrétnej INŠTANCII a nie k celej triede
ty môžeš mať v jednom okne label s textom nejakým a v inom label s úplne iným textom a obidve okná budú inštanciami triedy okno







_________________
Math is the best!
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 05.04.11
Príspevky: 1693
Témy: 50
Bydlisko: Žilina, Pop...
Príspevok NapísalOffline : 08.06.2015 10:22

Vsimni si co robi ten generovany kod (odporucam aby si nepouzival netbeans editor ale radsej si pisal vlastny kod rucne ako som to urobil ja v priklade hore).

Mas triedu okno (triedy zacinaju velkym pismenom !) a v nej (zhora nadol) tieto veci :

1. trieda okno extenduje, je potomkom, JFrame triedy, takze je mozne urobit JFrame okno = new okno(); Toto za teba robi NetBeans a je to celkom dobre. Ja som vzdy si extendoval swingove komponenty a robil nejaku logiku v nich a to iste robim aj v Androide extendovanim triedy View napr.

2. hned prvy je konstruktor, ktory zavola nainicializovanie obsahu okna a teda metodu initComponents().

3. je to metoda initComponents(). Tu sa vytvoria vsetky komponenty tak ako ich navrhnes v editore. Zaujimavy moze pre teba byt tento riadok :
Kód:
getContentPane().setLayout(layout);

Kedze tvoja trieda okno extenduje triedu JFrame mozes priamo volat jej metody http://docs.oracle.com/javase/7/docs/api/javax/swing/JFrame.html bud s alebo bez klucoveho slova this. co je vlastne referencia na objekt triedy okno. Nakonci je tam zavolana metoda pack() ktora zaruci ze vysledne okno bude odpovedat velkostiam komponentov

4. nasledne je tam public static void metoda (dalej len psvm) ktora je spustena ked v NB kliknes pravym na tuto triedu a das run. Je tam zavolane v anonymnom Runnable zavolane zobrazenie triedy okno a teda samotneho JFrame. Je to obalene este volanim ktore ta moc nemusi zaujimat prave, ale mal by si ho dodrziavat.

To je tak vsetko ku tvojej triede okno :D vidim, ale ze potrebujes stravit nejaky ten cas este, nic v zlom, pisanim konzolovych aplikacii :) aby si hlavne nabral zaklady.
Dalej trieda DveOkna.

1. okej mas tu main metodu, ale pozri ako som to napisal ja. Ja vzdy si urobim triedu v ktorej nebudu ziadne atributy a ani nic podobne a bude tam iba psvm metoda, ktora ma najviac 5 riadkov.

2. v tejto main metode si teraz mozes inicializovat tvoj JFrame takto :

Kód:
JFrame okno = new okno();


toto zavolanie ti pripravi objekt triedy okno, ale nebudes ho este vidiet, preto je potrebne urobit toto :

Kód:
okno.setVisible(true);


a okno sa ti zobrazi.


Dalej tu nie je moc co riesit, pretoze ti chyba nejaky getter na tvoj jLabel1 v triede okno a tym padom, nemas k nemu pristup kedze je v tried okno ku koncu napisane toto :
Kód:
private javax.swing.JLabel jLabel1;


ak tam dopises nejaku metodu :

Kód:
public JLabel dajLabel(){ return jLabel1; }


tak potom v triede DveOkna mozes urobit

Kód:
okno o = new okno() // aspon vidis preco triedy pisat s velkym pismenom
o.dajLabel.setText("editujem ako pan!");







_________________
rMBP 13 2015
iPhone 7
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 08.06.2015 10:42

Citácia:
nemôžeš mať v jednej aplikácii v dvoch súboroch (triedach) main metódu tá musí byť práve v jednom súbore

tak preco mi ju to tam vytvori? Potom mam chaos aj v tom, ze cez ktoru main metodu to funguje.
Ok, odfajcil som v "hlavnom" subore DveOkna.java celu main metodu, je tam teraz len toto:
Kód:
package dveokna;

public class DveOkna {
okno ok = new okno();

}


Citácia:
veď ak sú v jednom package tak normálne vytvoríš inštanciu
okno ok= new okno()

Okej, v subore DveOkna.java som to dal do main metody. A nic to nehlasi, takze je to asi spravne.
Cize ked si to rozoberieme, tak:

okno ok = new okno();
---- ---- ----- -------
musi sa moj identifikator klucove slovo musi sa zhodovat
zhodovat pod ktorym chcem k tomu rozumiem s nazvom suboru
s nazvom tomu pristupovat okno.java ?
suboru
okno.java ?

...pretoze v subore okno.java je deklarovane "public okno()" a " public class okno" ?

A preco znova robit instanciu ked okno uz vytvorene mam v subore okno.java a naklikal som si co v nom chcem mat - 1x jLabel ?
Takze ak to dobre chapem, tak nepristupujem k veciam v subore okno.java priamo, ale si spravim instanciu toho okna v subore DveOkna.java.

A kedze nazov classy a nazov *.java suboru musia byt rovnake (spravne? ci mam zle info?), tak sa da takto aj odlisit, v pripade ze mam okien viac, ze s ktorym oknom pracujem, lebo tym padom sa bude aj jeho instancia inac volat. Dobre rozmyslam?

A teraz - mam spravenu instanciu okna zo suboru okno.java. Ako sa dostanem k tomu, aby som do jLabel1, ktory v tomto okne mam vedel daco napisat?

Citácia:
teda v okno urob verejnú metódu getLabel ktorá bude vracať JLabel1

Nerozumiem, ako to mam zapisat? public void, alebo len public? A kam, mimo main metody?

Citácia:
Static ti to pinda preto, pretoze main metoda je staticka a nemozes v statickych metodach referencovat nestaticke veci, teda tie ktore nemaju identifikator static.

Citácia:
hlavne si uvedom, že nestatické premenné sa vždy viažu ko konkrétnej INŠTANCII a nie k celej triede

Tymto dvom veciam nerozumiem vobec, preco vobec existuje nejake static a non-static, co to znamena a na co je to dobre?







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 02.12.06
Prihlásený: 22.04.24
Príspevky: 690
Témy: 35
Bydlisko: Rimavská So...
Príspevok NapísalOffline : 08.06.2015 11:00

netbeans nepoznám, ale ak má podobné nastavenia ako napríklad eclipse tak by tam mal niekde pri vytváraní byť checkbox kde je možnosť vytvorenia main metódy
Máš nejakú triedu dajme tomu Clovek
v nej máš statickú verejnú premennú dajme tomu pocet_oci nastavenú na dve lebo človek má dve oči
potom môžeš v inej triede volať Clovek.pocet_oci bez vytvorenia inštancie
trieda človek má ďalej privátne (súkromné) nestatické premenné napríklad pohlavie alebo meno a príslušné get metódy
v inej triede preto urobíš napríklad
Clovek shiro=new Clovek();
String shirovomeno=shiro.getMeno();
je to ako v reálnom živote trieda je človek čo je každý a inštancia človeka je konkrétny človek nemôžeš predsa očakávať, že meno bude mať každý človek to isté alebo rodné číslo a podobne. Ale napríklad spomínaný počet očí má každý človek rovnaké (sú aj výnimky samozrejme ale veľmi ojedinelé) preto si pocet_oci môže dovoliť byť statický







_________________
Math is the best!
Offline

Užívateľ
Užívateľ
Ako pracovat v Jave s GUI oknami?

Registrovaný: 12.10.06
Prihlásený: 23.04.24
Príspevky: 20311
Témy: 79
Bydlisko: Banska Byst...
Príspevok Napísal autor témyOffline : 08.06.2015 11:01

XOLOO píše:
Vsimni si co robi ten generovany kod (odporucam aby si nepouzival netbeans editor ale radsej si pisal vlastny kod rucne ako som to urobil ja v priklade hore).

Neviem ci je to tak lepsie, lebo beztak v netbeanse budem v budcnosti robit, tak aby som nebol potom z neho mimo ked prejdem napr. z notepadu...

Mas triedu okno (triedy zacinaju velkym pismenom !) a v nej (zhora nadol) tieto veci :
.....[/quote]
Dik za vycerpavajuci popis, pomohol :-)

XOLOO píše:
To je tak vsetko ku tvojej triede okno :D vidim, ale ze potrebujes stravit nejaky ten cas este, nic v zlom, pisanim konzolovych aplikacii :) aby si hlavne nabral zaklady.

samozrejme, chapem.


XOLOO píše:
Dalej trieda DveOkna.

1. okej mas tu main metodu, ale pozri ako som to napisal ja. Ja vzdy si urobim triedu v ktorej nebudu ziadne atributy a ani nic podobne a bude tam iba psvm metoda, ktora ma najviac 5 riadkov.

2. v tejto main metode si teraz mozes inicializovat tvoj JFrame takto :

Kód:
JFrame okno = new okno();


toto zavolanie ti pripravi objekt triedy okno, ale nebudes ho este vidiet, preto je potrebne urobit toto :

Kód:
okno.setVisible(true);


a okno sa ti zobrazi.

No toto mam spravene v subore Okno.java, vytvorilo mi to tam cely zdrojak a zobrazenie okna. Nie v subore DveOkna.java, tam som celu main metodu odfajcil prec, aby sa to nebilo z main metodou v subore Okno.java.


XOLOO píše:
Dalej tu nie je moc co riesit, pretoze ti chyba nejaky getter na tvoj jLabel1 v triede okno a tym padom, nemas k nemu pristup kedze je v tried okno ku koncu napisane toto :
Kód:
private javax.swing.JLabel jLabel1;


ak tam dopises nejaku metodu :

Kód:
public JLabel dajLabel(){ return jLabel1; }

ahaa, takze takto....a ako som zistil, je nutne to napisat az za main metodu, nie volakam do nej.
Takze ten "dajLabel" je opat nejaka moja premenna alebo vyraz, ktory si urcim a cez ktory budem pristupovat k zadavaniu textu do toho labelu?

XOLOO píše:
tak potom v triede DveOkna mozes urobit

Kód:
okno o = new okno() // aspon vidis preco triedy pisat s velkym pismenom
o.dajLabel.setText("editujem ako pan!");

Pre prehladnost som to prerobil a miesto suboru okno.java mam Okno.java :)
nemozem, lebo to nefunguje, ako pises. Vratim sa do suboru DveOkna.java, kde mam vytvorenu instanciu okna
Kód:
public class DveOkna {
Okno ok = new Okno();
}

no ked dam ok. tak mi to neponukne ziaden dajLabel, ani nic ine, ale iba jedinu polozku: "new" ....preco?







_________________
Ryzen 7 3700X | SilentiumPC Fera 3 | Asrock X570M Pro4 | Patriot Viper 4 Blackout 16GB DDR4-3600 CL17 | Gainward RTX4060 Ti Pegasus 8GB | Samsung 970evo Plus 250GB NVMe | Corsair MP510 1TB NVMe | Samsung 980 Pro 2TB NVMe | Corsair RM550x | 24" BenQ GW2470H | 3x Noctua NF-S12B redux 1200 PWM
Xiaomi Mi 9 Lite 64GB
Odpovedať na tému [ Príspevkov: 36 ] Choď na stránku: 1, 2 ďalšia


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Ako zvolím rozsah čísel v jave

v Assembler, C, C++, Pascal, Java

3

543

10.10.2018 22:52

BX Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako prejsť na druhú class v Jave

v Assembler, C, C++, Pascal, Java

1

422

02.03.2015 11:04

walther Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako pracovat s joomla

v Redakčné systémy

6

1858

22.09.2011 16:07

Bajzik Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Pamäte:Budu pracovať ako chcem?

v Pamäte

2

509

31.10.2008 17:49

mimkork Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. c++ ako pracovat s triedami

v Assembler, C, C++, Pascal, Java

3

569

03.11.2008 20:13

tlacitko Enter Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako pracovať s AV VCS Diamond

v Audio programy

1

846

30.04.2008 20:16

Chooosen Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Zišiel by sa návod - ako pracovať s SQL

v Databázy

1

2608

04.07.2006 11:31

wlacho Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako bude pracovat dual channel v zapojeni 4x 256mb 533mhz

v Pamäte

6

862

06.02.2007 22:17

chester55555 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. version system GUI only

v Ostatné

2

303

21.02.2015 17:54

p4tooo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. priklady GUI podla CUA

v Assembler, C, C++, Pascal, Java

0

487

26.04.2009 15:43

tlacitko Enter Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. C GUI - napr TKinter

v Assembler, C, C++, Pascal, Java

4

614

29.01.2010 23:44

Blackshadow Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Problem s oknami

v Operačné systémy Microsoft

2

355

21.12.2009 21:32

Kamcos Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Java GUI - swing alebo javafx?

v Assembler, C, C++, Pascal, Java

2

437

02.11.2015 20:19

Lessik Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. 3D Mark Vantage(initializing GUI)

v Benchmarky a diagnostické programy

11

2492

17.10.2008 13:31

8andrej8 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. pristup na GUI Router nefunguje

v Siete

3

362

22.11.2011 15:13

shiro Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vista - problem s oknami

v Operačné systémy Microsoft

1

424

26.09.2009 17:13

f4r0 Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  
cron

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra