import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.desktop.OpenFilesEvent;
import java.awt.Desktop;
import java.util.Map;
import java.util.Iterator;

public class Main {
    JFrame frame;
    JLabel label;
    
    public Main() {
System.out.println("Defining the frame");
        frame = new JFrame("Main");
        label = new JLabel("Hello world!");
        label.setFont(label.getFont().deriveFont(24f));
        frame.getContentPane().add(label, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public void info() {
Map<String,String> map = Map.of("Operating system", "os.name",
"OS Version", "os.version",
"Architecture", "os.arch",
"Java version", "java.version",
"Java home", "java.home");
Iterator<Map.Entry<String,String>> iter =
map.entrySet().iterator();

while (iter.hasNext()) {
Map.Entry<String,String> entry = iter.next();
System.out.println(String.format("%-20s", entry.getKey())+": "+
System.getProperty(entry.getValue()));
}


    }
    public void gotFile(OpenFilesEvent e) {
        System.out.println("Open called with " + e.getFiles().size()+" files");
        label.setText("Fired open files: " + e.getFiles().size());
        label.setOpaque(true);
        label.setBackground(new Color((int)(Math.random() * 0x1000000)));
        frame.pack();
    }
    public void bind_later() {
System.out.println("Bind with invokeLater");
        Desktop.getDesktop().setOpenFileHandler(e -> {
                SwingUtilities.invokeLater(() -> { gotFile(e); }); });
    }
    public void bind() {
System.out.println("Bind");
        Desktop.getDesktop().setOpenFileHandler(e -> {
                gotFile(e);});
    }
    public void show() {
System.out.println("Show the GUI");
        frame.pack();
        frame.setVisible(true);
    }
    public void run1()
    {
System.out.println("Run version 1");
        show();
        bind_later();
    }
    public void run2()
    {
System.out.println("Run version 2");
        bind();
        show();
    }
    public static void main(String[] args) {
System.out.println("Running Main");

int type = 2;
if (args.length > 0) type = Integer.parseInt(args[0]);


Main m = new Main();
m.info();
        if (type == 1) SwingUtilities.invokeLater(() -> { m.run1(); });
        else SwingUtilities.invokeLater(() -> { m.run2(); });
    }
}
