Toon posts:

[java] default action voor spatiebalk

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een programma met een swing gui met daarin een jtoolbar met enkele Actions. Als het programma start en ik druk op spatiebalk (windows l&f) dan wordt de eerste Action die enabled is uitgevoerd (je ziet de knop in de toolbar ook ingedrukt worden). Ik wil dit gedrag graag beinvloeden maar dit wil niet lukken.

Ten eerste heb ik geprobeerd de focusable property van de toolbar op false te zetten. Dit had geen effect. Ook als ik een andere Action requestFocus laat uitvoeren verandert er niets. Ook heb ik geprobeerd met een KeyboardFocusManager te zorgen dat er helemaal niets gebeurt als de spatiebalk wordt ingedrukt. clearGlobalFocusOwner had ook niets tot gevolg....

Kan iemand mij vertellen hoe ik zelf kan uitmaken welke Action wordt uitgevoerd als de spatiebalk wordt ingedrukt?

Verwijderd

Een ActionListener lijkt mij de oplossing :)

Heb zelf niet echt met JToolbar gewerkt maar denk dat de knoppen die in de toolbar zitten aparte object zijn en deze aparte objecten kun je dus ook een eigen ActionListener geven.. Ook geef je er een ActionCommand aan (Doe ik vaak maar kan ook anders) en zo kan je de actie beinvloeden. Dus zodra iemand op die knop klikt zal hij daar heen gaan en kan een andere actie gegeven worden.

Daarnaast zou je in plaats van de ActionListener een KeyListener kunnen doen voor de spatie op die toolbar .. KeyListener kan je ook added aan knoppen in toolbaar. aangezien het losse objecten zijn (als ik het goed heb) en dan de spatie afvangen en een gewenste actie daarin zetten.

Maar kijk maar eens of dat lukt .. Durf ook niet iets helemaal zeker te zeggen omdat ik nog niet met de JToolbar heb gewerkt.. maar lijkt mij de oplossing.

[ Voor 3% gewijzigd door Verwijderd op 14-02-2005 02:50 ]


Verwijderd

Topicstarter
het punt is niet dat de verkeerde actie wordt uitgevoerd als je er opklikt... ik voeg gewoon Action-objecten toe aan de toolbar dus die werken allemaal met hun eigen actionPerformed methode... mijn probleem is juist dat na de start van de applicatie de focus bij de eerste actieve knop in de toolbar ligt en bij de Windows look and feel activeert de spatiebalk de huidige focus-owner (als je eerst een knop klikt en daarna spatiebalk drukt dan wordt die geklikte knop opnieuw geactiveerd). Ik krijg alleen dus niet die focus ergens anders heen en bovendien zou ik graag willen weten of ik dit windows-gedrag kan uitschakelen.

Dat met die keylistener werkt voor zover ik weet ook niet, want de spatiebalk wordt in de Windows look and feel apart behandeld. Ik had zo iets wel eens geprobeerd in een andere applicatie, maar daar lukte het me uiteindelijk alleen door de global focus-owner te clearen.... in mijn nieuwe applicatie werkt dat echter niet...

iemand nog suggesties?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 14-05 17:09

Robtimus

me Robtimus no like you

JRootPane heeft een property genaamd defaultButton:
The button that gets activated when the pane has the focus and a UI-specific action like pressing the Enter key occurs.
Kun je dat niet gebruiken? IPV de knoppen direct aan je JToolBar toe te voegen voeg je ze toe aan een JRootPane, en die voeg je toe aan je JToolBar.

Als je JToolBar.add(Action a) gebruikt, lees dan dit:
As of 1.3, this is no longer the preferred method for adding Actions to a container. Instead it is recommended to configure a control with an action using using setAction, and then add that control directly to the Container.
Blijven over de methods om buttons / separators toe te voegen:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    protected void addImpl(Component comp, Object constraints, int index) {
        super.addImpl(comp, constraints, index);
        if (comp instanceof JButton) {
            ((JButton)comp).setDefaultCapable(false);
        }
    }

    public void addSeparator()
    {
        addSeparator(null);
    }

    public void addSeparator( Dimension size )
    {
        JToolBar.Separator s = new JToolBar.Separator( size );
        if (getOrientation() == VERTICAL) {
            s.setOrientation(JSeparator.HORIZONTAL);
        } else {
            s.setOrientation(JSeparator.VERTICAL);
        }
        add(s);
    }
uit de java 1.4.2_06 source
Dat kun je zelf dus aanroepen nu, aangezien JToolBar.Separator public is.

[ Voor 4% gewijzigd door Robtimus op 15-02-2005 11:23 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
de default button is de button die je met enter kan activeren, dus daar heb ik niets aan. ik zag wel dat de standaard inputmap van buttons de spatiebalk gelijk stellen aan een muisklik (mits de button de focus heeft). ik zal dus toch m'n best moeten gaan doen om die focus te gaan verplaatsen....

dat van addAction wist ik trouwens niet, maar gelukkig wilde ik het toch al gaan aanpassen om togglebuttons te gaan gebruiken.