java - una - jframe, jinternalframe y jdialog
Mostrar JDialog en la barra de tareas de Windows (4)
Encontré la respuesta a su pregunta porque tenía el problema opuesto. Tenía un JDialog que se mostraba en la barra de tareas y me llevó mucho tiempo descubrir cómo evitar que se muestre. Resulta que si pasa un padre null
al constructor de JDialog, su diálogo se mostrará en la barra de tareas .
JDialog dialog = new JDialog((Dialog)null);
El lanzamiento a java.awt.Dialog
es para evitar el constructor ambiguo.
Estoy tratando de mostrar un JDialog
en Windows. ¿Cómo muestro un JDialog
(como JFrame
) en mi barra de tareas de Windows?
Los cuadros de diálogo se muestran en la barra de tareas, cuando no tienen propietario. La posibilidad de tener Diálogos sin propietario se agregó a AWT en Java 6. Desafortunadamente, en este momento, la clase Swing JDialog
ya tenía constructores con un comportamiento predefinido con respecto a null
propietarios ausentes o null
, trabajando en torno a las limitaciones de las versiones anteriores de Java. Este comportamiento no se puede cambiar debido a problemas de compatibilidad.
Por lo tanto, cuando utiliza los antiguos constructores JDialog()
y aquellos que aceptan un argumento de Frame
, exhiben el comportamiento compatible con las versiones anteriores, creando un Frame
falso ficticio como propietario si no se especifica ninguno. Entonces, los cuadros de diálogo creados de esta manera siempre son propiedad de un cuadro.
Esto también se incorpora a la documentation :
NOTA: Este constructor no le permite crear un
JDialog
sinJDialog
. Para crear unJDialog
sinJDialog
, debe usar elJDialog(Window)
oJDialog(Dialog)
con un argumento denull
.
Los constructores nombrados son nuevos en Java 6, ya que también se agregó la posibilidad de tener un Window
diálogo propiedad de otro Window
Dialog
o una Window
en esa versión. Dado que estos nuevos constructores no tienen que ser compatibles con una versión anterior, pueden admitir cuadros de diálogo sin propietario. Esta es la razón por la cual la solución en esta respuesta funciona.
También puede usar el constructor tomando ModalityType
como en esta respuesta ya que este constructor también es nuevo dos Java 6 y admite diálogos sin propietario. Pero no es necesario crear una subclase de JDialog
para usar este constructor.
Un cuadro de diálogo no puede tener una entrada en la barra de tareas, pero puede construir un cuadro que no tenga ningún efecto visible y usarlo como elemento principal para el cuadro de diálogo. Entonces se verá como si el diálogo tuviera una entrada en la barra de tareas. El siguiente código muestra cómo hacerlo:
class MyDialog extends JDialog {
private static final List<Image> ICONS = Arrays.asList(
new ImageIcon("icon_16.png").getImage(),
new ImageIcon("icon_32.png").getImage(),
new ImageIcon("icon_64.png").getImage());
MyDialog() {
super(new DummyFrame("Name on task bar", ICONS));
}
public void setVisible(boolean visible) {
super.setVisible(visible);
if (!visible) {
((DummyFrame)getParent()).dispose();
}
}
}
class DummyFrame extends JFrame {
DummyFrame(String title, List<? extends Image> iconImages) {
super(title);
setUndecorated(true);
setVisible(true);
setLocationRelativeTo(null);
setIconImages(iconImages);
}
}
class MyDialog extends JDialog {
MyDialog() {
super(null, java.awt.Dialog.ModalityType.TOOLKIT_MODAL);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
}