Полноэкранный графический интерфейс Java для нескольких экранов

Надеюсь, я не публикую повторяющийся вопрос, но я не смог найти подобный вопрос, так что, может быть, я в безопасности? Так или иначе...

Для приложений, которые я создаю, я буду открывать два приложения (два отдельных процесса и окна) одновременно. Компьютер, на котором будут работать эти приложения, будет иметь несколько мониторов. Я хочу, чтобы первое приложение/окно было полноэкранным и занимало один из моих мониторов (простая часть), а другое — полноэкранным на втором мониторе. Если возможно, я хотел бы, чтобы они инициализировались таким образом.

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

this.setVisible(false);
this.setUndecorated(true);
this.setResizable(false);
myDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
myDevice.setFullScreenWindow(this);

Класс, в котором он находится, является расширением класса JFrame, а myDevice имеет тип «GraphicsDevice». Вполне возможно, что есть лучший способ сделать мое окно полноэкранным, чтобы я мог иметь два разных приложения в полноэкранном режиме на двух разных мониторах.

Если я был неясен в любом случае, пожалуйста, скажите, и я постараюсь отредактировать разъяснения!


person Sephallia    schedule 01.06.2012    source источник


Ответы (1)


Во-первых, вам нужно расположить свои кадры на каждом экране устройства.

frame1.setLocation(pointOnFirstScreen);
frame2.setLocation(pointOnSecondScreen);

Затем, чтобы максимизировать кадр, просто вызовите это на своем JFrame:

frame.setExtendedState(Frame.MAXIMIZED_BOTH);

Вот рабочий пример, иллюстрирующий это:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Point;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class Test {
    protected void initUI() {
        Point p1 = null;
        Point p2 = null;
        for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) {
            if (p1 == null) {
                p1 = gd.getDefaultConfiguration().getBounds().getLocation();
            } else if (p2 == null) {
                p2 = gd.getDefaultConfiguration().getBounds().getLocation();
            }
        }
        if (p2 == null) {
            p2 = p1;
        }
        createFrameAtLocation(p1);
        createFrameAtLocation(p2);
    }

    private void createFrameAtLocation(Point p) {
        final JFrame frame = new JFrame();
        frame.setTitle("Test frame on two screens");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new BorderLayout());
        final JTextArea textareaA = new JTextArea(24, 80);
        textareaA.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
        panel.add(textareaA, BorderLayout.CENTER);
        frame.setLocation(p);
        frame.add(panel);
        frame.pack();
        frame.setExtendedState(Frame.MAXIMIZED_BOTH);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Test().initUI();
            }
        });
    }

}
person Guillaume Polet    schedule 01.06.2012
comment
Здравствуйте, спасибо за оперативный ответ! Однако, похоже, это ничего не дало. Я прокомментировал то, что я использовал раньше, чтобы установить свой кадр в полноэкранный режим, и добавил, что да, оба приложения стали полноэкранными, но они оба все еще были на одном мониторе. Мне нужно было сделать два приложения полноэкранными, но на разных мониторах. (При инициализации также, если возможно) - person Sephallia; 01.06.2012
comment
@Sephallia Я обновляю свой пост полностью работающим примером, который отправляет два кадра на два экрана (конечно, если у вас 2 экрана). Хитрость заключается в том, чтобы расположить кадр на двух отдельных экранах, а затем развернуть их. - person Guillaume Polet; 01.06.2012
comment
Эй, мне действительно не нужны полные рабочие примеры. Часть, которую вам не хватало раньше, это setLocation. Я думал, что мне, возможно, придется задействовать это, но я действительно не знал, что мне может понадобиться для точки зрения. Большое тебе спасибо! Я бы проголосовал за ваш пост, но у меня все еще нет 15 репутации x:. Прости! - person Sephallia; 01.06.2012
comment
@Sephallia Нет, вы не можете, но вы можете принять ответ: meta.stackexchange.com/questions/16721/ - person Guillaume Polet; 01.06.2012
comment
Ок, спасибо! Я также только что получил еще одну репутацию 5, поэтому я проголосовал за нее. Еще раз спасибо! - person Sephallia; 01.06.2012