【问题标题】:Displaying dominoes with Unicode charset使用 Unicode 字符集显示多米诺骨牌
【发布时间】:2018-12-09 03:12:48
【问题描述】:

我目前正在用 java 创建一个多米诺骨牌游戏。这个想法是加载多米诺骨牌图像,必要时旋转它们,然后将它们显示在屏幕上。 几周前,我发布了一个问题,询问如何在 Java 中旋转 imageIcon。

Someone replied 如下:“Unicode 字符集包括多米诺骨牌”。

所以如果我理解正确,我可以使用 Unicode 字符集在屏幕上显示多米诺骨牌,而不是加载多米诺骨牌图像?我在互联网上找不到任何示例如何做到这一点。任何人都可以给我一个如何做到这一点的例子吗?

【问题讨论】:

    标签: java unicode fonts


    【解决方案1】:

    多米诺骨牌由 U+1F030 到 U+1F09F 的 UTF8 字符表示。他们有一个特殊的块。

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    根据https://unicode-table.com

    Domino Tiles 是一个 Unicode 块,包含用于表示多米诺骨牌游戏情况的字符。该块包括标准六点瓷砖集的符号以及水平和垂直方向的背面

    https://unicode-table.com/en/blocks/domino-tiles/

    Unicode Standard, Version 10.0

    多米诺骨牌符号本身并不代表多米诺骨牌,而是构成多米诺骨牌特定方向的图形符号,因为瓷砖的方向在讨论多米诺骨牌游戏时很重要。多米诺骨牌的每个视觉上不同的旋转都被单独编码。因此,例如,U+1F081 多米诺骨牌 vertical-04-02 和 U+1F04F
    多米诺瓷砖水平 04-02 被编码,以及 U+1F075 多米诺瓷砖垂直 02-04 和 U+1F043 多米诺瓷砖水平 02-04。所有这四个符号都代表同一个游戏图块,但图块的每个方向在视觉上都是不同的,并且需要其自己的文本符号。多米诺瓷砖符号的字符名称中的数字反映了瓷砖上的点图案。

    您还必须选择能够显示它们的字体。

    【讨论】:

      【解决方案2】:

      前面的答案是正确的。然而:

      更方便的字符页面:http://www.alanwood.net/unicode/domino-tiles.html

      另外,这些字符的实际打印描述为here

      打印多米诺骨牌的示例:

      class Scratch {
          public static void main(String[] args) {
              System.out.println(new String(Character.toChars(127026)));
          }
      }
      

      这会在 IntelliJ 的控制台上打印 ?。您的结果可能会有所不同,具体取决于您的字体。

      【讨论】:

        【解决方案3】:

        以下代码显示了如何确定支持显示这组 Unicode 字符的已安装字体(此处安装了 250 多种字体中的 3 种),并将它们显示在文本区域中。

        import java.awt.*;
        import javax.swing.*;
        import javax.swing.event.*;
        import javax.swing.border.EmptyBorder;
        import java.util.Vector;
        
        public class DominoTiles {
        
            private JComponent ui = null;
            public static final int DOMINO_TILE_START = 127024;
            public static final int DOMINO_TILE_END = 127123;
            String dominoeTiles;
            JTextArea textArea = new JTextArea(4, 10);
        
            DominoTiles() {
                initUI();
            }
        
            public void initUI() {
                if (ui != null) {
                    return;
                }
        
                ui = new JPanel(new BorderLayout(4, 4));
                ui.setBorder(new EmptyBorder(4, 4, 4, 4));
        
                StringBuilder sb = new StringBuilder();
                for (int ii = DOMINO_TILE_START; ii <= DOMINO_TILE_END; ii++) {
                    String s = new String(Character.toChars(ii));
                    sb.append(s);
                }
                textArea.setText(sb.toString());
                textArea.setLineWrap(true);
                ui.add(new JScrollPane(textArea));
        
                String[] fontFamilies = GraphicsEnvironment.
                        getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
                final Vector<String> compatibleFonts = new Vector<>();
                for (String fontFamily : fontFamilies) {
                    Font f = new Font(fontFamily, Font.PLAIN, 1);
                    if (f.canDisplayUpTo(sb.toString()) < 0) {
                        compatibleFonts.add(fontFamily);
                    }
                }
                final JList list = new JList(compatibleFonts);
                ui.add(new JScrollPane(list), BorderLayout.LINE_START);
                ListSelectionListener listSelectionListener = new ListSelectionListener() {
        
                    @Override
                    public void valueChanged(ListSelectionEvent e) {
                        if (!e.getValueIsAdjusting()) {
                            String fontFamily = list.getSelectedValue().toString();
                            Font f = new Font(fontFamily, Font.PLAIN, 60);
                            textArea.setFont(f);
                        }
                    }
                };
                list.addListSelectionListener(listSelectionListener);
                list.setSelectedIndex(0);
                list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            }
        
            public JComponent getUI() {
                return ui;
            }
        
            public static void main(String[] args) {
                Runnable r = new Runnable() {
                    @Override
                    public void run() {
                        try {
                            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                        } catch (Exception useDefault) {
                        }
                        DominoTiles o = new DominoTiles();
        
                        JFrame f = new JFrame(o.getClass().getSimpleName());
                        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                        f.setLocationByPlatform(true);
        
                        f.setContentPane(o.getUI());
                        f.pack();
                        f.setMinimumSize(f.getSize());
        
                        f.setVisible(true);
                    }
                };
                SwingUtilities.invokeLater(r);
            }
        }
        

        This example 展示了如何将 Unicode 字符转换为图像(以及一些渲染它们的技巧)。

        【讨论】:

          猜你喜欢
          • 2022-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-13
          • 1970-01-01
          相关资源
          最近更新 更多