[Java] FocusTraversalPolicy

Pagina: 1
Acties:

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
De bedoeling is dat , net zoals in Windows gebruikelijk is, je via het gebruik van de tab over de verschillende menu's / menuItems heen kan lopen. Daarvoor dacht ik dat een FocusTraversalPolicy wel gebruikt zou kunnen worden.
Niets lijkt minder waar te zijn. Als ik onderstaande code run, dan verschijnt er precies wat je verwacht, maar het menu is
1) niet te selecteren met de alt (naja, Alt-f doet het bv wel, maar niet alleen het typen van de Alt),
2) niet via de tab door te lopen..

Hebben jullie enig idee hoe/of ik dit kan oplossen?

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import java.awt.Component;
import java.awt.Container;
import java.awt.FocusTraversalPolicy;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;


public class Foo extends JPanel
{
    JFrame frame = new JFrame();
    private JMenuBar menuBar = new JMenuBar();
    private JMenu file = new JMenu("File");
    private JMenu edit = new JMenu("Edit");
    private JMenuItem copy = new JMenuItem("Copy");
    private JMenuItem exit = new JMenuItem("Exit");

    public static void main(String[] args)
    {
        new Foo().init();
    }
    
    public void init()
    {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(100,100);
        
        file.setMnemonic('f');
        edit.setMnemonic('e');
        exit.setMnemonic('C');
        exit.setMnemonic('x');
        exit.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }});
                
        edit.add(copy);
        file.add(exit);
        menuBar.add(file);
        menuBar.add(edit);
        frame.setJMenuBar(menuBar);
        frame.setFocusTraversalPolicy(new MyFocusTraversalPolicy());
        frame.show();
    }
    
    class MyFocusTraversalPolicy extends FocusTraversalPolicy
    {
        public Component getDefaultComponent(Container focusCycleRoot)
        {
            return file;
        }

        public Component getFirstComponent(Container focusCycleRoot)
        {
            return file;
        }

        public Component getLastComponent(Container focusCycleRoot)
        {
            return edit;
        }

        public Component getComponentAfter(Container focusCycleRoot, Component aComponent)
        {
            if(aComponent == file)
            {
                return edit;
            }
            else
            {
                return file;
            }
        }

        public Component getComponentBefore(Container focusCycleRoot, Component aComponent)
        {
            if(aComponent == file)
            {
                return edit;
            }
            else
            {
                return file;
            }
        }       
    }
}

Verwijderd

Ik denk dat het ligt aan het feit dat je je FocusTraversalPolicy toevoegt aan je frame terwijl deze niet direct de componenten file en edit bevat. Je zult je FocusTraversalPolicy dus toe moeten voegen aan je menubar.

edit:

Bovendien is het beter om de elementen in een container (b.v. array) te stoppen en er dan door heen te lopen. Zo kan je gemakkelijker menu items toevoegen en hoef je niet elke keer je policy daarop aan te passen.

[ Voor 35% gewijzigd door Verwijderd op 16-10-2003 14:47 ]


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
Dat het handiger is om die Components aan een List o.i.d. toe te voegen heb je gelijk in. Dit is alleen een voorbeeldje wat ik gemaakt heb, het leek me nl. niet echt zinvol om pagina's code te pasten :)

edit:
Was ff vergeten om op het eerste deel van je reply te reageren. Als ik dit doe:

Java:
1
menuBar.setFocusTraversalPolicy(new MyFocusTraversalPolicy());


ipv de FocusTraversalPolicy aan het frame te hangen, doet doet de FocusTraversalPolicy ook niks..

[ Voor 42% gewijzigd door Dash2in1 op 16-10-2003 15:17 ]


Verwijderd

Dash2in1 schreef op 16 oktober 2003 @ 15:15:
Dat het handiger is om die Components aan een List o.i.d. toe te voegen heb je gelijk in. Dit is alleen een voorbeeldje wat ik gemaakt heb, het leek me nl. niet echt zinvol om pagina's code te pasten :)
Ik begrijp dat de code ter verduidelijking is, maar dit:
Java:
1
Component[] comps = new Component[]{file, edit};

is echt geen pagina's vol code hoor!
edit:
Was ff vergeten om op het eerste deel van je reply te reageren. Als ik dit doe:
Java:
1
menuBar.setFocusTraversalPolicy(new MyFocusTraversalPolicy());

ipv de FocusTraversalPolicy aan het frame te hangen, doet doet de FocusTraversalPolicy ook niks..
Ik heb het ook even getest en ik krijg het ook niet voor elkaar. 'k Zal nog even verder kijken.

[ Voor 6% gewijzigd door Verwijderd op 16-10-2003 16:39 ]


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
*schopje*

  • Potatoman
  • Registratie: September 2000
  • Laatst online: 20-08 21:56

Potatoman

koniwa

Ligt het misschien aan je Look&Feel?
Misschien dat de Window L&F wel alt pakt voor menus maar de default swing L&F niet?

The cyclographing developer

Pagina: 1