private static void listenToLafChange() {
		if( thread != null )
			return;

		thread = new Thread( "FlatLaf Laf change listener" ) {
			MulticastSocket socket;

			@Override
			public void run() {
				try( MulticastSocket socket = new MulticastSocket( MULTICAST_PORT ) ) {
					this.socket = socket;
					socket.joinGroup( InetAddress.getByName( MULTICAST_ADDRESS ) );

					byte[] buffer = new byte[Long.BYTES];
					for(;;) {
						DatagramPacket packet = new DatagramPacket( buffer, buffer.length );
						socket.receive( packet );

						long id = ByteBuffer.wrap( buffer ).getLong();
						if( id == PROCESS_ID )
							continue; // was sent from this process

						EventQueue.invokeLater( () -> {
							notifyEnabled = false;
							try {
								restoreLaf();
								FlatLaf.updateUI();
							} catch( Throwable ex ) {
								LoggingFacade.INSTANCE.logSevere( null, ex );
							} finally {
								notifyEnabled = true;
							}
						} );
					}
				} catch( IOException ex ) {
					if( ex instanceof SocketException && "Socket closed".equals( ex.getMessage() ) )
						return; // interrupted

					LoggingFacade.INSTANCE.logSevere( null, ex );
				}
			}

			@Override
			public void interrupt() {
				super.interrupt();
				socket.close();
			}
		};
		thread.setDaemon( true );
		thread.start();
	}
register Alt+Shift+F1, F2, ... F12 keys to change system scale factor
flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoPrefs.java