2011-03-20 18 views
6

Backgorund información:alternativa seleccionable a JOptionPane.showMessageDialog

Tengo un amigo mío en la Armada, y él quería saber si podía preparar una pequeña aplicación que calcualte cuando tiene su guardia deber, porque aparentemente contar con un calendario es difícil. Usé JOptionPane.showMessageDialog para darle el resultado de las fechas. Así es como estoy haciendo eso.

GregorianCalendar knownDate = new GregorianCalendar(year,month,day); 

GregorianCalendar[] futureDates = new GregorianCalendar[10]; 
for(int i = 0; i < 10; i++) { 
    futureDates[i] = new GregorianCalendar(year,month,day); 
    futureDates[i].add(Calendar.DAY_OF_MONTH,10*(i+1)); // duty every 10 days 
} 
String newline = System.getProperty("line.separator"); 
StringBuilder sb = new StringBuilder("Jakes duty dates:").append(newline); 
for(GregorianCalendar d : futureDates) { 
    sb.append(months[d.get(Calendar.MONTH)]).append(" "); 
    sb.append(d.get(Calendar.DAY_OF_MONTH)).append(newline); 
} 
JOptionPane.showMessageDialog(null,sb.toString()); 

El 'único problema' es que no puede seleccionar el texto que se muestra. Le gustaría seleccionarlo para mensajes instantáneos y correos electrónicos, porque ¿qué sentido tiene ser medio flojo, verdad? (El único problema es entre comillas porque tengo la sensación de que va a arrastramiento del alcance de este a la muerte ... jaja)

Mi pregunta:

¿Existe una "solución de una línea" para hacer una seleccionable showMessageDialog?

+0

@skaffman gracias! debería haber pensado en esa etiqueta. :-) – corsiKa

Respuesta

5

Pude basarme en la respuesta de trashgod. Mientras que él sugirió el uso de un JList, estoy usando en su lugar un JTextArea

Esto es lo que estoy haciendo (lo que le da el tipo de selección que necesito.):

JTextArea text = new JTextArea(sb.toString()); 
JOptionPane.showMessageDialog(null,text); 

y está funcionando como un encanto!

============================================== ==

Después de un poco de experimentación que hice esto:

DefaultListModel model = new DefaultListModel(); 
for(GregorianCalendar g : futureDates) { 
    String m = months[g.get(Calendar.MONTH)]; 
    String d = String.valueOf(g.get(Calendar.DAY_OF_MONTH)); 
    model.addElement(m + " " + d); 
} 
JList jlist = new JList(model); 

JOptionPane.showMessageDialog(null,jlist); 

JOptionPane.showMessageDialog(null,jlist.getSelectedValue()); 

Y la segunda casilla exhibidas lo que había seleccionado en la primera. Estaba realmente impresionado con eso. Ahora bien, esta no es la funcionalidad que estaba buscando (la sección superior es) ¡pero eso no lo hace menos asombroso! :-)

+0

¡Esa es la entrada! Muchos componentes admiten este tipo de [DnD] (http://download.oracle.com/javase/tutorial/uiswing/dnd/defaultsupport.html). – trashgod

+0

Sí, es genial. ¡Y para su crédito, la definición de selección de JList es probablemente mucho más común de lo que me refería! – corsiKa

+0

Además, vea la respuesta actualizada: ¡su sugerencia fue realmente genial! – corsiKa

1

Agregue las fechas a DefaultListModel, cree JList y pase la lista a showMessageDialog(). Es más de una línea, pero la selección se copia al portapapeles usando la tecla copy de la plataforma.

private static final DateFormat df = new SimpleDateFormat("dd-MMM"); 

private static void createAndShowGUI() { 
    DefaultListModel dlm = new DefaultListModel(); 
    for (int i = 0; i < 10; i++) { 
     GregorianCalendar knownDate = new GregorianCalendar(); 
     knownDate.add(Calendar.DAY_OF_MONTH, 10 * i); 
     dlm.add(i, df.format(knownDate.getTime())); 
    } 
    JList list = new JList(dlm); 
    JOptionPane.showMessageDialog(null, list); 
} 
+0

Para su comodidad, puede automatizar la copia en el portapapeles del sistema en un listener de selección de listas. – trashgod

+0

Gracias por el intento, pero ese no es el seleccionado que quise decir. Esto es ciertamente genial, me permite seleccionar una de las filas, pero quiero decir ... seleccionar todo el bloque de texto para copiar al portapapeles. – corsiKa