Я создаю заставку для Java-приложения, используя класс SplashScreen. Проблема в том, что положение в системах с несколькими мониторами не определено. В документации указано, что «положение в системах с несколькими мониторами не указано - это зависит от платформы и реализации». Приложение будет использоваться исключительно на платформах с несколькими мониторами, и я хотел бы убедиться, что он всегда сосредоточен на одном из экранов. Есть ли способ достичь этого? Приложение будет использоваться только для Linux, поэтому платформа везде одинакова.Центр Java заставки на мультимониторе
ответ
Существует пример эквивалента Javafx экрана Splash. Однако этот экран всплеска - это в основном апплет java swing, который вызывается из javafx для отображения пользователю и имитирует более или менее затмение и заставку netbeans с использованием индикатора выполнения и заголовков для загруженного содержимого.
Ниже приводится ссылка на http://0divides0.wordpress.com/2011/03/17/splash-screen-with-javafx/
Вы должны быть в состоянии получить код и разделите из кода заставки написан в Яве качелей и использовать его для себя.
Это пользовательский java swing splash screen. и, следовательно, к центру экрана заставки она использует традиционные функции
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension labelSize = l.getPreferredSize();
setLocation(screenSize.width/2 - (labelSize.width/2), screenSize.height/2 - (labelSize.height/2));
Затем не используйте встроенный заставку из Java 6. Создайте свой собственный заставку с помощью инструментария пользовательского интерфейса и поместите это окно вручную, вычислив его размер и размер доступных экранов.
Я пробовал это, и он работает до тех пор, пока я загружаю заставку в отдельный поток, прежде чем я начну создавать остальную часть моего графического интерфейса.Однако последняя строка кода, загружающего мой графический интерфейс, нарушает это. Я вызываю KeyboardFocusManager.getCurrentKeyboardFocusManager() \t \t \t .setGlobalCurrentFocusCycleRoot (панель); чтобы сделать «панель» корнем фокуса фокуса, который я должен. Но как только эта строка добавляется в конец моего кода здания GUI, заставка отображается только как серый квадрат. Вот почему я нацелился на класс SplashScreen (который, как я полагаю, должен быть наилучшей практикой для использования в любом случае). – Bulgur
Я думаю, что вы не можете обойтись при использовании встроенного заставки. Это один из недостатков взаимодействия Java-решения, работающего на всех ОС. Но вы рассмотрели использование SwingUtilities.invokeAndWait(), чтобы сериализовать создание и обработку графического интерфейса для настройки всплывающего экрана. Существует также несколько обучающих программ, которые помогут создать AWT/Swing/etc. основанный заставка. http://www.javaworld.com/javaworld/javatips/jw-javatip104.html http://www.randelshofer.ch/oop/javasplash/javasplash.html и т. Д. –
Во-первых: * не управляйте компонентами поворота «в отдельном потоке». * Они предназначены для обновления только из потока отправки событий, и вы, вероятно, получаете серое окно именно по этой причине. – kdgregory
Другой пример код:
// Get the size of the screen
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
// Determine the new location of the window
int w = login.getSize().width;
int h = login.getSize().height;
int x = (dim.width-w)/2;
int y = (dim.height-h)/2;
// Move the window
setLocation(x, y);
setVisible(true);
Это не может быть определенно в контексте Java, но это точно определены в контекст сервера отображения.
Для Linux/X11 важным аспектом является включение или отсутствие XInerama. Это расширение X позволяет приложениям получать информацию о физических дисплеях, которые составляют рабочий стол.
Быстрый способ проверки того, что XInerama включен, - это попытаться максимизировать окно в вашей целевой системе с несколькими мониторами. При включенном XInerama он должен максимизировать размеры активного монитора, а не всю поверхность экрана.
Всплывающие экраны, когда XInerama включен, будет сосредоточен на активном мониторе при запуске приложения.
Если вы фокусируетесь исключительно на правильном включении заставки вашего приложения, вы быстро получите обратную связь по другим проблемам с несколькими мониторами, например, на панели задач, растянутой на всех экранах или окнах, которые максимизируются на всех экранах.
Другое решения центр кадра на экране:
GraphicsConfiguration c = frm.getGraphicsConfiguration();
Rectangle in = c.getBounds();
int center_x = in.x + in.width/2;
int center_y = in.y + in.height/2;
frm.setLocation(center_x - frm.getWidth()/2, center_y - frm.getHeight()/2);
С принятым решением я имел проблему, что кадр отображались на границе два моих экранов. то есть в центре обоих экранов.
Встроенный заставку отображается «до запуска виртуальной машины Java (JVM)». Вы не сможете повлиять на его позицию. * btad * имеет разумный ответ, но обратите внимание на мой комментарий. – kdgregory