He creado una GUI en la que he utilizado un JFrame. ¿Cómo debería hacerlo Modal?Cómo hacer un JFrame Modal en Swing java
Respuesta
Su mejor opción es utilizar un JDialog en lugar de un JFrame si desea que la ventana sea modal. Consulte details on the introduction of the Modality API in Java 6 para obtener información. También hay a tutorial.
Aquí algunos ejemplos de código el cual mostrará una JPanel panel
en un JDialog
que es modal para Frame parentFrame
. Excepto por el constructor, esto sigue el mismo patrón que abrir un JFrame
.
final JDialog frame = new JDialog(parentFrame, frameTitle, true);
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
Editar: Modalidad actualizado enlace API & añadido enlace tutorial (guiño a @spork de la protuberancia).
miedo que parece ser la única solución . Estoy luchando contra este mismo problema con un código heredado. Tengo un JFrame que realmente necesito ser modal. Hacer el trabajo para convertirlo todo en JDialog realmente va a ser feo ... :-( –
¿Puede abrirlo? Cree un JDialog modal e invisible, haga que cree una instancia del JFrame y, cuando el JFrame esté cerrado, capture los valores si es necesario, y cierre el JDialog – Redandwhite
El enlace está roto :(todavía hay personas que intentan aprender a partir de estos 3 años. Pruebe esto en 2013: http://docs.oracle.com/javase/tutorial/uiswing/misc/ modality.html – Spork
Por lo que sé, JFrame no puede hacer el modo modal. Utilice JDialog en su lugar y llame al setModalityType(Dialog.ModalityType type)
para configurarlo para que sea modal (o no modal).
Puede crear una clase a la que se le pasa una referencia al elemento primario JFrame
y la mantiene en una variable JFrame
. Luego puede bloquear el marco que creó su nuevo marco.
parentFrame.disable();
//Some actions
parentFrame.enable();
nice, me hizo pensar en un ciclo para "suspender" (duerma) la aplicación mientras el marco es Visible(), thx! –
Kamil, Imgonzalves, ¿me puede aclarar? ¿Está diciendo que la nueva clase debería crearse en el JDialog, JFrame o lo que sea que crea el tema del OP JFra ¿yo? –
no está seguro de los contetns de su JFrame, si le preguntas a algunas aportaciones de los usuarios, puede utilizar JOptionPane, esto también puede establecer JFrame como modal
JFrame frame = new JFrame();
String bigList[] = new String[30];
for (int i = 0; i < bigList.length; i++) {
bigList[i] = Integer.toString(i);
}
JOptionPane.showInputDialog(
frame,
"Select a item",
"The List",
JOptionPane.PLAIN_MESSAGE,
null,
bigList,
"none");
}
Si está preparado para utilizar una JDialog en lugar de JFrame, puede configurar ModalityType en APPLICATION_MODAL.
Esto proporciona un comportamiento idéntico a su JOptionPane típica:
import java.awt.event.ActionEvent;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
public class MyDialog extends JFrame {
public MyDialog() {
setBounds(300, 300, 300, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setLayout(new FlowLayout());
JButton btn = new JButton("TEST");
add(btn);
btn.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
showDialog();
}
});
}
private void showDialog()
{
JDialog dialog = new JDialog(this, Dialog.ModalityType.APPLICATION_MODAL);
//OR, you can do the following...
//JDialog dialog = new JDialog();
//dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
dialog.setBounds(350, 350, 200, 200);
dialog.setVisible(true);
}
public static void main(String[] args)
{
new MyDialog();
}
}
Hay un poco de código que podría ayudar:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class ModalJFrame extends JFrame {
Object currentWindow = this;
public ModalJFrame()
{
super();
super.setTitle("Main JFrame");
super.setSize(500, 500);
super.setResizable(true);
super.setLocationRelativeTo(null);
JMenuBar menuBar = new JMenuBar();
super.setJMenuBar(menuBar);
JMenu fileMenu = new JMenu("File");
JMenu editMenu = new JMenu("Edit");
menuBar.add(fileMenu);
menuBar.add(editMenu);
JMenuItem newAction = new JMenuItem("New");
JMenuItem openAction = new JMenuItem("Open");
JMenuItem exitAction = new JMenuItem("Exit");
JMenuItem cutAction = new JMenuItem("Cut");
JMenuItem copyAction = new JMenuItem("Copy");
JMenuItem pasteAction= new JMenuItem("Paste");
fileMenu.add(newAction);
fileMenu.add(openAction);
fileMenu.addSeparator();
fileMenu.add(exitAction);
editMenu.add(cutAction);
editMenu.add(copyAction);
editMenu.addSeparator();
editMenu.add(pasteAction);
newAction.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
JFrame popupJFrame = new JFrame();
popupJFrame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
((Component) currentWindow).setEnabled(true); }
});
((Component) currentWindow).setEnabled(false);
popupJFrame.setTitle("Pop up JFrame");
popupJFrame.setSize(400, 500);
popupJFrame.setAlwaysOnTop(true);
popupJFrame.setResizable(false);
popupJFrame.setLocationRelativeTo(getRootPane());
popupJFrame.setVisible(true);
popupJFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
}
});
exitAction.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
System.exit(0);
}
});
}
public static void main(String[] args) {
ModalJFrame myWindow = new ModalJFrame();
myWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myWindow.setVisible(true);
}
}
- Crear una nueva forma JPanel
- añaden sus componentes deseados y codificarlo
YourJPanelForm stuff = new YourJPanelForm();
JOptionPane.showMessageDialog(null,stuff,"Your title here bro",JOptionPane.PLAIN_MESSAGE);
espera su diálogo modal ...
Ou, pero hay un botón Aceptar, que no quiero. –
Espera, ¿qué? ¿Simplemente puede agregar el JPanel al JDialog de esa manera? – Zizouz212
esto no tiene nada que ver con un jFrame –
Lo que he hecho en este caso es, en el JFrame principal que quiero mantener visible (por ejemplo, un marco de menús), Anulo la opción focusableWindowState
en la ventana de propiedades, así será FALSE
. Una vez hecho esto, los jframes que llamo no pierden el foco hasta que los cierro.
basta con sustituir JFrame
a JDialog
en clase
public class MyDialog extends JFrame // delete JFrame and write JDialog
y luego escribir setModal(true);
en el constructor
Después de que usted será capaz de construir su formulario en NetBeans y la forma se convierte en modal
No tenía conocimiento de 'setModal (true);' .. esto es genial – db2791
necesita decir que esto no funciona en netbeans porque su editor de formularios establece la operación de cierre en el diálogo de cierre que no es permitido en jdialog –
Este método de utilidad estática muestra un JFrame modal al abrir secretamente un JDialog modal también. Lo utilicé con éxito y con un comportamiento adecuado en Windows 7, 8 y 10 con múltiples escritorios.
Es un buen ejemplo para la característica muy rara vez utilizada de clases locales.
import javax.swing.*;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
// ... (class declaration)
/**
* Shows an already existing JFrame as if it were a modal JDialog. JFrames have the upside that they can be
* maximized.
* <p>
* A hidden modal JDialog is "shown" to effect the modality.
* <p>
* When the JFrame is closed, this method's listener will pick up on that, close the modal JDialog, and remove the
* listener.
*
* made by dreamspace-president.com
*
* @param window the JFrame to be shown
* @param owner the owner window (can be null)
* @throws IllegalArgumentException if argument "window" is null
*/
public static void showModalJFrame(final JFrame window, final Frame owner) {
if (window == null) {
throw new IllegalArgumentException();
}
window.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
window.setVisible(true);
window.setAlwaysOnTop(true);
final JDialog hiddenDialogForModality = new JDialog(owner, true);
final class MyWindowCloseListener extends WindowAdapter {
@Override
public void windowClosed(final WindowEvent e) {
window.dispose();
hiddenDialogForModality.dispose();
}
}
final MyWindowCloseListener myWindowCloseListener = new MyWindowCloseListener();
window.addWindowListener(myWindowCloseListener);
final Dimension smallSize = new Dimension(80, 80);
hiddenDialogForModality.setMinimumSize(smallSize);
hiddenDialogForModality.setSize(smallSize);
hiddenDialogForModality.setMaximumSize(smallSize);
hiddenDialogForModality.setLocation(-smallSize.width * 2, -smallSize.height * 2);
hiddenDialogForModality.setVisible(true);
window.removeWindowListener(myWindowCloseListener);
}
La manera más sencilla es utilizar pack() método antes de la visualización de la objeto JFrame. aquí es un ejemplo:
myFrame frm = new myFrame();
frm.pack();
frm.setVisible(true);
¿cómo se relaciona esto? – Enerccio
- 1. Java Swing JFrame Layout
- 2. ¿Cómo hacer un JFrame desplazable en Java?
- 3. Creando un Java Swing JFrame con una forma circular?
- 4. Java/Swing: Obtenga Window/JFrame desde dentro de un JPanel
- 5. Java: ¿cómo hacer doble buffer en Swing?
- 6. Java Swing: ¿Pantalla de carga modal?
- 7. cómo visualizar consola java en JFrame/JPanel
- 8. Java Pulsaciones de Swing: cómo hacer el trabajo CTRL-modificador
- 9. ¿Por qué Swing JFrame siempre es accesible?
- 10. Java Swing - ¿Cómo hacer un sonido antes de cualquier JOptionPane?
- 11. JFrame en Java
- 12. Ventana emergente en Java Swing
- 13. Java Swing elemento transiciones
- 14. ¿Cómo hacer DialogFragment modal?
- 15. ¿Cómo hacer un lienzo con Swing?
- 16. Java haciendo un 'punto/píxel' En swing/awt
- 17. Java setMaximumSize swing no trabaja
- 18. pregunta general sobre Java Swing
- 19. Cómo hacer una columnas en JTable Invisible para Swing Java
- 20. ¿Cómo hacer un JFrame realmente a pantalla completa?
- 21. Hacer un JFrame y Objeto Observable
- 22. Java Swing ventanas "niños"
- 23. Java Swing: ¿cómo desplazarse por un JTextArea?
- 24. Java GUI Swing Model Explicación
- 25. ¿Cómo enfocar un JFrame?
- 26. Mostrar imagen en Java JFrame
- 27. ¿Cómo aprender Java Swing y hacer GUIs rápidamente?
- 28. ¿Cómo eliminar todos los componentes de un JFrame en Java?
- 29. Cómo deshabilitar JFrame principal cuando abre nuevo JFrame
- 30. ¿Cómo hacer que JFrame sea transparente?
Véase también [? El uso de múltiples JFrames, Buena Mala Práctica /] (http://stackoverflow.com/a/9554657/418556) –