JDialogをデスクトップサイズに最大化する要件が出てきたんだけど、JDialogはJFrameのように最大化ボタンがついていない。
そこで、JDialogを疑似的にデスクトップサイズに最大化する処理を作成したんだけど、最大化時にダイアログを動かした際に標準サイズに戻す動作にしたいといった要件も出てきた。
そこで、以下のようなリスナーを作成したんだけど、なかなかうまくいかない。
どうもマウスドラッグ中に強引にダイアログサイズを変更しても、元に戻してしまうようだ。
試行錯誤するとダイアログのサイズを設定する前にdispose()を実行することで、マウス操作がキャンセルされる。そのタイミングでダイアログサイズを設定すると、きれいな動作になってくれた。
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
public class CancelMaximumStateListener extends ComponentAdapter {
private Rectangle _maximumSize = null;
private Rectangle _restoreSize = null;
public CancelMaximumStateListener(Rectangle maximumSize) {
_maximumSize = maximumSize;
}
@Override
public void componentMoved(ComponentEvent e) {
if (_restoreSize == null) {
return;
}
TMDialog dialog = (TMDialog) e.getComponent();
Dimension size = dialog.getSize();
Point location = dialog.getLocation();
if (_maximumSize.getSize().equals(size) &&
!_maximumSize.getLocation().equals(location)) {
dialog.setResizable(true);
dialog.dispose();
dialog.setBounds(_restoreSize);
dialog.setRestoreSize(null);
dialog.setVisible(true);
}
}
public void setRestoreSize(Rectangle restoreSize) {
_restoreSize = restoreSize;
}
}
元に戻す際のサイズを共通管理したかったので、JDialogを継承したクラスを作成した。まあ、こっちは上で作成したリスナーのインスタンスをダイアログ自体に設定しているだけなので、そんなに大したことはしていない。
import java.awt.Frame;
import java.awt.Rectangle;
import javax.swing.JDialog;
public class TMDialog extends JDialog {
private CancelMaximumStateListener _cancelListener = null;
private Rectangle _restoreSize = null;
public TMDialog(Frame parent, boolean modal) {
super(parent, modal);
_cancelListener = new
CancelMaximumStateListener(ScreenUtils.getDesktopScreen());
addComponentListener(_cancelListener);
}
public Rectangle getResotoreSize() {
return _restoreSize;
}
public void setRestoreSize(Rectangle restoreSize) {
_restoreSize = restoreSize;
_cancelListener.setRestoreSize(restoreSize);
}
}