Problema Ctrl + Tab JTabbedPane

3 respostas
_Leon

Galera, estou com um problema ao capturar eventos de teclado.
Preciso navegar pela minha JTabbedPane com o ctrl + tab, por exemplo: o usuário mantém o ctrl pressionado e quando ele aperta o tab eu mudo a tab selecionada, já tentei muita coisa e não consegui.

Alguém pode me ajudar???

Obrigado!

3 Respostas

E

Conforme você pode ver, Ctrl+Tab só funciona com JTabbedPane se o look & feel for Windows e se você estiver com um tab selecionado. Senão ele irá só mover o foco para o próximo controle (assim como ocorre em outros look & feels).

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;


class Tester {
   public static void main(String[] args) {
      final JFrame      f  = new JFrame();
      final JTabbedPane tabbedPane  = new JTabbedPane();
      final JPanel      panel1 = new JPanel(false),
                        panel2 = new JPanel(false),
                        panel3 = new JPanel(false),                        
                        panel4 = new JPanel(false),
                        panel5 = new JPanel(false),
                        panel6 = new JPanel(false),
                        panel7 = new JPanel(false),
                        panel8 = new JPanel(false),
                        panel9 = new JPanel(false);
                        
      // WindowListener for cosing progam.
      f.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent evt) {
            evt.getWindow().dispose();
            System.exit(0);
         }
      });

      tabbedPane.add("Panel 1", panel1);
      tabbedPane.add("Panel 2", panel2);
      tabbedPane.add("Panel 3", panel3);
      tabbedPane.add("Panel 4", panel4);
      tabbedPane.add("Panel 5", panel5);
      tabbedPane.add("Panel 6", panel6);
      tabbedPane.add("Panel 7", panel7);
      tabbedPane.add("Panel 8", panel8);
      tabbedPane.add("Panel 9", panel9);
      
      f.getContentPane().add(tabbedPane, BorderLayout.CENTER);

      //--------------------
      // The remaining code simply allows for a change in the LaF....
      //--------------------
      JPanel LaFPanel = new JPanel();

      final JButton windowsLaF = new JButton("Windows"),
                    motifLaF   = new JButton("Motif"),
                    metalLaF   = new JButton("Metal");

      LaFPanel.add(windowsLaF);
      LaFPanel.add(motifLaF);
      LaFPanel.add(metalLaF);

      ActionListener LaFListener = new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            Object src = evt.getSource();

            try {
               if(src == windowsLaF)
                  UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
               else if(src == motifLaF)
      	    	   UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
               else
      	    	   UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

               SwingUtilities.updateComponentTreeUI(f);
            }
            catch(Exception e) {
               System.err.println("*** ERROR IN CHANGING LAF: " + e);
            }
         }
      };

      windowsLaF.addActionListener(LaFListener);
      motifLaF.addActionListener(LaFListener);
      metalLaF.addActionListener(LaFListener);

      f.getContentPane().add(LaFPanel, BorderLayout.SOUTH);
      f.setResizable(false);
      f.setBounds(40, 40, 330, 200);
      f.setVisible(true);
   }
}
_Leon

Eu pensei capturar o evento ao pressionar o ctrl + tab e apenas acionar um myTabbedPane.setSelectedIndex(tabNumber)
O maior problema é capturar o ctrl + tab, não estou conseguindo…

_Leon

Pronto fiz funcionar com qualquer look and feel :smiley:

Da uma olhada:

import javax.swing.*;
   import java.awt.event.*;
   import java.awt.*;


   class Tester {

       private static boolean ctrlKey;
       private static boolean tabKey;
       

      public static void main(String[] args) {
         final JFrame      f  = new JFrame();
         final JTabbedPane tabbedPane = new JTabbedPane();
         final JPanel      panel1 = new JPanel(false),
                           panel2 = new JPanel(false),
                           panel3 = new JPanel(false),
                           panel4 = new JPanel(false),
                           panel5 = new JPanel(false),
                           panel6 = new JPanel(false),
                           panel7 = new JPanel(false),
                           panel8 = new JPanel(false),
                           panel9 = new JPanel(false);
       
         // WindowListener for cosing progam.
         f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
               evt.getWindow().dispose();
               System.exit(0);
            }
         });

         tabbedPane.add("Panel 1", panel1);
         tabbedPane.add("Panel 2", panel2);
         tabbedPane.add("Panel 3", panel3);
         tabbedPane.add("Panel 4", panel4);
         tabbedPane.add("Panel 5", panel5);
         tabbedPane.add("Panel 6", panel6);
         tabbedPane.add("Panel 7", panel7);
         tabbedPane.add("Panel 8", panel8);
         tabbedPane.add("Panel 9", panel9);

         f.getContentPane().add(tabbedPane, BorderLayout.CENTER);

         //--------------------
         // The remaining code simply allows for a change in the LaF....
         //--------------------
         JPanel LaFPanel = new JPanel();

         final JButton windowsLaF = new JButton("Windows"),
                       motifLaF   = new JButton("Motif"),
                       metalLaF   = new JButton("Metal");

         LaFPanel.add(windowsLaF);
         LaFPanel.add(motifLaF);
         LaFPanel.add(metalLaF);

         ActionListener LaFListener = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
               Object src = evt.getSource();

               try {
                  if(src == windowsLaF)
                     UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                  else if(src == motifLaF)
                      UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
                  else
                      UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

                  SwingUtilities.updateComponentTreeUI(f);
               }
               catch(Exception e) {
                  System.err.println("*** ERROR IN CHANGING LAF: " + e);
               }
            }
         };

         windowsLaF.addActionListener(LaFListener);
         motifLaF.addActionListener(LaFListener);
         metalLaF.addActionListener(LaFListener);
         
         f.getContentPane().add(LaFPanel, BorderLayout.SOUTH);
         f.setResizable(false);
         f.setBounds(40, 40, 330, 200);
         f.setVisible(true);


         addTabControlListener(tabbedPane);
         
      }


      public static void addTabControlListener( final JTabbedPane parent ) {

          Toolkit.getDefaultToolkit().addAWTEventListener(

                new AWTEventListener(){
                    public void eventDispatched(AWTEvent event){

                        KeyEvent ke = (KeyEvent)event;
                        if(ke.getID() == KeyEvent.KEY_RELEASED){

                            if (ke.getKeyCode() == 17) {
                                ctrlKey = false;
                                parent.grabFocus();
                            } else if (ke.getKeyCode() == KeyEvent.VK_TAB){
                                tabKey = false;
                                parent.grabFocus();
                            }

                        }else if(ke.getID() == KeyEvent.KEY_PRESSED){
                            if ( ke.getKeyCode() == 17) {
                                ctrlKey = true;
                                parent.grabFocus();
                            } else if (ke.getKeyCode() == KeyEvent.VK_TAB){
                                tabKey = true;
                                parent.grabFocus();

                                if ( ctrlKey ) {                                    
                                    if ( parent.getSelectedIndex() != 8 ) {
                                        parent.setSelectedIndex(parent.getSelectedIndex() + 1);
                                        parent.grabFocus();
                                        tabKey = false;
                                    } else {
                                        parent.setSelectedIndex(0);
                                    }
                                }
                            }

                        }else if(ke.getID() == KeyEvent.KEY_TYPED){
                            if ( ke.getKeyCode() == 17) {
                                ctrlKey = true;
                                parent.grabFocus();
                            } else if (ke.getKeyCode() == KeyEvent.VK_TAB){
                                tabKey = true;
                                parent.grabFocus();

                            }
                        }
                    }

            }, AWTEvent.KEY_EVENT_MASK);
      }


   }

Obrigado!

Criado 26 de fevereiro de 2010
Ultima resposta 26 de fev. de 2010
Respostas 3
Participantes 2