Como obrigar uma frame a ser modal
Boas,
Na minha aplicação tenho algumas frames que têm de ser "modal". Como consigo fazer isso em Java?
Obrigado
Ffar
Curtidas 0
Respostas
Gabriel Millian
09/04/2009
A maneira mais simples é usar um JDialog e setar setModal(true).
GOSTEI 0
Victor Muniz
09/04/2009
o que é modal ?
como assim um jframe ser modal ?
GOSTEI 0
Ffar
09/04/2009
Gabriel podes explicar melhor? A minha prática em JAVA está muito enferrujada.
Tenho o seguinte:
public class mainClass javax.swing.JFrame {
public showTheOtherClassButtonEvent() {
OtherClass oC = new OthetClass();
}
}
public class OtherClass javax.swing.JFrame {
/** Creates new form OtherClass */
public OtherClass () {
initComponents();
setVisible(true);
}
}
Ou seja, quando clico num botão do form "mainClass" (é chamado o método showTheOtherClassButtonEvent) abre-se o form OtherClass. Eu quero que "OtherClass" seja modal.
victor, ser "modal" significa que o respectivo form enquanto estiver aberto não deixa vc clicar em nada que esteja por baixo noutros forms.
GOSTEI 0
Gabriel Millian
09/04/2009
O mais fácil é vc ao invés de abrir um novo JFrame quando o usuário clicar em um botão, abrir um JDialog e usar o método que eu citei.
Dá uma olhada na documentação do componente:
http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JDialog.html
e no tutorial:
http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html
Veja se esse componente atende as suas necessidades. Caso você necessite implementar essa funcionalidade em um JFrame, você terá que controlar esse comportamento na mão.
GOSTEI 0
Glaucio Melo
09/04/2009
Alguem sabe se versoes mais novas da API já colocaram metodo modal em JFrame? Da ultima vez que precisei fazer isso foi com JDialog. Isso dá margem pra gambiarras feiosas pra modal em JFrame :D
GOSTEI 0
Ffar
09/04/2009
[quote="gabrielpl"]Caso você necessite implementar essa funcionalidade em um JFrame, você terá que controlar esse comportamento na mão.
E qual é o mecanismo para fazer isso?
Não há nenhuma class já feita que controle isso?
GOSTEI 0
Vitor Pamplona
09/04/2009
[quote="Proteu Alcebidiano"]Alguem sabe se versoes mais novas da API já colocaram metodo modal em JFrame? Da ultima vez que precisei fazer isso foi com JDialog. Isso dá margem pra gambiarras feiosas pra modal em JFrame :D
Pelo que sei o Java6 vem com JFrame modal.
GOSTEI 0
Domingos Santos
09/04/2009
Olá bom dia a todos,
Para implementar uma caixa de diálogo, você deriva uma classe de [i]JDialog[/i]. É essencialmente o mesmo processo que derivar a janela para um aplicativo a partir de [i]JFrame[/i].
mais precisamente:
é um exemplo completo, e pode auxiliar no entendimento da classe JDialog. Espero ter ajudado.
atenciosamente
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DialogTeste {
public static void main(String[] args) {
DialogFrame frame = new DialogFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setVisible( true );
}
}
class DialogFrame extends JFrame{
public DialogFrame(){
setTitle("DialogFrame");
setSize( DEFAULT_WIDTH, DEFAULT_HEIGHT );
JMenuBar menuBar = new JMenuBar();
setJMenuBar( menuBar );
JMenu fileMenu = new JMenu("File");
menuBar.add( fileMenu );
JMenuItem aboutItem = new JMenuItem("About");
aboutItem.addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent event )
{
if( dialog == null ) // primeira vez
dialog = new AboutDialog( DialogFrame.this );
dialog.setVisible( true );
}
});
fileMenu.add( aboutItem );
JMenuItem exitItem = new JMenuItem("Exit");
exitItem.addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent event )
{
System.exit(0);
}
});
fileMenu.add( exitItem );
}
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
private AboutDialog dialog;
}
class AboutDialog extends JDialog{
public AboutDialog( JFrame owner ){
super( owner, "About DialogTeste", true );
add( new JLabel( "<html><h1><i>Core Java</i></h1><hr>www.javafree.org</html>" ) , BorderLayout.CENTER );
JButton ok = new JButton("Ok");
ok.addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent event ){
setVisible( false );
}
});
JPanel panel = new JPanel();
panel.add( ok );
add( panel, BorderLayout.SOUTH );
setSize( 250, 150 );
}
}
GOSTEI 0
Vitor Pamplona
09/04/2009
[quote="ffar"][quote="gabrielpl"]Caso você necessite implementar essa funcionalidade em um JFrame, você terá que controlar esse comportamento na mão.
E qual é o mecanismo para fazer isso?
Não há nenhuma class já feita que controle isso? GOSTEI 0
Vitor Pamplona
09/04/2009
Bem, resolvi o problema (mesmo com JFrame) utilizando uma class disponibilizada por um colega nosso.
Para quem necessitar pode ver aqui:
http://www.jroller.com/page/santhosh?entry=are_you_missing_maximize_button
GOSTEI 0