Editar: Tengo la sensación de que la gente no creía que esto fuera posible o fácil, así que lo hice - tardé aproximadamente una hora desde cero - me hubiera llevado 40 minutos si hubiera usado un solo método como un objetivo en lugar de reflejarlo para separar los métodos para cada elemento del menú.
Aquí está el Tested source code. Funciona, pero es un gran método y feo: refactorícelo si lo usa. Puedo arreglarlo un poco en los próximos días, siempre he querido tener una copia de esto para reutilizar.
--- post original
En primer lugar, recuerde que debe separar el código de datos. Eso significa que usted NUNCA debe escribir:
new Menu("File...");
La cadena "Archivo ..." es datos. Si comienzas a pensar de esta manera, encontrarás que tu pregunta se responde a sí misma.
Primero necesita crear algunos datos. Debe obtener "Archivo ..." y "Guardar" en los menús. Yo por lo general comenzar, con una matriz de cadenas (que se puede mover fácilmente a un archivo)
new String[]{"File...","+Save","Load"...}
Este es uno de los patrones más simples que he comenzó con. Luego puede analizar el signo + y usarlo para indicar "Desplegar un nivel en el menú cuando agrega este"
Esto es sólo una convención tonta, invente la suya propia si no le gusta.
El siguiente paso es vincularlo al código para ejecutar. Puede hacer que todos llamen al mismo método, pero qué dolor en el culo (declaración de cambio gigante). Una posibilidad es utilizar la reflexión para vincular un nombre de método mientras está leyendo en los datos. He aquí una solución (de nuevo, no podría adaptarse a sus gustos)
new String[]{"File...[fileMenu]","+Save[saveMenu]","Load[loadMenu]"...}
A continuación, analizar fuera de la cosa entre corchetes, reflexivamente conectarlo a un método en su clase actual y ya está.
Existe la tentación que SIEMPRE tengo en este momento, y he aprendido a luchar porque NUNCA funciona. La tentación es usar el primer conjunto de datos ("Archivo ...") y manipularlo para que se ajuste a algún patrón y se una de forma automática a su código (en este caso, elimine todos los caracteres no alfa, haga que la primera letra minúscula y añada "Menú" para obtener el nombre correcto del método). No dude en probar esto, es muy atractivo y parece ingenioso, pero prepárese para abandonarlo cuando no cumpla con alguna necesidad (como dos elementos del menú con el mismo nombre en diferentes submenús).
Otra forma sería si su idioma es compatible con los cierres, a continuación, en realidad se podría crear el nombre de archivo y cierre en el mismo lugar ..
De todos modos, una vez que comience la codificación de esta manera, usted encontrará que todos sus la construcción del menú está en un solo método de 10 líneas y puede modificarlo para adaptarlo a sus necesidades. Tuve un caso en el que tuve que cambiar un conjunto de menús a una jerarquía de botones y lo hice en 2 minutos.
Al final, puede usar este patrón para configurar los objetos de acción fácilmente y cambiar cómo se usan fácilmente (en una sola ubicación, una sola línea de código), para que pueda experimentar con ellos. Hay muchas maneras de usarlos, pero si no hace lo que estoy recomendando aquí, terminará teniendo que implementar de nuevo en cada elemento del menú para cada cambio, lo que es realmente molesto: después de un solo cambio, habrá perdido más tiempo que si acabara de implementar una solución basada en datos en primer lugar.
Esto realmente no es codificar, debe tomar como una hora o dos, entonces nunca tiene que escribir nuevo menú (" ... otra vez. Confía en mí, este tipo de herramientas es casi siempre vale la pena.
edición:
que casi siempre código de datos impulsada por estos días lo general voy a prototipos de algunas cosas de la forma habitual, reconocen el patrón y refactor - y si se reestructuran correctamente, los datos casi siempre. factores y lo que queda es hermoso, apretado y fácil de mantener.
Podría hacer lo que sugerí anteriormente en menos de 1/2 h nuestra (tal vez una hora para hacer la versión reflectante). Esto casi siempre es tan largo como lo sería usar la versión no modificada, y desde ese momento, sus ahorros se multiplican por cada cambio.
Esto es muy similar a lo que a la gente le gusta de ruby, excepto que con ruby parece insertar aún más datos en su código (lo que hace terriblemente difícil extraer completamente los datos del código, que es un buen objetivo para internacionalización).
Hmm, ¿mencioné que si eres bueno para extraer tus datos de esta manera, i18n es prácticamente gratis?
Te sugiero que solo lo intentes alguna vez y veas lo que piensas. Incrustar el control en las cuerdas no es necesario si te hace sentir incómodo. Tiendo a usar matrices de cadenas/objetos simplemente porque son realmente fáciles de ingresar, están todavía en el archivo mientras codifica y son triviales para externalizar más tarde, pero si le gustan los archivos YML o XML o de propiedades, use lo que sea cómodo con - ¡solo abstrae tus datos de tu código!
Duplicado de http://stackoverflow.com/questions/448179/organizing-actions-in-a-swing-application#448195, como lo señaló Dave Ray. –