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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 21:21 | Nová verze Ladislav Hagara | Komentářů: 0
dnes 11:44 | Zajímavý projekt

Na Indiegogo byla spuštěna kampaň na podporu herní mini konzole a multimediálního centra RetroEngine Sigma od Doyodo. Předobjednat ji lze již od 49 dolarů. Požadovaná částka 20 000 dolarů byla překonána již 6 krát. Majitelé mini konzole si budou moci zahrát hry pro Atari VCS 2600, Sega Genesis nebo NES. Předinstalováno bude multimediální centrum Kodi.

Ladislav Hagara | Komentářů: 0
dnes 00:10 | Nová verze

Byla vydána verze 4.7 redakčního systému WordPress. Kódové označením Vaughan bylo vybráno na počest americké jazzové zpěvačky Sarah "Sassy" Vaughan. Z novinek lze zmínit například novou výchozí šablonu Twenty Seventeen, náhledy pdf souborů nebo WordPress REST API.

Ladislav Hagara | Komentářů: 0
včera 12:00 | Zajímavý projekt

Projekt Termbox umožňuje vyzkoušet si linuxové distribuce Ubuntu, Debian, Fedora, CentOS a Arch Linux ve webovém prohlížeči. Řešení je postaveno na projektu HyperContainer. Podrobnosti v často kladených dotazech (FAQ). Zdrojové kódy jsou k dispozici na GitHubu [reddit].

Ladislav Hagara | Komentářů: 24
včera 11:00 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2016-8655 v Linuxu zneužitelné k lokální eskalaci práv. Chyba se dostala do linuxového jádra v srpnu 2011. V upstreamu byla opravena minulý týden [Hacker News].

Ladislav Hagara | Komentářů: 2
5.12. 22:00 | Komunita

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

Ladislav Hagara | Komentářů: 6
5.12. 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 50
5.12. 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 10
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 17
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (23%)
 (29%)
 (8%)
 (5%)
 (3%)
Celkem 783 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

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: 1505×

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

mE avatar 24.10.2005 11:50 mE | skóre: 14 | blog: Korpsna
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.

mE avatar 24.10.2005 12:48 mE | skóre: 14 | blog: Korpsna
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.
mE avatar 25.10.2005 12:29 mE | skóre: 14 | blog: Korpsna
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.

mE avatar 26.10.2005 01:11 mE | skóre: 14 | blog: Korpsna
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
    
}

mE avatar 26.10.2005 14:29 mE | skóre: 14 | blog: Korpsna
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.

mE avatar 26.10.2005 14:35 mE | skóre: 14 | blog: Korpsna
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.

mE avatar 27.10.2005 13:12 mE | skóre: 14 | blog: Korpsna
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: 66 | 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: 66 | 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: 66 | 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.