棋盘坐标

2024-03-25

我正在尝试用 Java 创建一个国际象棋程序。现在,我已经将棋盘与现有的部件一起完成,我可以用鼠标通过拖放来移动它们。

我需要的是向两侧的方块添加坐标,就像在真正的板上一样。不一定要有什么奇特的东西,只是一个视觉效果。由于我没有使用图形绘制板子,所以我不知道如何在我创建的板子上绘制:/

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class ChessGame extends JFrame implements MouseListener,
      MouseMotionListener {

   JLayeredPane layeredPane;
   JPanel chessBoard;
   JLabel chessPiece;
   int xCoordinate;
   int yCoordinate;

   public ChessGame() {
      Dimension boardSize = new Dimension(600, 600);

      layeredPane = new JLayeredPane();
      getContentPane().add(layeredPane);
      layeredPane.setPreferredSize(boardSize);
      layeredPane.addMouseListener(this);
      layeredPane.addMouseMotionListener(this);

      // adding chess board

      chessBoard = new JPanel();
      layeredPane.add(chessBoard, JLayeredPane.DEFAULT_LAYER);
      chessBoard.setLayout(new GridLayout(8, 8));
      chessBoard.setPreferredSize(boardSize);
      chessBoard.setBounds(0, 0, boardSize.width, boardSize.height);

      for (int i = 0; i < 64; i++) {
         JPanel square = new JPanel(new BorderLayout());
         chessBoard.add(square);

         int row = (i / 8) % 2;
         if (row == 0)
            square.setBackground(i % 2 == 0 ? new Color(238, 221, 187)
                  : new Color(204, 136, 68));
         else
            square.setBackground(i % 2 == 0 ? new Color(204, 136, 68)
                  : new Color(238, 221, 187));
      }

      // Black pieces on the board

      JLabel piece = new JLabel(new ImageIcon(getClass().getResource(
            "Rooka8.png")));
      JPanel panel = (JPanel) chessBoard.getComponent(0);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Knightb8.png")));
      panel = (JPanel) chessBoard.getComponent(1);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Bishopc8.png")));
      panel = (JPanel) chessBoard.getComponent(2);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Queend8.png")));
      panel = (JPanel) chessBoard.getComponent(3);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Kinge8.png")));
      panel = (JPanel) chessBoard.getComponent(4);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Bishopf8.png")));
      panel = (JPanel) chessBoard.getComponent(5);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Knightg8.png")));
      panel = (JPanel) chessBoard.getComponent(6);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Rookh8.png")));
      panel = (JPanel) chessBoard.getComponent(7);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawna7.png")));
      panel = (JPanel) chessBoard.getComponent(8);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pb7.png")));
      panel = (JPanel) chessBoard.getComponent(9);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawnc7.png")));
      panel = (JPanel) chessBoard.getComponent(10);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawnd7.png")));
      panel = (JPanel) chessBoard.getComponent(11);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawne7.png")));
      panel = (JPanel) chessBoard.getComponent(12);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawnf7.png")));
      panel = (JPanel) chessBoard.getComponent(13);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawng7.png")));
      panel = (JPanel) chessBoard.getComponent(14);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawnh7.png")));
      panel = (JPanel) chessBoard.getComponent(15);
      panel.add(piece);

      // White pieces on the board

      piece = new JLabel(new ImageIcon(getClass().getResource("Pawna2.png")));
      panel = (JPanel) chessBoard.getComponent(48);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawnb2.png")));
      panel = (JPanel) chessBoard.getComponent(49);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawnc2.png")));
      panel = (JPanel) chessBoard.getComponent(50);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawnd2.png")));
      panel = (JPanel) chessBoard.getComponent(51);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawne2.png")));
      panel = (JPanel) chessBoard.getComponent(52);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawnf2.png")));
      panel = (JPanel) chessBoard.getComponent(53);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawng2.png")));
      panel = (JPanel) chessBoard.getComponent(54);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Pawnh2.png")));
      panel = (JPanel) chessBoard.getComponent(55);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Rooka1.png")));
      panel = (JPanel) chessBoard.getComponent(56);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Knightb1.png")));
      panel = (JPanel) chessBoard.getComponent(57);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Bishopc1.png")));
      panel = (JPanel) chessBoard.getComponent(58);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Queend1.png")));
      panel = (JPanel) chessBoard.getComponent(59);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Kinge1.png")));
      panel = (JPanel) chessBoard.getComponent(60);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Bishopf1.png")));
      panel = (JPanel) chessBoard.getComponent(61);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Knightg1.png")));
      panel = (JPanel) chessBoard.getComponent(62);
      panel.add(piece);
      piece = new JLabel(new ImageIcon(getClass().getResource("Rookh1.png")));
      panel = (JPanel) chessBoard.getComponent(63);
      panel.add(piece);

   }

   public void mousePressed(MouseEvent e) {
      chessPiece = null;
      Component c = chessBoard.findComponentAt(e.getX(), e.getY());

      if (c instanceof JPanel)
         return;

      Point parentLocation = c.getParent().getLocation();
      xCoordinate = parentLocation.x - e.getX();
      yCoordinate = parentLocation.y - e.getY();
      chessPiece = (JLabel) c;
      chessPiece.setLocation(e.getX() + xCoordinate, e.getY() + yCoordinate);
      chessPiece.setSize(chessPiece.getWidth(), chessPiece.getHeight());
      layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER);
   }

   // move pieces

   public void mouseDragged(MouseEvent me) {
      if (chessPiece == null)
         return;
      chessPiece.setLocation(me.getX() + xCoordinate, me.getY() + yCoordinate);
   }

   // drop a piece when mouse is released

   public void mouseReleased(MouseEvent e) {
      if (chessPiece == null)
         return;

      chessPiece.setVisible(false);
      Component c = chessBoard.findComponentAt(e.getX(), e.getY());

      if (c instanceof JLabel) {
         Container parent = c.getParent();
         parent.remove(0);
         parent.add(chessPiece);
      }

      else

      {
         Container parent = (Container) c;
         parent.add(chessPiece);
      }

      chessPiece.setVisible(true);
   }

   public void mouseClicked(MouseEvent e) {
   }

   public void mouseMoved(MouseEvent e) {
   }

   public void mouseEntered(MouseEvent e) {
   }

   public void mouseExited(MouseEvent e) {
   }

   public static void main(String[] args) {
      JFrame frame = new ChessGame();
      frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
      frame.pack();
      frame.setResizable(true);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

}

  • 您应该将您的 chessBoard JPanel 放入另一个使用 JPanel 的 BorderLayout 中。
  • 这个容器 JPanel 将在左侧和底部使用 JPanel 保存一个 GridLayout。
  • 这些可以保存 JLabels,其中保存行和列标签。

Edit

  • 再考虑一下,容器 JPanel 最好使用 GridBagLayout,以便侧面 JPanel 的大小正确。

Edit 2
例如:

import java.awt.*;
import javax.swing.*;

@SuppressWarnings("serial")
public class ChessGame2 extends JPanel {
   private static final int RANKS = 8;
   private static final int FILES = RANKS;
   private static final int SIDE = 80;
   private static final Dimension SQUARE_SIZE = new Dimension(SIDE, SIDE);
   private static final Color LIGHT_COLOR = new Color(238, 221, 187);
   private static final Color DARK_COLOR = new Color(204, 136, 68);
   private static final int GAP = 5;

   private JPanel chessBoard = new JPanel(new GridLayout(RANKS, FILES));

   public ChessGame2() {
      for (int rank = 0; rank < RANKS; rank++) {
         for (int file = 0; file < FILES; file++) {
            JPanel square = new JPanel();
            square.setPreferredSize(SQUARE_SIZE);
            Color bg = (rank % 2 == file % 2) ? LIGHT_COLOR : DARK_COLOR; 
            square.setBackground(bg);
            chessBoard.add(square);
         }
      }

      setLayout(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = 0;
      gbc.gridy = 1;
      gbc.gridwidth = 1;
      gbc.gridheight = 1;
      gbc.weightx = 0.0;
      gbc.weighty = 0.0;
      gbc.fill = GridBagConstraints.BOTH;
      gbc.anchor = GridBagConstraints.WEST;
      gbc.insets = new Insets(0, 2 * GAP, 0, 2 * GAP);
      add(createRankPanel(), gbc);

      gbc.gridx = 2;
      gbc.anchor = GridBagConstraints.EAST;
      add(createRankPanel(), gbc);

      gbc.gridx = 1;
      gbc.gridy = 0;
      gbc.anchor = GridBagConstraints.SOUTH;
      gbc.insets = new Insets(GAP, 0, GAP, 0);
      add(createFilePanel(), gbc);

      gbc.gridy = 2;
      gbc.anchor = GridBagConstraints.NORTH;
      add(createFilePanel(), gbc);      

      gbc.gridx = 1;
      gbc.gridy = 1;
      gbc.anchor = GridBagConstraints.CENTER;
      gbc.insets = new Insets(0, 0, 0, 0);
      add(chessBoard, gbc);
   }

   private JPanel createFilePanel() {
      JPanel filePanel = new JPanel(new GridLayout(1, 0));
      for (int i = 0; i < FILES; i++) {
         char fileChar = (char) ('A' + i);
         filePanel.add(new JLabel(String.valueOf(fileChar), SwingConstants.CENTER));
      }
      return filePanel;
   }

   private JPanel createRankPanel() {
      JPanel rankPanel = new JPanel(new GridLayout(0, 1));
      for (int i = 0; i < RANKS; i++) {
         int row = RANKS - i;
         rankPanel.add(new JLabel(String.valueOf(row)));
      }
      return rankPanel;
   }

   private static void createAndShowGui() {
      ChessGame2 mainPanel = new ChessGame2();

      JFrame frame = new JFrame("Chess Game");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

显示为:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

棋盘坐标 的相关文章

  • 如何在java中以编程方式访问网页

    有一个网页 我想从中检索某个字符串 为此 我需要登录 单击一些按钮 填充文本框 单击另一个按钮 然后就会出现字符串 我怎样才能编写一个java程序来自动执行此操作 是否有任何有用的库用于此目的 Thanks Try HtmlUnit htt
  • spring-data-neo4j 基本一对多关系不持久

    EDIT 示例项目可在github https github com troig neo4jCustomRepository 我在后端项目中使用 Neo4J Rest 图形数据库 托管在 grapheneDb 中 和 Spring Data
  • Eclipse 调试“未找到源”

    我刚刚开始使用 Eclipse 所以慢慢来吧 但是 当尝试调试 JUnit 测试用例时 我会收到一个对话框 指出当我在测试方法中的代码中找到此行时 未找到源代码 Assert assertEquals 1 contents size 我知道
  • 在这种情况下,我如何处理 Function 和省略号/可变参数?

    我的项目之一是抛出 lambda 表达式 https github com fge throwing lambdas 我的目标是简化潜在的使用 FunctionalInterfaces in Streams 其在流中使用的唯一 缺陷 是它们
  • Tomcat:Java 静态变量作用域、应用程序范围还是会话范围?

    java 静态变量是否在使用相同 web 应用程序的所有会话之间共享 或者每个会话都有自己的静态变量版本吗 换句话说 Tomcat 是为每个会话创建一组新的类 还是为整个 Web 应用程序创建一组新的类 Tomcat 创建一个ClassLo
  • Android 上 WebRTC 的自定义视频源

    Overview 我想使用自定义视频源通过 WebRTC Android 实现来直播视频 如果我理解正确的话 现有的实现仅支持 Android 手机上的前置和后置摄像头 以下类与此场景相关 Camera1Enumerator java ht
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • json文件格式的升级路径

    我们将 Java 应用程序的用户首选项存储在 JSON 文件中 使用Jackson http jackson codehaus org 随着我们继续开发该应用程序 我们将添加首选项 重命名首选项并删除过时的首选项 当用户将应用程序升级到下一
  • 如何在android中播放内部和外部SD卡中的mp3文件?

    我正在开发一个 mp3 播放器应用程序 它可以播放内部 SD 卡内任何位置的 mp3 文件 我使用以下代码来获取内部存储中存在的 mp3 文件 ArrayList
  • 使用 Jquery Ajax 将数据从 jsp 发送到 struts2 操作类

    我需要使用 jquery Ajax 将表单数据从 jsp 传递到 struts2 并从 Struts2 操作类接收回 JSON 数据 我已经给出了下面的代码 当我传递 AJAX 数据时 url search action searchTex
  • “传输协议线程失败” – “套接字为 EOF”,使用 Java 进行 J2SSH 连接

    我正在尝试通过我的 Java 代码建立 SSH 连接 但遇到异常 我通过 Putty Winscp 工具测试了我的连接 它工作正常 问题出在我的 Java 代码上 SEVERE The Transport Protocol thread f
  • 如何在Java中实现复合模式?

    我想实现一个复合模式Java以便绘制软件开发组织图 因此 我们假设有多个项目经理和多个开发人员 每个开发人员都被分配给一位项目经理 并且每个开发人员都能够使用各种编程语言进行编码 项目经理领导开发人员并准确了解他们的工作量 我对这个设计模式
  • AWS Lambda 和 S3 - 上传的 pdf 文件为空/损坏

    我有一个 Spring 应用程序 在 AWS Lambda 上运行 它获取文件并将其上传到 AWS S3 Spring控制器发送一个MultipartFile到我的方法 使用 Amazon API Gateway 将其上传到 AWS S3
  • 告诉 JAXB 使用注释将 解组为 Date 类

    将 JAXB 与 Java First 一起使用时 类型的字段 属性java util Date编组和解编为xs dateTime一切都按预期进行 但是如果字段 属性的类型是Object JAXB 解组xs dateTimeto XMLGr
  • SSLHandShakeException 没有适当的协议

    我最近向我的网站添加了 SSL 可以通过 https 访问它 现在 当我的 java 应用程序尝试向我的网站发出请求并使用缓冲读取器从中读取时 它会生成此堆栈跟踪 我没有使用自签名证书 该证书来自 Namecheap 它使用 COMODO
  • startDrag 方法 已弃用且无法编译程序

    startDrag android content ClipData android view View DragShadowBuilder java lang Object int 已弃用 如何解决这个问题而又不失去对旧版本的兼容性 还有
  • 如何使用 log4j2.xml 配置 hibernate 日志记录?

    我最近切换到 Apache log4j2 但仍然找不到使用 log4j2 xml 配置 hibernate 日志记录的方法 因为我找不到解决此问题的方法 所以我仍然显式使用 log4j properties 文件进行休眠 这不是最好的解决方
  • 运行外部进程的非阻塞线程

    我创建了一个 Java GUI 应用程序 它充当许多低级外部进程的包装器 该实用程序按原样运行 但迫切需要一项重大改进 我希望我的外部进程以非阻塞方式运行 这将允许我并行服务其他请求 简而言之 我希望能够在生成数据时处理来自外部进程的数据
  • 返回在 REST 控制器中包装 S3Object.getObjectContent() 的 ResponseEntity 是否安全?

    我正在开发一个 Spring Boot 应用程序 它应该允许用户通过指定的应用程序 REST 接口间接从 Amazon S3 下载文件 为此 我有一个 REST Controller 它向用户返回一个 InputStreamResource
  • 切换按钮形状不变

    我正在尝试制作一个带有绿色背景的圆形切换按钮 我用了

随机推荐

  • 用于 SSO 的 PHP + ADFS(通过 OAuth) - 如何设置 ADFS?

    我正在尝试使用ADFS for SSO在一个项目上 该项目正在进行中PHP我正在尝试使用OAuth为了这 那么设置 ADFS 以与 OAuth2 配合使用的步骤是什么 我对 ADFS 一无所知 也无法在那里获得有关 OAuth2 设置的任何
  • 使用 -static-libgcc 和 -static-libstdc++ 编译 libconfig++

    我正在尝试编译库配置 http www hyperrealm com libconfig 版本 1 4 8 与 make LDFLAGS static libstdc static libgcc 但这似乎不起作用 因为我仍然得到 reade
  • 无法使用 Gradle 运行 TestNG

    我有一个使用 TestNG 运行的简单代码 但我无法使用 Gradle 运行相同的代码 因为它说找不到 main 方法 这并不奇怪 因为我使用的是注释 但在这样的场景下 如果我必须使用Gradle 如何运行代码 请注意 我对 Gradle
  • 如何根据 Django 中的表单输入向用户显示生成的图像?

    我目前正在使用对象的属性通过 matplotlib 生成图像 并且能够创建一个在 HttpResponse 中显示所述图像的视图 我使用以下代码片段来执行此操作 http wiki scipy org Cookbook Matplotlib
  • Pandas - KeyError:列不在索引中[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 import pandas as pd import quandl df quandl get WIKI GOOGL p
  • 如何将 MKMapView 用户位置蓝点更改为所选图像?

    是否可以更改blue dot https i stack imgur com ELWID jpg这表明用户的位置MKMapView到图像 例如一辆小汽车或任何 png image In the 查看注释 的方法MKMapViewDelega
  • 循环引用时 .NET 单元测试中的 StackOverflow

    当我注意到以下情况时 我正在测试其他循环参考电阻 public class Foo private Bar myBar new Bar public class Bar private Foo myFoo new Foo Fact publ
  • “pointer-events: none”在 IE9 和 IE10 中不起作用

    CSS 属性pointer events none 在 Firefox 中工作正常 但在 Internet Explorer 9 10 中则不然 有没有办法在 IE 中实现该属性的相同行为 有任何想法吗 来自 MDN 文档 警告 在 CSS
  • React:检查器不是一个函数

    我在 React 应用程序的控制台中收到这条奇怪的警告消息 警告 Failed propType checker is not a function 检查渲染方法Chart 我根本没有任何检查方法 如果我删除我的propTypes 警告消失
  • 姜戈 1.5。 'url' 需要一个非空的第一个参数。 Django 1.5 中的语法发生了变化

    如果我尝试 href url post content product id p id 我有这个错误 url 需要一个非空的第一个参数 语法发生了变化 Django 1 5 请参阅文档 如何改变呢 Django 1 5 中的更改 第一个参数
  • Unity中协程的异常处理

    我创建了一个脚本来更改它所附加的游戏对象的透明度 并且我在需要可取消的淡入淡出协程中进行透明度更改 并且每次我们调用时都取消 ChangeTransparency 具有新的值 我设法让它按照我想要的方式工作 但我想处理OperationCa
  • SQLite 比 MySQL 更快?

    我想设置一个 teampeak 3 服务器 我可以选择 SQLite 和 MySQL 作为数据库 好吧 我通常倾向于 不要在生产中使用 SQLite 但另一方面 它是一个 Teamspeak 服务器 好吧 让我谷歌一下 我发现了这个 Spe
  • FOSUserBundle 一对一映射实体未保存

    大家好 我有一个关于在实体 FosUserBundle 中实现一对一的问题 用户实体与配置文件实体具有一对一的映射 我已经按照 FOSUserBundle 文档中所示覆盖了基本的 RegistrationFormType 记录也保存在两个表
  • 在 Terraform 中引用 gitlab 秘密

    我对 Terraforms 和 gitlab CI 很陌生 我想用它来做一些事情 我想使用 Terraform 创建 IAM 用户和 S3 存储桶 使用策略允许该 IAM 用户对此 S3 存储桶执行某些操作 将 IAM 用户的凭证保存在工件
  • 滚动您自己的明文 Wiki(数据库内的 Wiki)

    有人知道用于创建类似 wiki 的数据存储的 API 最好是 PHP 但我对任何语言都感兴趣 关于滚动您自己的纯文本 wiki 的任何资源怎么样 其他纯文本 wiki 如何处理文本文件的格式 我知道我可以使用 Markdown 或 Text
  • 现有模型和数据库表的rails g脚手架

    我想创建一个结构rails g scaffold Article 但我已经创建了表Articles和型号Articles 有什么办法可以做到这一点吗 rails generate scaffold controller Article
  • 如何在Plotly(python)中设置背景颜色,标题?

    下面是我的代码 有人可以告诉我如何设置背景颜色 标题 x轴y轴标签 scatterplot plot Scatter x x index y x rating mode markers marker dict size 10 color x
  • PHP 中的 Switch-Case 和 If-Else 有什么区别?

    我正在决定是否使用if else vs switch case在我正在编写的一个 PHP 网站中 我想知道使用其中之一是否有任何好处 或者是否在某些情况下打算使用其中一种而不是另一种 有趣的问题 因为在编译语言 甚至是 JIT 语言 中 使
  • 使 'week' 函数为双周

    嗨 这一切应该是一个简单的问题 我只是似乎无法弄清楚 我想每两周分解一次该数据集 以便以两周为间隔查看年度周期 我不想总结或汇总数据 我想做的正是 周 函数正在做的事情 但每两周一次 下面是数据和代码的示例 任何帮助将不胜感激 DF lt
  • 棋盘坐标

    我正在尝试用 Java 创建一个国际象棋程序 现在 我已经将棋盘与现有的部件一起完成 我可以用鼠标通过拖放来移动它们 我需要的是向两侧的方块添加坐标 就像在真正的板上一样 不一定要有什么奇特的东西 只是一个视觉效果 由于我没有使用图形绘制板