複数のダイアログを持つ非常に大きなアプリケーションがあります。私の仕事は、(ユーザーが表示可能な画面領域から引き出したために)完全に表示されていないダイアログが画面の中央に戻されるようにすることです。
1 つの画面だけを扱っている場合は問題ありません。問題なく動作します...ただし、このアプリケーションのほとんどのユーザーは、デスクトップに 2 つの画面を持っています...
ダイアログが表示されている画面を特定し、その特定の画面の中央に配置しようとすると...まあ、実際には中央に表示されますが、プライマリ画面(ダイアログが表示されている画面ではない場合があります)。
これまでの私の考えを示すために、ここにコードを示します...
/**
* Get the number of the screen the dialog is shown on ...
*/
private static int getActiveScreen(JDialog jd) {
int screenId = 1;
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gd = ge.getScreenDevices();
for (int i = 0; i < gd.length; i++) {
GraphicsConfiguration gc = gd[i].getDefaultConfiguration();
Rectangle r = gc.getBounds();
if (r.contains(jd.getLocation())) {
screenId = i + 1;
}
}
return screenId;
}
/**
* Get the Dimension of the screen with the given id ...
*/
private static Dimension getScreenDimension(int screenId) {
Dimension d = new Dimension(0, 0);
if (screenId > 0) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
DisplayMode mode = ge.getScreenDevices()[screenId - 1].getDisplayMode();
d.setSize(mode.getWidth(), mode.getHeight());
}
return d;
}
/**
* Check, if Dialog can be displayed completely ...
* @return true, if dialog can be displayed completely
*/
private boolean pruefeDialogImSichtbarenBereich() {
int screenId = getActiveScreen(this);
Dimension dimOfScreen = getScreenDimension(screenId);
int xPos = this.getX();
int yPos = this.getY();
Dimension dimOfDialog = this.getSize();
if (xPos + dimOfDialog.getWidth() > dimOfScreen.getWidth() || yPos + dimOfDialog.getHeight() > dimOfScreen.getHeight()) {
return false;
}
return true;
}
/**
* Center Dialog...
*/
private void zentriereDialogAufMonitor() {
this.setLocationRelativeTo(null);
}
getActiveScreen()
デバッグ中に、私はそれがうまくいかないように見えるという事実に出くわしました。常に2を返すようです(これは、ダイアログが常に2番目のモニターに表示されることを意味するため、これは一種のくだらないことです...もちろん真実ではありません)。
私のダイアログを実際に表示されている画面の中央に配置する方法を知っている人はいますか?