tutorial pasos para interfaz grafica español ejemplos crear componentes componente java swing thread-safety

java - pasos - swing containers



¿Qué métodos de componentes Swing son seguros para subprocesos? (5)

¿Pero cuáles son estos métodos de componentes Swing que están etiquetados como "seguro para subprocesos"?

La mayoría de los métodos de los componentes Swing NO son seguros para subprocesos. Pero algunos son. Para descubrir cuáles, no tiene más remedio que leer detenidamente los javadocs para sus componentes de destino. Una búsqueda en Google cuidadosamente construida podría acelerar el proceso.

¿Hay realmente alguna?

Sí, de hecho hay. En términos generales, si trabaja con componentes Swing, es probable que tenga que invocar métodos seguros y no seguros para subprocesos. Como la mayoría de los métodos no son seguros para subprocesos, prefiero errar por el lado de la precaución y realizar todas las acciones en ellos de una manera segura para los subprocesos.

HTH

Lista no exhaustiva.

DefaultStyledDocument:

  • inserto vacío protegido (desplazamiento int, DefaultStyledDocument.ElementSpec [] data) lanza BadLocationException
  • public void setLogicalStyle (int pos, Style s)
  • public void setCharacterAttributes (int offset, int length, AttributeSet s, boolean replace)
  • public void setParagraphAttributes (int offset, int length, AttributeSet s, boolean replace)

javax.swing.text.AbstractDocument:

  • Procesamiento de vacío público (Ejecutable r)
  • eliminar público (int offs, int len) lanza BadLocationException
  • public void insertString (int offs, String str, AttributeSet a) lanza BadLocationException
  • public Position createPosition (int offs) lanza BadLocationException

javax.swing.undo.UndoManager:
La clase es segura para hilos.

Según el tutorial de Swing :

Algunos métodos de componentes Swing están etiquetados como "seguro para subprocesos" en la especificación de la API; Estos pueden ser invocados de forma segura desde cualquier hilo. Todos los demás métodos del componente Swing deben invocarse desde el hilo de despacho de eventos. Los programas que ignoran esta regla pueden funcionar correctamente la mayor parte del tiempo, pero están sujetos a errores impredecibles que son difíciles de reproducir.

¿Pero cuáles son estos métodos de componentes Swing que están etiquetados como "seguro para subprocesos"? ¿Hay realmente alguna?

Actualización / recompensa:

¿Hay una lista completa de métodos de swing seguros para subprocesos? (Los métodos Swing seguros para subprocesos parecen ser bastante raros, por lo que dicha lista no puede ser demasiado larga ...)


En Java 7 , los métodos previamente seguros para subprocesos de los componentes de vista enraizados en JTextComponent ya no son seguros para subprocesos. EventQueue.invokeLater() se muestra una solución típica que utiliza EventQueue.invokeLater() . El resto de los métodos relacionados con el modelo, que se enumeran here , se mantienen seguros para subprocesos.

  • JTextPane
    • replaceSelection()
    • insertComponent()
    • insertIcon()
    • setLogicalStyle()
    • setCharacterAttributes()
    • setParagraphAttributes()

Google me enseñó que al menos those son seguros para hilos. Aquí hay una visión general para el caso de que el enlace se rompa de nuevo:

  • JTextPane
    • replaceSelection()
    • insertComponent()
    • insertIcon()
    • setLogicalStyle()
    • setCharacterAttributes()
    • setParagraphAttributes()
  • StyleContext
    • addAttribute()
    • addAttributes()
    • removeAttribute()
    • removeAttributes()
    • reclaim()

Para una lista de clases con el comentario en los archivos javadocs & src "es seguro para subprocesos" devuelve lo siguiente

JEditorPane JTextArea AbstractDocument DefaultCaret DefaultStyledDocument JTextComponent PlainDocument StyleContext HTMLDocument UndoManager

Esto no significa que haya otros documentos documentados o no documentados dentro del src que sean seguros para subprocesos.

Me parece una pregunta bastante extraña, pero consideraría que la mayoría de los componentes no son seguros para subprocesos y, dado que Swing es un modelo de un solo subproceso y todas las actualizaciones deben suceder en el subproceso del despachador de eventos, es bastante fácil de hacer.


Pero ya tiene la respuesta: ¡ solo los métodos que están documentados específicamente como seguros para subprocesos en el método JavaDoc son seguros para subprocesos! esto es de JTextComponent.setText

* This method is thread safe, although most Swing methods * are not. Please see * <A HREF="http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html">How * to Use Threads</A> for more information.

Si la documentación del método no dice que es seguro, entonces no lo es: el acceso a JavaDoc es crítico cuando se codifica contra Swing