code: package io.github.contractautomata.catapp;
  
  import java.awt.BorderLayout;
  import java.awt.Color;
  import java.awt.FlowLayout;
  import java.awt.Font;
  import java.awt.Frame;
  import java.awt.GradientPaint;
  import java.awt.Graphics;
  import java.awt.Graphics2D;
  import java.awt.event.KeyEvent;
  
  import javax.swing.BorderFactory;
  import javax.swing.BoxLayout;
  import javax.swing.JButton;
  import javax.swing.JComponent;
  import javax.swing.JDialog;
  import javax.swing.JLabel;
  import javax.swing.JPanel;
  import javax.swing.JRootPane;
  import javax.swing.KeyStroke;
  
  public class EditorAboutFrame extends JDialog
  {
  
  	/**
  	 * 
  	 */
  	private static final long serialVersionUID = -3378029138434324390L;
  
  	/**
  	 * 
  	 */
  	public EditorAboutFrame(Frame owner)
  	{
  		super(owner);
  		setTitle("about Contract Automata Tool");//mxResources.get("aboutGraphEditor"));
  		setLayout(new BorderLayout());
  
  		// Creates the gradient panel
  		JPanel panel = new JPanel(new BorderLayout())
  		{
  
  			/**
  			 * 
  			 */
  			private static final long serialVersionUID = -5062895855016210947L;
  
  			/**
  			 * 
  			 */
  			public void paintComponent(Graphics g)
  			{
  				super.paintComponent(g);
  
  				// Paint gradient background
  				Graphics2D g2d = (Graphics2D) g;
  				g2d.setPaint(new GradientPaint(0, 0, Color.WHITE, getWidth(),
  						0, getBackground()));
  				g2d.fillRect(0, 0, getWidth(), getHeight());
  			}
  
  		};
  
  		panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
  				.createMatteBorder(0, 0, 1, 0, Color.GRAY), BorderFactory
  				.createEmptyBorder(8, 8, 12, 8)));
  
  		// Adds title
  		JLabel titleLabel = new JLabel("about Contract Automata Tool");
  		titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD));
  		titleLabel.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0));
  		titleLabel.setOpaque(false);
  		panel.add(titleLabel, BorderLayout.NORTH);
  
  		// Adds optional subtitle
  		JLabel subtitleLabel = new JLabel(
  				"<html> Contract Automata Tool (2022),  <br />"
  				+ "info at https://github.com/contractautomataproject/ContractAutomataLib,  <br />"
  				+ "developed by Davide Basile (https://github.com/contractautomataproject),  <br />"
  				+ "GUI adapted from mxGraph BasicGraphEditor (https://jgraph.github.io/mxgraph/) </html>");
  		subtitleLabel.setBorder(BorderFactory.createEmptyBorder(4, 18, 0, 0));
  		subtitleLabel.setOpaque(false);
  		panel.add(subtitleLabel, BorderLayout.CENTER);
  
  		getContentPane().add(panel, BorderLayout.NORTH);
  
  		JPanel content = new JPanel();
  		content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
  		content.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));
  
  
  		try
  		{
  			content.add(new JLabel("Operating System Name: "
  					+ System.getProperty("os.name")));
  			content.add(new JLabel("Operating System Version: "
  					+ System.getProperty("os.version")));
  			content.add(new JLabel(" "));
  
  			content.add(new JLabel("Java Vendor: "
  					+ System.getProperty("java.vendor", "undefined")));
  			content.add(new JLabel("Java Version: "
  					+ System.getProperty("java.version", "undefined")));
  			content.add(new JLabel(" "));
  
  			content.add(new JLabel("Total Memory: "
  					+ Runtime.getRuntime().totalMemory()));
  			content.add(new JLabel("Free Memory: "
  					+ Runtime.getRuntime().freeMemory()));
  		}
  		catch (Exception e)
  		{
  			// ignore
  		}
  
  		getContentPane().add(content, BorderLayout.CENTER);
  
  		JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
  		buttonPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory
  				.createMatteBorder(1, 0, 0, 0, Color.GRAY), BorderFactory
  				.createEmptyBorder(16, 8, 8, 8)));
  		getContentPane().add(buttonPanel, BorderLayout.SOUTH);
  
  		// Adds OK button to close window
  		JButton closeButton = new JButton("Close");
  		closeButton.addActionListener(e -> setVisible(false));
  
  		buttonPanel.add(closeButton);
  
  		// Sets default button for enter key
  		getRootPane().setDefaultButton(closeButton);
  
  		setResizable(true);
  		setSize(600, 600);
  	}
  
  	/**
  	 * Overrides {@link JDialog#createRootPane()} to return a root pane that
  	 * hides the window when the user presses the ESCAPE key.O
  	 */
  	protected JRootPane createRootPane()
  	{
  		KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
  		JRootPane rootPane = new JRootPane();
  		rootPane.registerKeyboardAction(actionEvent -> setVisible(false), stroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
  		return rootPane;
  	}
  
  }
  