Mam naprawdę dużą aplikację, która ma wiele okien dialogowych. Moim zadaniem jest upewnienie się, że okno dialogowe, które nie jest całkowicie widoczne (ponieważ użytkownik wyciągnął je z widocznego obszaru ekranu), zostaje przeniesione z powrotem na środek ekranu.Jak ustalić, na którym ekranie jest wyświetlany JDialog
Nie ma problemu, gdy mam do czynienia tylko z jednym ekranem. Działa to dobrze ... jednak większość użytkowników tej aplikacji ma dwa ekrany na swoim pulpicie ...
Kiedy próbuję ustalić, na którym ekranie jest wyświetlane okno dialogowe i wyśrodkować je na tym ekranie,. ... cóż, faktycznie TO wyśrodkowuje, ale na głównym ekranie (który może nie być ekranem, na którym wyświetlane jest okno dialogowe).
Aby pokazać, co moje myśli były tak daleko, oto kod ...
/**
* 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);
}
Podczas debugowania rodzaj natknął się na fakt, że getActiveScreen()
nie wydają się działać tak, jak ja chociaż; wydaje się, że zawsze zwraca 2 (co jest rodzajem bzdur, ponieważ oznaczałoby to, że dialog jest zawsze pokazywany na drugim monitorze ... co oczywiście nie jest prawdą).
Ktoś ma pomysł, jak wyśrodkować moje okno dialogowe na ekranie, na którym faktycznie jest wyświetlany?
Ile ekranów będzie wyświetlać się na wielu ekranach? –
Nie jestem pewien, czy dostanę twoje pytanie, ale jeśli zrozumiałem to poprawnie, ... nie wiem. Nie ma to znaczenia, ponieważ pozycja dialogów jest zapisywana i sprawdzana za każdym razem, gdy okno staje się widoczne ... czy to odpowiada na twoje pytanie? :-) – gilaras
Dlaczego nie określisz lokalizacji na ekranie dla okna dialogowego? –