Search code examples
javaswingjframemultiple-monitors

Different JFrames on different displays


I have a central database, I connect to it with JDBC and after some preparations with the data, I produce 6 different JFrames, and I like to display each on a different display (monitor) on different walls of the building, which I can reach only over IP (by WiFi) at the same time. Can I solve it with GraphicsEnvironment somehow?

I would be greatful for any advice!


Solution

  • If each screen can be seen by the OS as a seperate graphics device, you should be able to use something like...

    import java.awt.EventQueue;
    import java.awt.GraphicsConfiguration;
    import java.awt.GraphicsDevice;
    import java.awt.GraphicsEnvironment;
    import java.awt.Rectangle;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class TestGC {
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
                    GraphicsDevice[] sds = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
                    for (GraphicsDevice sd : sds) {
                        System.out.println(sd.getIDstring());
                        GraphicsConfiguration gc = sd.getDefaultConfiguration();
                        JFrame f = new JFrame(gc);
                        f.add(new JLabel(sd.getIDstring()));
                        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        f.pack();
                        centerOn(f, gc);
                        f.setVisible(true);
                    }
                }
            });
        }
    
        private static void centerOn(JFrame f, GraphicsConfiguration gc) {
            Rectangle bounds = gc.getBounds();
            int x = bounds.x + ((bounds.width - f.getWidth()) / 2);
            int y = bounds.y + ((bounds.height - f.getHeight()) / 2);
            f.setLocation(x, y);
        }
    }