1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| public class DemoMenu {
public static void main(String[] args) {
JFrame frame = new JFrame("Démo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
List<MenuHandler> handlers = createMenus(frame);
JTextField field = new JTextField(20);
JPanel panel = new JPanel();
panel.add(field);
frame.add(panel);
// les menus sont fermés, donc on peut faire le changement sur ActionListener
field.addActionListener(e-> updateMenuItem(field.getText(), handlers));
// pour mettre à jour les menus, il faut écouter chaque changemen intermédiaire, parce le menu est visible
field.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
updateMenu(field.getText(), handlers);
}
@Override
public void removeUpdate(DocumentEvent e) {
updateMenu(field.getText(), handlers);
}
@Override
public void changedUpdate(DocumentEvent e) {
updateMenu(field.getText(), handlers);
}
});
// on met à jour dés le début
updateMenu(field.getText(), handlers);
updateMenuItem(field.getText(), handlers);
frame.setSize(300,200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static void updateMenuItem(String texte, List<MenuHandler> handlers) {
for(MenuHandler menuHandler : handlers) {
menuHandler.updateMenuItem(texte);
}
}
protected static void updateMenu(String texte, List<MenuHandler> handlers) {
for(MenuHandler menuHandler : handlers) {
menuHandler.updateMenu(texte);
}
}
private static List<MenuHandler> createMenus(JFrame frame) {
List<MenuHandler> menus = new ArrayList<>();
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Un menu");
menuBar.add(menu);
menus.add(new MenuHandler("Un menu {0}", menu));
JMenuItem menuItem1 = new JMenuItem("Un menu item");
menu.add(menuItem1);
menus.add(new MenuHandler("Un menu item {0}", menuItem1));
JMenuItem menuItem2 = new JMenuItem("Un autre menu item");
menu.add(menuItem2);
menus.add(new MenuHandler("{0} est dans l''autre menu item", menuItem2));
JMenuItem menuItem3 = new JMenuItem("Un autre menu item qui ne contiendra pas le texte");
menu.add(menuItem3);
frame.setJMenuBar(menuBar);
return menus;
}
public static class MenuHandler {
private JMenuItem menuItem;
private String pattern;
public MenuHandler(String pattern, JMenuItem menuItem) {
this.menuItem=menuItem;
this.pattern=pattern;
}
public void updateMenuItem(String texte) {
if ( !(menuItem instanceof JMenu) ) {
menuItem.setText( MessageFormat.format(pattern, new Object[]{ texte}));
}
}
public void updateMenu(String texte) {
menuItem.setText( MessageFormat.format(pattern,new Object[]{ texte}));
}
}
} |
Partager