# Whiteboard

> Captura de desenho livre — assinatura, rabisco — com cor e espessura de caneta.

Source: https://crossfly.dev/pt/docs/ui/images-and-graphics/whiteboard — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Whiteboard

`Whiteboard` é uma área de **desenho livre com o dedo/mouse** — o caso clássico é **captura de
assinatura**. Ele já trata os eventos de toque e acumula os traços internamente.

## Exemplo completo (copiar, colar e rodar)
```java
package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.image.*;       // Image

/** Tela principal executável. Aponte o launcher (classname) e rode: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      // Área de assinatura ocupando o espaço restante (LAY_FILL).
      Whiteboard board = new Whiteboard();
      board.setPenColor(0xFF000000);   // caneta preta
      board.thick = true;              // traço grosso
      add(LAY_FILL, board);

      // Botão para apagar o desenho.
      Button limpar = new Button("Limpar");
      limpar.onAction(c -> board.clear());
      add(LAY_AUTO, limpar);

      // Botão para capturar o desenho como imagem (ex.: para persistir).
      Button salvar = new Button("Salvar");
      salvar.onAction(c -> {
         Image img = board.getImage();   // o desenho atual como Image (pode ser null se vazio)
         // … persistir img (ex.: PNG) …
      });
      add(LAY_AUTO, salvar);
   }
}
```
> Os trechos abaixo mostram **só o miolo** (o que vai dentro de `onShow()`). Para rodar, coloque-os no esqueleto `MainWindow` acima.

## Uso básico (assinatura)
```java
Whiteboard assinatura = new Whiteboard();
assinatura.setPenColor(0xFF000000);   // caneta preta
assinatura.thick = true;              // traço grosso
painel.add(0.5f, assinatura);         // 50% da altura

Button limpar = new Button("Limpar");
limpar.onAction(c -> assinatura.clear());

Button salvar = new Button("Salvar");
salvar.onAction(c -> {
   Image img = assinatura.getImage();   // o desenho como imagem
   // … persistir img (ex.: PNG) …
});
```

## API
| Membro | Efeito |
|---|---|
| `setPenColor(int)` / `getPenColor()` | cor da caneta (ARGB) |
| `thick` (campo `boolean`) | `true` = traço grosso |
| `clear()` | apaga tudo |
| `getImage()` | retorna o desenho atual como `Image` |
| `setImage(Image)` | carrega uma imagem base (lança `ImageException`) |

## Boas práticas
- Dê **altura generosa** (fração de container ou `autoHeight`) — assinatura precisa de espaço.
- Ofereça sempre um botão **Limpar**.
- Ao salvar, use `getImage()` e trate exceções ao converter/persistir.

## Erros comuns
- Área pequena demais → assinatura ilegível.
- Esquecer que `setImage(Image)` lança `ImageException` (checada).
- Confundir com `ImageView` (só exibe) — `Whiteboard` **captura** desenho.

## Veja também
- [Imagens](/docs/ui/images-and-graphics/images) · [Desenho customizado](/docs/ui/images-and-graphics/custom-drawing)
- Catálogo: [Whiteboard](/docs/ui/widgets/whiteboard) · Referência: Capítulo 18 — Imagens
