跳到内容
CrossFly 是 100% 开源在 GitHub 关注我们
CrossFlyCrossFly
开始使用

本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。

Whiteboard

Whiteboard 是一个用手指/鼠标自由绘图的区域——经典用例是签名捕获。它已经处理好触摸事件并在内部累积笔画。

完整示例(复制、粘贴并运行)

package com.exemplo;

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

/** 可执行的主界面。将 launcher 指向此类(classname)并运行:gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      // 签名区占据剩余空间(LAY_FILL)。
      Whiteboard board = new Whiteboard();
      board.setPenColor(0xFF000000);   // 黑色画笔
      board.thick = true;              // 粗描边
      add(LAY_FILL, board);

      // 清除绘制的按钮。
      Button limpar = new Button("Limpar");
      limpar.onAction(c -> board.clear());
      add(LAY_AUTO, limpar);

      // 将绘制内容捕获为图片的按钮(例如:用于持久化)。
      Button salvar = new Button("Salvar");
      salvar.onAction(c -> {
         Image img = board.getImage();   // 当前绘制内容为 Image(若为空可能为 null)
         // ……持久化 img(例如:PNG)……
      });
      add(LAY_AUTO, salvar);
   }
}

下面的代码片段只展示核心部分(放进 onShow() 内的内容)。要运行它们,请把它们放入上面的 MainWindow 骨架中。

基本用法(签名)

Whiteboard assinatura = new Whiteboard();
assinatura.setPenColor(0xFF000000);   // 黑色画笔
assinatura.thick = true;              // 粗描边
painel.add(0.5f, assinatura);         // 高度的 50%

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

Button salvar = new Button("Salvar");
salvar.onAction(c -> {
   Image img = assinatura.getImage();   // 绘制内容作为图片
   // ……持久化 img(例如:PNG)……
});

API

成员 效果
setPenColor(int) / getPenColor() 画笔颜色(ARGB)
thick(boolean 字段) true = 粗笔画
clear() 清除全部
getImage() 以 Image 形式返回当前绘图
setImage(Image) 加载一张底图(抛出 ImageException)

最佳实践

  • 给予充裕的高度(容器的比例或 autoHeight)——签名需要空间。
  • 始终提供一个清除按钮。
  • 保存时使用 getImage(),并在转换/持久化时处理异常。

常见错误

  • 区域过小 → 签名难以辨认。
  • 忘记 setImage(Image) 会抛出 ImageException(受检异常)。
  • 与 ImageView(仅显示)混淆——Whiteboard 捕获绘图。

另见

这个页面有帮助吗?