Como sobreescrever o Keystroke?

Pessoal, bom dia!

Estou fazendo uma aplicação aqui na empresa e tive alguns problemas com o Swing Component Keystroke Assignments. (Para ser sincero eu nem sabia que isso existia… kkk)

Mas vamos ao problema, preciso usar a tecla F6 para abrir uma tela especifica do sistema, mas se o foco estiver dentro do meu componente split pane ele não faz a ação que deveria, ao invés disso ele fica trocando o foco entre os lados do split pane.

Alguém sabe como posso resolver isso???

Valeu…

Os keystrokes ficam associados ao InputMap e ao ActionMap da sua janela. Dê uma lida:
http://www.guj.com.br/posts/list/140986.java

Vini, valeu pela resposta…

Me esclareceu bastante…

Só tenho uma duvida, esse esquema funciona quando não é um botão?
Porque no caso dessa aplicação as teclas de atalho são para alguns JMenuItem’s.

Valeu…

Funciona para praticamente qualquer coisa. O tratamento de KeyStrokes é parte do JComponent.

Pessoal, eu queria tirar uma duvida a respeito do KeyStroke, pois estou tentando associar fazer uma açao em um dado componente da interface a uma açao que é disparada por duas teclas, no caso eu quero mudar a cor de um JPanel de preto para azul ao apertar uma tecla do teclado e voltar para preto ao apertar outra, a minha duvida é se é possivel fazer essa associaçao usando a mesma acao apenas colocando um condicional para verificar qual tecla foi acionada, ou se nao tem como. Eu fiz todos procedimentos, mas chamei o metodo put de input map novamente para ligar o componente ao painel, e o put de action map para associar essa tecla a uma açao. Eu quero saber se isso é possivel e como tem que fazer, pois no meu caso so a acao da tecla que associei primeiro funciona, a outra nao esta funcionando.

Você quer reaproveitar a ação, é isso?
Como você deve ter visto, o seu código que atende à Action é o método “public void actionPerformed(ActionEvent e)”.
Olhando o ActionEvent, você viu que ele permite a você saber se você teclou Ctrl, Alt, Shift ou Meta quando a tecla foi pressionada, ou entrada do menu foi escolhida, ou botão foi clicado.
Mas ele não diz qual a tecla que foi pressionada, ou entrada do menu que foi escolhida, ou botão que foi clicado.

Não recomendo reaproveitar a ação para teclas diferentes se tem de ter um comportamento diferente para ambas.

Em vez disso, tenha 2 ações diferentes e concentre a parte que é igual para ambas em um outro método que essas ações têm de chamar.

Você pode reaproveitar a ação se ela funciona um pouco diferente quando você aperta uma dessas teclas modificadoras.
Por exemplo, você pode ter um comando escondido que só funciona se você, ao clicar o botão, teclar Ctrl e Shift ao mesmo tempo.

Bem, o que to querendo fazer é o seguinte: Eu tenho um JPanel dentro de um JFrame, so que esse JPanel é uma classe que extende do componente, e que possui fundo preto, entao eu configurei a tecla DOWN para mudar para azul a cor da tela, associei essa açao a essa tecla, e depois fiz a associaçao da tecla UP para voltar para preto, porem so esta funcionando a primeira açao, no caso DOWN, e nao ta funcionando a tecla UP, por isso queria saber se é possivel associar duas teclas diferentes a um action, mas nesse mesmo action fazer açoes diferentes conforme a tecla foi clicada, e se eu posso associar a apenas um componente, pois eu vi no exemplo da calculadora que tinha uma açao mas ela era associada a componentes diferentes, cada tecla associada a um componente diferente, mas ela fazia a mesma coisa com a entrada passada. Porem no meu caso eu quero associar duas teclas a um componente apenas, que é o JPanel, e que faça açoes diferentes sobre ele, mas compartlhando a mesma classe, vou mostrar o meu codigo para entender melhor


import java.awt.*;  
import java.awt.event.*;  
import javax.swing.*;  
  
public class Janela extends JFrame  
{  
    private Principal2 panel;  
    private InputMap imap;  
    private ActionMap amap;  
    private JLabel lbl1;  
    private Action acao1 = new acaoPanel("mudar tela");  
    private Action acao2 = new acaoPanel("mudar texto");  
    private Container cont;  
      
    public Janela ()  
    {  
        super("Teste");  
        panel = new Principal2 ();  
        this.setContentPane(panel);  
          
        imap =  panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);  
        imap.put(KeyStroke.getKeyStroke("DOWN"), "panel");  
        imap.put(KeyStroke.getKeyStroke("UP"), "panel.lbl1colorchanged");  
        amap = panel.getActionMap();  
        amap.put("panel", acao1);  
        amap.put("panel.lbl1colorchanged", acao2);  
        setSize (400, 400);  
        setVisible (true);  
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
    }  
      
    public class acaoPanel extends AbstractAction  
    {  
          
        String opcao;  
          
        public acaoPanel (String acao)  
        {  
            this.opcao = acao;  
        }  
          
        public void actionPerformed (ActionEvent e)  
        {     
            panel.setBackground(Color.BLUE);  
            lbl1 = new JLabel ("Teste");  
            add(lbl1);  
            repaint();  
            revalidate();  
        }  
    }  
      
    public static void main(String[] args)   
    {  
        Janela frame = new Janela();  
    }  
  
}  

O codigo da classe Principal2 é esse abaixo

import java.io.*;  
import java.awt.*;  
import java.awt.event.*;  
import java.awt.image.*;  
import java.util.*;  
import javax.swing.*;  
  
public class Principal2 extends JPanel  
{  
    private int pontox;  
    private int pontoy;  
    private int comp;  
    private int alt;  
    private Container cont;  
    Graphics2D fundo;  
      
  
    public Principal2()  
    {  
        setLayout(new FlowLayout());  
        setBackground (Color.BLACK);  
    }  
      
    /*public void paintComponent (Graphics g) 
    { 
        super.paintComponent(g); 
        fundo = (Graphics2D) g; 
        fundo.setPaint(new GradientPaint (600, 0, Color.BLUE, 1, 0, Color.BLACK, true)); 
        this.pontox = ImageObserver.WIDTH; 
        this.pontoy = ImageObserver.HEIGHT; 
        this.comp = this.getWidth(); 
        this.alt = this.getHeight(); 
        fundo.fillRect(this.pontox, this.pontoy, this.comp, this.alt); 
         
        /*this.pontox = (this.getWidth() / 2) + 1; 
        this.pontoy = ImageObserver.HEIGHT; 
        //this.getHeight() / 2; 
        this.comp = this.getWidth() / 2; 
        this.alt = this.getHeight(); 
        //System.out.println ("Comprimento: " + this.getWidth()); 
        fundo.setPaint(new GradientPaint (600, 0, Color.BLACK, 1, 0, Color.BLUE, )); 
        fundo.fillRect(this.pontox, this.pontoy, this.comp, this.alt); 
         
    }*/  
} 

Eu estou com essa duvida, pois nao consegui executar uma açao diferente ao pressionar outra tecla, se é possivel e como devo fazer.