Después de buscar por un tiempo, no pude encontrar ninguna solución realmente satisfactoria. Creo que el cambio de tamaño del cuadro de diálogo es algo que se maneja directamente en el nivel del sistema operativo y, por lo tanto, solo puede decir que lo quiere totalmente no redimensionable o totalmente redimensionable.
El código siguiente siempre evitará que el diálogo sea más grande, pero a medida que el usuario cambia el tamaño del cuadro de diálogo, los bordes del cuadro de diálogo se mueven.
La otra opción, también sugerida por radai, sería evitar el cambio de tamaño y establecer un panel de contenido personalizado con un detector de mouse que escuche el mouse y cambie el tamaño en consecuencia. Sin embargo, creo que esto no será muy natural para el usuario (no creo que puedas ver los eventos en el borde del diálogo).
import java.awt.Frame;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JDialog;
import javax.swing.JRootPane;
import javax.swing.SwingUtilities;
public class Test {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
init();
}
});
}
public static void init() {
final int staticHeight = 150;
final JDialog dialog = new JDialog((Frame) null) {
@Override
protected JRootPane createRootPane() {
JRootPane rp = new JRootPane() {
@Override
public void reshape(int x, int y, int w, int h) {
super.reshape(x, y, w, staticHeight);
}
};
rp.setOpaque(true);
return rp;
}
@Override
public void reshape(int x, int y, int width, int height) {
super.reshape(x, y, width, staticHeight);
}
};
dialog.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
dialog.setSize(dialog.getWidth(), staticHeight);
}
});
dialog.pack();
dialog.setVisible(true);
}
}
+1, que me hizo aprender algo hoy :-) –