abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

dnes 16:22 | Zajímavý článek

Nadace Raspberry Pi vydala devětašedesáté číslo (pdf) anglicky psaného časopisu MagPi věnovanému Raspberry Pi a projektům postaveným na tomto jednodeskovém počítači a šesté číslo (pdf) časopisu pro kutily HackSpace věnovanému navíc 3D tisku, pájení, řezání nebo i elektronice a IoT.

Ladislav Hagara | Komentářů: 0
dnes 14:11 | Komunita

Byl zveřejněn seznam 44 osob přijatých do programu Outreachy od 14. května do 14. srpna 2018. Cílem programu Outreachy je přitáhnout do světa svobodného a otevřeného softwaru lidi ze skupin, jež jsou ve světě svobodného a otevřeného softwaru málo zastoupeny.

Ladislav Hagara | Komentářů: 10
dnes 11:44 | Nová verze

Glen MacArthur vydal verzi 2018.4.2 na Debianu založené linuxové distribuce optimalizované pro tvůrce audio a video obsahu AV Linux (Wikipedie). Podrobnosti v oznámení o vydání a v stotřicetistránkovém manuálu (pdf).

Ladislav Hagara | Komentářů: 0
včera 23:33 | Nová verze

Byla vydána nová stabilní verze 1.15 (1.15.1147.36) webového prohlížeče Vivaldi (Wikipedie). Z novinek lze zdůraznit možnost nastavení vlastního pozadí okna, přístup k záložkám z hlavního menu, lepší ovládatelnost v režimu celé obrazovky nebo vyřešení problémů se zvukem v HTML5. Nejnovější Vivaldi je postaveno na Chromiu 65.0.3325.183.

Ladislav Hagara | Komentářů: 0
včera 17:22 | Nová verze

Node.js Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 10.0.0 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). Verze 10 se v říjnu stane novou aktivní LTS verzí. Podpora je plánována do dubna 2021.

Ladislav Hagara | Komentářů: 0
včera 15:33 | Nová verze

Neal Cardwell ze společnosti Google oznámil zveřejnění verze 2.0 nástroje pro testování síťového stacku packetdrill. Jde o souhrnné vydání změn z interního vývoje od roku 2013.

Michal Kubeček | Komentářů: 0
včera 13:22 | Zajímavý software

Microsoft na svém blogu oznámil, že správce knihoven pro C++ Vcpkg (VC++ Packaging Tool) lze nově používat také na Linuxu a macOS. Aktuálně je pro Linux k dispozici více než 350 knihoven [reddit].

Ladislav Hagara | Komentářů: 1
včera 12:44 | Komunita

Byly zveřejněny exploity na Nintendo Switch a platformu Tegra X1: Fusée Gelée a ShofEL2. Jejich zneužití nelze zabránit softwarovou aktualizací. Na druhou stranu exploity umožní na Nintendo Switch snadno a rychle nainstalovat Linux, viz. ukázka na YouTube. Jenom je potřeba sáhnout na hardware.

Ladislav Hagara | Komentářů: 0
včera 00:55 | Nová verze

Byla vydána verze 2.12.0 QEMU (Wikipedie). Přispělo 204 vývojářů. Provedeno bylo více než 2 700 commitů. Přehled úprav a nových vlastností v seznamu změn. Řešeny jsou také bezpečnostní chyby Meltdown a Spectre.

Ladislav Hagara | Komentářů: 7
včera 00:33 | Komunita

Google zveřejnil seznam 1 264 studentů přijatých do letošního Google Summer of Code. Přehled projektů, studentů, 212 organizací a mentorů je k dispozici na stránkách GSoC.

Ladislav Hagara | Komentářů: 0
Používáte na serverech port knocking?
 (3%)
 (7%)
 (47%)
 (26%)
 (18%)
Celkem 387 hlasů
 Komentářů: 29, poslední 5.4. 12:25
    Rozcestník

    Dotaz: OT: Stisk tlacitka v Java programu klavesou enter

    24.10.2005 10:57 Ondra
    OT: Stisk tlacitka v Java programu klavesou enter
    Přečteno: 1529×

    Dobry den,

    neexistuje, prosim Vas, nejaky jednoduchy zpusob, jak nastavit pri programovani v Jave komponentu JButton tak, aby reagovala (vytvorila ActionEvent) po stisku Enter a nikoli po stisku mezerniku? Pripada mi dost neohrabane odchytavat navic KeyEvent, testovat, zda byl stisknut Enter a psat prakticky to same dvakrat (KeyListener a AcitonListener). Patrne je to zcela trivialni zalezitost, ale ja se k tomu nejak nemohu propracovat. Pan Herout v ucebnici Java (II. díl) píše, že implicitní klávesou pro stisk tlacitka je mezernik a pro pouziti jinych klaves je treba naprogramovat metody keyPresed nebo keyReleased (coz jsem zkusil aplikovat, ale nic moc), jine rozumne informace jsem bohuzel nenasel ani v Java Tutorialu ani v ruznych clancich a konferencich o programovani v Jave. Pripada mi divne, ze napr. tlacitko u MessageDialog reaguje zcela obvyklym zpusobem, tj. na stisk Enter, zatimco tlacitka u FileDialog reaguji implicitne stejne jako JButton, tj. na stisk mezerniku, a nechci pripadnym uzivatelum vysvetlovat, proc se jedno tlacito macka entrem a jine mezernikem. Pro graficky navrh pouzivam NetBeans 4.1 a JDK 1.4.

    Za postrceni spravnym smerem dekuji a omlouvam se za OT, ktere ma s Linuxem spolecne jen to, ze na nem je vyvojove prostredi.

    Odpovědi

    Nejsemtu avatar 24.10.2005 11:50 Nejsemtu | skóre: 14 | blog: Nejde Smazat
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    No, vždyť do listeneru můžeš dát jenom to odchycení a kód-který-něco-dělá dá do jiné metody, kterou pak zavoláš.
    private onButtonAction() {
      kodKteryNecoDela();
    }
    
    private initGUI() {
    
      // ...
    
      bn.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ev) {
          onButtonAction() 
        }
      });
    
      bn.addKeyListener(new KeyListener() {
        public void keyTyped(KeyEvent ev) {}
        public void keyPressed(KeyEvent ev) {}
        public void keyReleased(KeyEvent ev) {
          if (ev.getKeyCode() == KeyEvent.VK_ENTER) {
            onButtonAction()
        } }
      });
    
      // ...
    }
    
    24.10.2005 12:31 Ondra
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter

    Ale ano, k podobnemu reseni jsem take dospel (jeste jsem navic nasimuloval stisk a uvolneni tlacitka pomoci setPressed()), jen mi to pripada trochu nestastne, zvlaste v pripade, kdy stiskem tlacitka (T-1) vyvolam dialog (napr. MessageDialog), tento dialog ukoncim stisknutim tlacitka (T-2) klavesou enter a tato udalost je soucasne odchycena i tlacitkem T-1 a opet vyskoci dialog a tak dokola. Navic u komponenty JFileChooser patrne nebudu moci tento postup odchytavani udalosti u jednotlivych tlacitek pouzit a nechci mit cast tlacitek ovladanych tak a cast jinak.

    Nejsemtu avatar 24.10.2005 12:48 Nejsemtu | skóre: 14 | blog: Nejde Smazat
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter

    Tam pak bude něco shnilélo... ta událost nemůže být odchycena tlačítkem, kterému není přiřazena. Můžeš sem dát nějaký nástin?

    Jestliže tam nemáš anonymní třídy, ale jednu, kterou jsi vytvořil a pak přiřadil k oběma tlačítkům, musíš rozlišit, které z tlačítek bylo stisknuto, možná skrze event.getSource() (viz API). Ale to snad máš ;-).

    24.10.2005 13:08 Ondra
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter

    Tlacitka jsou rozlisovana pomoci getSource(), to je v poradku, problem je asi v tom, ze pokud stisknete klavesu, nejste patrne schopen odhadnout kdy ji uz musite pustit. Nejspise dochazi k tomu, ze kdyz dialog po stisku enter zmizi, klavesa enter se nachazi stale ve stisknutem stavu a jedinym posluchacem KeyEvent je opet puvodne stisknute tlacitko T-1, ktere na udalost bleskove zareaguje. Pozn.: Klavesy mackam celkem normalne, ne jako lenochod.

    24.10.2005 13:22 tomas84 | skóre: 30
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Do Javy jsem boužel zatím nepronikl, ale tohle by IMHO vyřešilo, zavěsit požadovanou funkci na eventu vymáčknutí tlačítka - něco jako onKeyUp.
    24.10.2005 15:14 Ondra
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter

    To jsem zkusil taky, volani akcni metody jsem dal do tela metody keyPressed (reakce na stisk) pak i do keyReleased (reakce na uvolneni), ale neni to ono. Mam za to, za ActionEvent je u tlacitka generovana az po splneni vice podminek (napr. tlacitko musi mit fokus, musi byt nejprve stisknuto a pak uvolneno atd.), ktere charakterizuji stisk a uvolneni tlacitka a pouzitim KeyEvent tak patrne narusim spravnou funkci tlacitka, resp. je to jako kdybych nastartoval auto jen tim, ze otevru dvere u sofera a jiz nebylo treba strcit klicek do zapalovani a otocit s nim.

    24.10.2005 17:54 ZAH | skóre: 42 | blog: ZAH
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Událost keyTyped(KeyEvent e)
    24.10.2005 18:29 Ondra
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter

    Událost keyTyped(KeyEvent e)

    Tak toto jsem nezkousel, cit P.Herout (Ucebnice Java II.díl).:

    Pozor:

    Budeme-li obsluhovat pouze metodu keyTyped(), nemuzeme pouzit metodu int getKeyCode(), respektive muzeme, ale dostaneme vzdy hodnotu 0. Tuto metodu lze pouzit jen v metodach keyPressed() nebo keyReleased().

    Kdyz nemohu pouzit getKeyCode(), jak tedy zjistim, ze byl stisknut zrovna Enter? Krome toho mam pocit, ze to stale neresi to, co bych si predstavoval, a to jest - nahrazeni stisku mezerniku stiskem Enter se vsi paradou.

    24.10.2005 19:13 ZAH | skóre: 42 | blog: ZAH
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Ve swingu by to celé mělo být jinak. Nastudujte z dokumentace kapitolu
    Keyboard Bindings in Swing
    
    Jsou tam i nějaké náznaky příkladů pro JButton.
    Nejsemtu avatar 25.10.2005 12:29 Nejsemtu | skóre: 14 | blog: Nejde Smazat
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Tohle je stejné i v Delphi. Metoda keyTyped() funguje na běžná tlačítka - písmena a podobně, zatímco keyPressed() a keyReleased() na ty, kterým se, tuším, říká funkční - různé DEL, INS, Fxx, ESC, DEL, apod. Ten kód, který jsem dal hned jako první odpověď je funkční, sám jsem jej použil. Dokonce i na ten samý problém, myslím ;-).
    25.10.2005 16:17 Ondra
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter

    Ten kód, který jsem dal hned jako první odpověď je funkční, sám jsem jej použil. Dokonce i na ten samý problém, myslím

    Presne tento kod jsem v prvnich pokusech pouzil take. Problem je v tom, ze je funkcni az moc. Jak jsem psal drive, pokud tlacitko T-1 reaguje na keyReleased() a timto tlacitkem vyvolam dialog s tlacitkem T-2, pak po stisku Enter dialog zmizi a tlacitko T-1 staci opet zareagovat na ten samy stisk, resp. uvolneni klavesy.

    Nejsemtu avatar 26.10.2005 01:11 Nejsemtu | skóre: 14 | blog: Nejde Smazat
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Mohl bych vidět ten kód, který takhle zlobí?
    26.10.2005 10:43 Ondra
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter

    Trochu jsem to upravil, tzn. ponechal jsem jen obsluhu KeyEvent

    /*
     * Tlacitko.java
     *
     * Created on 16. říjen 2005, 15:30
     */
    
    
    /**
     *
     * @author  ondra
     */
    public class Tlacitko extends javax.swing.JFrame implements java.awt.event.ActionListener,
     java.awt.event.KeyListener {
        
        /** Creates new form Tlacitko */
        public Tlacitko() {
            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.
         */
        private void initComponents() {
            jPanel1 = new javax.swing.JPanel();
            jButton1 = new javax.swing.JButton();
    
            getContentPane().setLayout(new java.awt.FlowLayout());
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            jButton1.setMnemonic('T');
            jButton1.setText("Tla\u010d\u00edtko");
            jButton1.setSelected(true);
            jButton1.addActionListener(this);
            jButton1.addKeyListener(this);
    
            jPanel1.add(jButton1);
    
            getContentPane().add(jPanel1);
    
            pack();
        }
    
        // Code for dispatching events from components to event handlers.
    
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            if (evt.getSource() == jButton1) {
                Tlacitko.this.jButton1ActionPerformed(evt);
            }
        }
    
        public void keyPressed(java.awt.event.KeyEvent evt) {
            if (evt.getSource() == jButton1) {
                Tlacitko.this.jButton1KeyPressed(evt);
            }
        }
    
        public void keyReleased(java.awt.event.KeyEvent evt) {
            if (evt.getSource() == jButton1) {
                Tlacitko.this.jButton1KeyReleased(evt);
            }
        }
    
        public void keyTyped(java.awt.event.KeyEvent evt) {
        }
    
        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    //GEN-FIRST:event_jButton1ActionPerformed
        }
    //GEN-LAST:event_jButton1ActionPerformed
    
        private void jButton1KeyReleased(java.awt.event.KeyEvent evt) {
    //GEN-FIRST:event_jButton1KeyReleased
            int kod1 = evt.getKeyCode();
            if (kod1 == java.awt.event.KeyEvent.VK_ENTER) {
                javax.swing.ButtonModel bm = jButton1.getModel();
                bm.setPressed(false);
                jButton1.setModel(bm);
                javax.swing.JOptionPane.showMessageDialog(this,"Tlačítko stisknuto!");
            }
        }
    //GEN-LAST:event_jButton1KeyReleased
    
        private void jButton1KeyPressed(java.awt.event.KeyEvent evt) {
    //GEN-FIRST:event_jButton1KeyPressed
            int kod1 = evt.getKeyCode();
            if (kod1 == java.awt.event.KeyEvent.VK_ENTER) {
                javax.swing.ButtonModel bm = jButton1.getModel();
                bm.setPressed(true);
                jButton1.setModel(bm);
            }
        }
    //GEN-LAST:event_jButton1KeyPressed
        
        /**
         * @param args the command line arguments
         */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new Tlacitko().setVisible(true);
                }
            });
        }
        
        // Variables declaration - do not modify//GEN-BEGIN:variables
        private javax.swing.JButton jButton1;
        private javax.swing.JPanel jPanel1;
        // End of variables declaration//GEN-END:variables
        
    }
    

    Nejsemtu avatar 26.10.2005 14:29 Nejsemtu | skóre: 14 | blog: Nejde Smazat
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter

    Fuj, přesně tenhle styl kódování jsem na Heroutovo knihách nesnášel. Nepochopím, proč by celá mamutí třída Frame měla implementovat kopici Listenerů :-). Nicméně, k věci.

    V tomhle konkrétním případě je potřeba použít keyPressed a událost po použití sežrat. Ony dvě metody jsem upravil takto:

        private void jButton1KeyReleased(java.awt.event.KeyEvent evt) {
            int kod1 = evt.getKeyCode();
            if (kod1 == java.awt.event.KeyEvent.VK_ENTER) {
                javax.swing.ButtonModel bm = jButton1.getModel();
                bm.setPressed(false);
                jButton1.setModel(bm);
            }
        }
    
        private void jButton1KeyPressed(java.awt.event.KeyEvent evt) {
            int kod1 = evt.getKeyCode();
            if (kod1 == java.awt.event.KeyEvent.VK_ENTER) {
                javax.swing.ButtonModel bm = jButton1.getModel();
                bm.setPressed(true);
                jButton1.setModel(bm);
                javax.swing.JOptionPane.showMessageDialog(this,"Tlačítko stisknuto!");
    	    evt.consume();
            }
        }
    

    Čili, z keyReleased jsem vyhodil dialog a přesunul ho do Pressed. Navíc jsem nechal událost sežrat samu sebe ;-).

    25.10.2005 13:26 koloom | skóre: 14
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Nema to nic co delat s linuxem, ale budiz. Spravne se to dela tak ze to tlacitko nastavis jako implicitni pomoci getRootPane().setDefaultButton(...). Pokud stisknes enter a nic jinyho to neobslouzi, tak root pane udela action na tom tlacitku. Vic viz. javadoc.
    25.10.2005 16:03 Ondra
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter

    Na to jsem uz koukal take. Bohuzel setDefaultButton() nastavi pouze implicitni tlacitko, tj. zvyraznene tlacitko, ktere ma prednost. V pripade, ze je ve formulari tlacitek vice, lze stiskem Enter obslouzit pouze toto jedine "Default" tlacitko, a to i v pripade, ze fokus ma jine tlacitko a chci stiskem Enter obslouzit prave to fokusovane tlacitko. Patrne by slo spojit tuto metodu s metodou zjistujici fokus a jako defaultni nastavit prave to tlacitko, ktere ma fokus. Nicmene je to porad pro mne nepochopitelne harakiri, kteremu bych se rad vyhnul. Stale tak nejak ocekavam, ze jsem nekde tupe prehledl metodu, kterou se to da zmenit jednoduse, neco jako setKlavesaTlacitka(VK_ENTER). Stejne prece funguje setMnemonic(), zde take nemusim pro kombinaci ALT+Klavesa pachat navic dvacet radek programu.

    Jeste jednou se omlouvam za OT.

    9.7.2006 09:11 python2 | skóre: 4
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Jezisi kriste, ty jsi otrava. Java je proste blba, bud rad ze mas nejake reseni a finito.
    26.10.2005 11:13 Ondra
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter

    ZREJME VYRESENO

    Dalsi prohlidkou cizich aplikaci jsem zjistil, ze vetsina jich pouziva nastaveni klavesy Enter prave pomoci setDefaultButton(), tudiz mnou hledane reseni patrne neexistuje a vsichni to obchazeji, budu to tedy obchazet take. Reseni pomoci zjisteni fokusu komponenty a nasledne nastaveni pomoci setDefaultButton() neni zas az tak hrozne a hlavne tlacitka funguji podle ocekavani.

    Dekuji vsem za pomoc.

    Nejsemtu avatar 26.10.2005 14:35 Nejsemtu | skóre: 14 | blog: Nejde Smazat
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Nevzdávej to tak brzo. Co kdybys potřeboval, aby ti na Enter reagovalo několik tlačítek, vždy právě to aktuálně zaměřené? To skrze setDefaultButton asi nenastavíš. Nebo ano? :-).
    27.10.2005 12:22 Ondra
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Co kdybys potřeboval, aby ti na Enter reagovalo několik tlačítek, vždy právě to aktuálně zaměřené? To skrze setDefaultButton asi nenastavíš. Nebo ano?

    Ano. Pomoci metod FocusGained() a FocusLost(), kdyz setDefaultButton() nastavim v tele techto metod.

    Priklad:

    private void jButton1FocusGained(java.awt.event.FocusEvent evt) {                                     
            getRootPane().setDefaultButton(jButton1);
        }                                    
    private void jButton1FocusLost(java.awt.event.FocusEvent evt) {                                     
            getRootPane().setDefaultButton(null);
        }
    

    Funguje to dobre a hlavne okolo toho neni treba delat zadne dalsi opicky, staci odchytavat ActionEvent konkretniho tlacitka.

    Nejsemtu avatar 27.10.2005 13:12 Nejsemtu | skóre: 14 | blog: Nejde Smazat
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Hmm, to mi přijde jako obcházení, které by se mohlo vymstít ;-).
    9.7.2006 15:07 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    To není obcházení, je to přesná emulace toho, jak se chovají Windows a čeho chcete zřejmě vy docílit. Enterem se vždy aktivuje defaultní tlačítko, jenže ve Windows tlačítko, které získá focus, se stane defaultním, takže to pak může vypadat, že enterem potvrzujete tlačítko s focusem.
    27.10.2005 13:40 eXEden | skóre: 13 | blog: Plkoviny | Praha
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    A což takhle zkusit InputMap a ActionMap z JRootPane?
    public class TestApp extends JDialog implements ActionListener {
        
            private JButton btnTest1;
            private JButton btnTest2;
        
            /**
             * Creates a new instance of TestApp
             */
            public TestApp() {
                super();
                
                initDialog();
            }
            
            private void initDialog() {
                setTitle("Test Application");
                setLocationRelativeTo(null);
                setDefaultCloseOperation(DISPOSE_ON_CLOSE);
                
                getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "handleEnter");
                getRootPane().getActionMap().put("handleEnter", new EnterDialogAction());
                
                addComponents();
            }
            
            private void addComponents() {
                btnTest1 = new JButton("Test 1");
                btnTest1.setActionCommand("TEST1");
                btnTest1.addActionListener(this);
                
                btnTest2 = new JButton("Test 1");
                btnTest2.setActionCommand("TEST1");
                btnTest2.addActionListener(this);
                
                getContentPane().add(btnTest1, BorderLayout.NORTH);
                getContentPane().add(btnTest2, BorderLayout.SOUTH);
            }
            
            protected void handleEnterKey() {
                if (getRootPane().getDefaultButton() == null) {
                    Component comp = getFocusOwner();
                    
                    if (comp instanceof JButton)
                        ((JButton)comp).doClick();
                }
            }
            
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(this, e.getActionCommand(), "Button Pressed", JOptionPane.INFORMATION_MESSAGE);
            }
            
            /**
             * Runs application
             * @param args the command line arguments
             */
            public static void main(String[] args) {
                SwingUtilities.invokeLater(
                        new Runnable() {
                            public void run() {
                                TestApp test = new TestApp();
                                test.pack();
                                test.setVisible(true);
                            }
                        });
            }
    
            
            private class EnterDialogAction extends AbstractAction {
                
                    public void actionPerformed(ActionEvent e) {
                        TestApp.this.handleEnterKey();
                    }
            }
    }
    
    9.7.2006 01:05 Shaman22
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Poněkud zvláštní řešení, ale mělo by snad fungovat i pod 1.4.2.

    JOptionPane jop = new JOptionPane("Really want to delete it?)",JOptionPane.QUESTION_MESSAGE,JOptionPane.YES_NO_OPTION);
    JDialog dialog = jop.createDialog(this, "Confirm.");
    dialog.show();
    //constant for left button x = 122
    Point p = dialog.getFocusOwner().getLocation();
    if (p.x == 122)
    //deleteWhatYouWant
    9.7.2006 09:36 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Na určení implicitního tlačítka, které bude reagovat na Enter, slouží setDefaultButton(). Vy ale zřejmě chcete, aby na Enter reagovalo právě vybrané tlačítko, s tím, abyste nemusel uživatelům vyvsětlovat, že někdy se tlačítko aktivuje mezerníkem a někdy enterem. V tom případě můžete být klidný, tlačítko se vždy aktivuje mezerníkem, enter slouží vždy k aktivaci implicitního tlačítka. Budete-li se pokoušet toto chování předefinovat, uděláte v tom uživatelům akorát zmatek.

    Nevím, čemu říkáte MessageDialog, ale JOptionPane má stejné chování – tlačítko se aktivuje mezerníkem. Nevím, jestli na chování tlačítek něco nemůže změnit L&F.
    9.7.2006 12:54 Shaman22
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Podle mého názoru je vše v pořádku, pokud se nejedná o JOptionPane a je nutné (kvůli budoucím uživatelům aplikace) nastavit pro klávesu Enter stejné pravomoce jako má mezerník. Je nesmysl do dialogového okna pro nezkušené uživatele psát, že mají stisknout mezerník, jinak se provede jiná operace (při fokusu na NO_OPTION v JOptionPane.YES_NO_OPTION).

    Řešení je ale prosté i zde a jde to i bez konstant:

    //set new JOptionPane
    JOptionPane jop = new JOptionPane("Opravdu chcete smazat záznam?",JOptionPane.QUESTION_MESSAGE,JOptionPane.YES_NO_OPTION);
    //set new JDialog, use already defined JOptionPane
    JDialog dialog = jop.createDialog(this, "Potvrďte smazání záznamu.");
    dialog.show();
    /*if Focused component's hashcode is the same as the hashcode of first button of JOptionPane (getAccessibleChild(0)), delete record*/
    if(dialog.getFocusOwner().hashCode() == jop.getComponent (1).getAccessibleContext().getAccessibleChild(0).hashCode())
    //delete it
    9.7.2006 15:05 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: OT: Stisk tlacitka v Java programu klavesou enter
    Podle mne je tedy lepší uživatelům vysvětlit, že vybrané tlačítko se aktivuje mezerníkem, vždy a všude. Jestli mají nějaký zlozvyk ohledně ovládání GUI, je lépe je odnaučit je tomu dříve, než napáchají nějakou škodu. Předpokládám, že to pochází z Windows, kde se při získání fokusu tlačítko zároveň stává defaultním – i pokud chcete napodobit tohle chování, nejde to udělat přes odchytávání stisknutí entru, ale musíte také při získání focusu udělat tlačítko defaultním.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.