abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:55 | Nová verze

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

    Ladislav Hagara | Komentářů: 0
    dnes 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    dnes 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    včera 22:44 | IT novinky

    IBM kupuje společnost HashiCorp (Terraform, Packer, Vault, Boundary, Consul, Nomad, Waypoint, Vagrant, …) za 6,4 miliardy dolarů, tj. 35 dolarů za akcii.

    Ladislav Hagara | Komentářů: 9
    včera 15:55 | Nová verze

    Byl vydán TrueNAS SCALE 24.04 “Dragonfish”. Přehled novinek této open source storage platformy postavené na Debianu v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 13:44 | IT novinky

    Oznámeny byly nové Raspberry Pi Compute Module 4S. Vedle původní 1 GB varianty jsou nově k dispozici také varianty s 2 GB, 4 GB a 8 GB paměti. Compute Modules 4S mají na rozdíl od Compute Module 4 tvar a velikost Compute Module 3+ a předchozích. Lze tak provést snadný upgrade.

    Ladislav Hagara | Komentářů: 0
    včera 04:44 | Nová verze

    Po roce vývoje od vydání verze 1.24.0 byla vydána nová stabilní verze 1.26.0 webového serveru a reverzní proxy nginx (Wikipedie). Nová verze přináší řadu novinek. Podrobný přehled v souboru CHANGES-1.26.

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

    Byla vydána nová verze 6.2 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Přehled změn v příslušném seznamu. Tor Browser byl povýšen na verzi 13.0.14.

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

    Byla vydána nová verze 30.0.0 frameworku pro vývoj multiplatformních desktopových aplikací pomocí JavaScriptu, HTML a CSS Electron (Wikipedie, GitHub). Chromium bylo aktualizováno na verzi 124.0.6367.49, V8 na verzi 12.4 a Node.js na verzi 20.11.1. Electron byl původně vyvíjen pro editor Atom pod názvem Atom Shell. Dnes je na Electronu postavena celá řada dalších aplikací.

    Ladislav Hagara | Komentářů: 2
    včera 04:11 | Nová verze

    Byla vydána nová verze 9.0.0 otevřeného emulátoru procesorů a virtualizačního nástroje QEMU (Wikipedie). Přispělo 220 vývojářů. Provedeno bylo více než 2 700 commitů. Přehled úprav a nových vlastností v seznamu změn.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (72%)
     (9%)
     (2%)
     (17%)
    Celkem 741 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    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: 1614×

    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: 43 | 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: 43 | 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: 68 | 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: 68 | 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: 68 | 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.