Java Jframe запускает другой JFrame на другой X-сервер

У меня есть java-приложение, которое запускается на экране Xvnc (в Ubuntu) (DISPLAY: 1), мне нужно запустить другой JFrame на главный экран DISPLAY: 0 из одного приложения, то есть того, которое работает в DISPLAY: 1.

Я думаю об использовании Runtime.getRuntime().exec(), но проблема в том, что мне нужно управлять вторыми свойствами JFrame из основного приложения.

Пожалуйста, помогите, как я могу этого добиться. Спасибо. Мне не нужно кросс-платформенное решение, только для Ubuntu.

ОБНОВИТЬ:

я использовал код

try{
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] gd = ge.getScreenDevices();
    for(int i = 0; i < gd.length; i++){
        System.out.println(gd[i]);
    }
} catch (Exception e){
    e.printStackTrace();
}

И я получаю только один дисплей X11GraphicsDevice[screen=0], что означает, что GraphicsDevice[] gd = ge.getScreenDevices(); имеет только 1 устройство. Мой сервер XVNC X11 (DISPLAY:1) не обнаружен.


person Lee    schedule 03.04.2014    source источник


Ответы (2)


Вот как установить кадр на дисплей
Сделайте этот экземпляр данными для класса:

public class Graphic{
 private GraphicsEnvironment graphicsEnviorment;
 private DisplayMode dm, dm_old;
 private    JFrame frame1=new JFrame(), frame2 =new JFrame(); // we now have access to both jframes

public void makeScreen(){
    graphicsEnviorment = GraphicsEnvironment.getLocalGraphicsEnvironment();

    GraphicsDevice[] devices = graphicsEnviorment.getScreenDevices();

    dm_old = devices[0].getDisplayMode(); // replace 0 with screen #
    dm = dm_old;
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

    //place dead center on screen 
    int windowX = Math.max(0, (screenSize.width - frame.getWidth()) / 2);
    int windowY = Math.max(0, (screenSize.height - frame.getHeight()) / 2);

    frame1.setLocation(windowX, windowY);

             frame1.setVisable(true);
             // frame 2

            dm_old = devices[0].getDisplayMode(); // replace 0 with screen #
    dm = dm_old;
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

    //place dead center on screen 
    int windowX = Math.max(0, (screenSize.width - frame.getWidth()) / 2);
    int windowY = Math.max(0, (screenSize.height - frame.getHeight()) / 2);
    frame2.setLocation(windowX, windowY);

             frame2.setVisable(true);

            }
}

Теперь используйте платформу наблюдателя (слушатели), чтобы передать изменения между двумя кадрами...

person TheBetaProgrammer    schedule 03.04.2014
comment
Спасибо, я пробовал ваш код, но использование devices[1] дает мне исключение ArrayIndexOutOfBound. обратите внимание, что я активировал свой сервер XVNC при попытке кода. - person Lee; 03.04.2014

К сожалению, решение TheBetaProgrammer состоит в том, чтобы отображать JFrames на 2 экранах одного и того же дисплея, а не на 2 разных дисплеях. Я ищу то же самое в течение последних нескольких дней и не нашел простого способа сделать это. Пока у меня будет 2 приложения, каждое на своем дисплее, которые общаются друг с другом с помощью JGroups (я отправляю события действия напрямую между двумя приложениями).

person jmspaggi    schedule 11.07.2014