# Cómo vibrar, emitir un beep y usar el portapapeles

> Feedback rápido del dispositivo — vibración, sonido de beep y copiar/pegar del portapapeles.

Source: https://crossfly.dev/es/docs/cookbook/device/vibrar-beep-clipboard — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Cómo vibrar, emitir un beep y usar el portapapeles

**Propósito.** Dar feedback rápido al usuario: **vibrar** el aparato, reproducir un **beep** y
**copiar/pegar** texto en el portapapeles.

## APIs usadas
- `Device.vibrate(int millis)` — vibra durante `millis` ms. **En iOS la duración se ignora** (no hay forma de definir el tiempo en esa plataforma).
- `Device.beep()` — reproduce el sonido `beep.mp3` precargado. **No bloquea** (agenda la reproducción en la render thread).
- `Device.clipboardCopy(String s)` — copia la cadena al portapapeles.
- `Device.clipboardPaste()` → `String` — devuelve la última cadena del portapapeles, o `""` si está vacío.

> **Nota.** Todos son métodos **estáticos** de `Device`. Son seguros para llamar desde cualquier thread
> (`beep()` internamente agenda en la render thread). `clipboardPaste()` nunca devuelve `null` — devuelve
> una cadena vacía cuando no hay nada.

## Ejemplo completo (copiar, pegar y ejecutar)

```java
package com.exemplo;

import dev.crossfly.ui.*;                   // Window, Button, Label
import dev.crossfly.ui.layout.*;            // VerticalLayout
import dev.crossfly.device.*;               // Device

/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      Label resultado = new Label("");
      add(LAY_AUTO, resultado);

      Button acao = new Button("Vibrar, beep e copiar");
      acao.onAction(c ->
      {
         // Feedback táctil y sonoro (métodos estáticos, seguros desde cualquier thread)
         Device.vibrate(50);       // 50ms (ignorado en iOS)
         Device.beep();            // no bloquea

         // Portapapeles
         Device.clipboardCopy("Texto para copiar");
         String colado = Device.clipboardPaste();   // "" si el clipboard está vacío

         resultado.setText("Clipboard: " + colado);
      });
      add(LAY_AUTO, acao);
   }
}
```

> El fragmento de abajo muestra **solo el núcleo**. Para ejecutarlo, colócalo en el esqueleto `MainWindow` de arriba.

## Fragmento mínimo

```java
// verificado en la fuente: Device.java (vibrate línea 253, beep línea 306, clipboardCopy línea 271, clipboardPaste línea 279)
import dev.crossfly.device.*;              // Device

// Feedback táctil y sonoro
Device.vibrate(50);       // 50ms (ignorado en iOS)
Device.beep();            // no bloquea

// Portapapeles
Device.clipboardCopy("Texto para copiar");
String colado = Device.clipboardPaste();   // "" si el clipboard está vacío
```

## Profundiza
- Guía de sonido y varios: [Sonido y varios](/docs/data-and-services/device-sound-and-misc)
- Receta hermana: [tts-stt.md](/docs/cookbook/device/tts-stt)
