しばらく探した後、本当に満足のいく解決策を見つけることができませんでした。ダイアログのサイズ変更はOSレベルで直接処理されるものだと思います。したがって、完全にサイズ変更できない、または完全にサイズ変更できないようにする必要があるとしか言えません。
以下のコードは、ダイアログが大きくなるのを常に防ぎますが、ユーザーがダイアログのサイズを変更しても、ダイアログの境界線は移動します。
同じくradaiによって提案された他のオプションは、サイズ変更を防ぎ、マウスをリッスンしてそれに応じてサイズ変更するマウスリスナーでカスタムコンテンツペインを設定することです。ただし、これはユーザーにとってあまりネイティブではないと思います(ダイアログの境界でイベントをキャッチできるとは思いません)。
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);
}
}