Comtrole de Foco no JInternalFrame

Ola,

Tenho uma aplicação em modelo Mdi e preciso que uma dada janela nunca perca o foco a menos que seja fechada.
Tudo oque tentei não funcionou, caso alguem tenha alguma ideia:

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

public class Mdi extends JFrame{
    
    public static JDesktopPane desktop;
    
    public Mdi(){
        
        super("Titulo");
        
        desktop = new JDesktopPane();
        
        setJMenuBar(criamMenu());
        
        pack();
        
        setExtendedState(MAXIMIZED_BOTH);
        
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        setContentPane(desktop);
    }
    
    private JMenuBar criamMenu(){
        
        JMenuBar barraDeMenu;
        JMenu menu;
        JMenuItem itemDoMenu;
        
        barraDeMenu = new JMenuBar();
        menu = new JMenu("Arquivo");
        itemDoMenu = new JMenuItem("Abrir");
        
        barraDeMenu.add(menu);
        menu.add(itemDoMenu);
        
        itemDoMenu.addActionListener(new Consulta());
        
        return barraDeMenu;
    }
    
    public static void main(String args[]){
        
        Mdi app = new Mdi();
        app.setVisible(true);
   
    }
}[/code]


[code]import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JToolBar;

public class Consulta extends JInternalFrame implements ActionListener {
    
    public Consulta(){
        
        super("Consulta",false,true,false,false);
        
        setDefaultCloseOperation(HIDE_ON_CLOSE);
        
        setLayout(new BorderLayout());
        
        Mdi.desktop.add(this);
        
        setSize(300,300);
//
//        Na versão original ele fica maximizado:
//        try {
//            this.setMaximum(true);
//        } catch (PropertyVetoException ex) {
//            ex.printStackTrace();
//        }
//
        add(criaBarra(),BorderLayout.NORTH);
        
        JPanel gradePnl;
        gradePnl = new JPanel();
        gradePnl.add(new JTable(3,4));
        gradePnl.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(10,10,10,10),BorderFactory.createLoweredBevelBorder()));
        gradePnl.setLayout(new BoxLayout(gradePnl,BoxLayout.Y_AXIS));
        add(gradePnl);
    }
    
    private JToolBar criaBarra(){
        
        JToolBar barra;
        JButton botao;
        
        barra = new JToolBar();
        botao = new JButton("Botao");
        
        barra.add(botao);
        
        botao.addActionListener(new Novo());
        
        return barra;
    }
    
    public void actionPerformed(ActionEvent actionEvent) {
        setVisible(true);
    }
}

[code]import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;

public class Novo extends JInternalFrame implements ActionListener {

public Novo() {
    
    super("Novo",false,true,false,false);
    
    setDefaultCloseOperation(HIDE_ON_CLOSE);
    
    Mdi.desktop.add(this);
    
    setSize(200,200);
    
    addInternalFrameListener(new InternalFrameAdapter() {
        public void 	internalFrameDeactivated(InternalFrameEvent e){
            
            recebeFoco();
        }
    });
}

void recebeFoco(){

//
// Tentativas inuteis:
// requestFocus();
// toFront();
// requestFocusInWindow();
// grabFocus();
// Mdi.desktop.setSelectedFrame(this);
// setRequestFocusEnabled(true);

// try {
// setSelected(true);
// } catch (PropertyVetoException ex) {
// ex.printStackTrace();
// }
JOptionPane.showInternalMessageDialog(Mdi.desktop,“Chegou aqui e nao deu certo!”);
//
}

public void actionPerformed(ActionEvent actionEvent) {
    setVisible(true);
}

}
[/code]

Realmente preciso de ajuda.
Valeu

Alguém?

Com JInternalFrames vc não vai conseguir fazer isso. Você pode tentar controlar a camada em que o seu internal frame deve ficar por uma thread, mas acho isso com kra de gambiarra. Por exemplo, a thread fica verificando a cada intervalo de tempo quantos frames tem e colocando o seu frame desejado sempre numa camada acima… Ou então sempre que um frame obtém o foco faz essa verificação e coloca o outro no topo… São duas idéias, mas eu não testei.

O que você pode fazer, que vai ser o mais fácil e sem precisar ficar fazendo esses tipos de mágicas, é criar um JFrame normal e usar o método setAlwaysOnTop( true ). Assim ele vai sempre ficar na frente, o problema é que ele vai ficar na frente de tudo, mesmo das outras aplicações.

Até mais!

Outra alternativa.

No seu JFrame, crie esa interface que deve sempre ficar visível, fora o JDesktopPane. Ai vc não vai precisar se preocupar com outra janela, os componentes sempre ficarão visíveis. Utilize uma borda para separá-los do restante da interface do JFrame. Se forem poucos componentes, vc pode criar como um painel, do lado direito da aplicação. Acho que ficaria legal.

Obrigado pela atenção davidbuzatto, mas se eu trocar meus JInternalFrames por JFramas vou perder o modelo Mdi.
Mesmo assim valeu

Olha usamos aqui o TraversalPolicy, conforme comentado no tópico abaixo, é bem trabalhoso lidar com ele, porém temos conseguido lidar com as questões de foco que precisamos, utilizando o JInternalFrame, dê uma pesquisada a respeito.

http://www.guj.com.br/posts/list/60369.java#316950

Abraços…