Java tutorial
import java.awt.Dimension; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.util.HashSet; import java.util.Set; import javax.swing.JFrame; public class Main extends JFrame { State state; Set<StateListener> listeners = new HashSet<StateListener>(); public Main() { state = new State(); addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { state.setSize(getSize(), true); } @Override public void componentMoved(ComponentEvent e) { } @Override public void componentShown(ComponentEvent e) { } @Override public void componentHidden(ComponentEvent e) { } }); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } private void addListener(StateListener sl) { listeners.add(sl); } public void associateWith(Main other) { other.addListener(new MirrorStateListener()); } public static void main(String[] args) { Main f1 = new Main(); Main f2 = new Main(); f1.associateWith(f2); f2.associateWith(f1); f1.setSize(300, 300); f2.setLocation(600, 10); } class State { Dimension size; public void setSize(Dimension newSize, boolean fireEvent) { if (newSize.equals(size)) { return; } size = newSize; Main.this.setSize(size); if (fireEvent) { for (StateListener sl : listeners) { sl.sizeChanged(size); } } } } class MirrorStateListener implements StateListener { @Override public void sizeChanged(Dimension newSize) { state.setSize(newSize, false); } } } interface StateListener { void sizeChanged(Dimension newSize); }