【问题标题】:How to create writing simulation with java?如何用java创建写作模拟?
【发布时间】:2012-08-09 17:04:31
【问题描述】:

我需要想出一种方法,让三个大字母看起来像是在打字/书写。 我可以用paintComponent();创建字母

我需要有关如何实现此目的的想法/示例?

这是我已经做过的。

public class LetterWriter extends JPanel {
   private String[] alphabets;
private Font font;

public LetterWriter() {
    createComponents();
    layoutComponents();
}

public void createComponents() {
    alphabets = new String[]{"A","B","C"};
    String[] fonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
    font = new Font(fonts[7],1,500);
}

public void layoutComponents() {
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g.create();
    g2d.setFont(font);
    g2d.drawString(alphabets[0],getWidth()/7,getHeight()-50);
}

public static void main(String[] args) {
    LetterWriter demo = new LetterWriter();
    JFrame frame = new JFrame();
    Container cp = frame.getContentPane();
    cp.add(demo);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500, 500);
    frame.setLocation(500, 500);
    frame.setVisible(true);
}
}  

【问题讨论】:

  • 你是说,被打字?还是关于手写?
  • 另外,试着至少解释一下,你已经尝试过什么,为什么没有奏效,或者为什么不是想要的结果。只是来这里获取想法/示例而不提供您的想法可能会让一些人认为您很懒惰/不感兴趣,那么即使您不能/不会做的最小的事情,为什么其他人还要去做呢?不想在这里粗鲁或其他任何事情,只是想帮助您获得更好的答案,同时提供好的问题。
  • 试着解释一下你的想法,为什么没有奏效(找不到正确的方法,不知道如何在java中绘画等),具体问题出在哪里你正面临着。
  • 我已经更新了我的问题,请查看?
  • +1 表示你的努力 :-),虽然在这个过程中你的角色将再次出现,你应该瞄准的地方是只画它的一部分,然后是另一个部分,因此您必须同时使用drawLine(...)drawArc(...) 等多种方法来完成此操作。

标签: java swing fonts paintcomponent alphabetic


【解决方案1】:

如果你真的想显示文本,模拟某人正在打字,你可以使用javax.swing.Timer,为此,只需使用JLabelJPanel上显示文本,而不是绘制它在JPanel 上,因为在绘画时,您必须担心字体度量和所述字符在给定位置的放置,这可能很麻烦。不过,如果您打算做一些与我在这里介绍的不同的事情,请同样回复。

这里有一个示例代码供您参考:

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

public class TypingLetters
{
    private String text;
    private JLabel letterLabel;
    private int counter = 0;
    private Timer timer;
    private ActionListener timerAction = new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent ae)
        {
            if (counter <= text.length())
            {
                letterLabel.setText(text.substring(0, counter));
                counter++;
            }
            else
                timer.stop();
        }
    };

    public TypingLetters()
    {
        text = "A long text that I want to" +
                    " appear as being TYPED :-)";
    }

    private void displayGUI()
    {
        JFrame frame = new JFrame("Typing Letters Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        letterLabel = new JLabel();
        contentPane.add(letterLabel);

        frame.setContentPane(contentPane);
        frame.setSize(500, 200);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        timer = new Timer(250, timerAction);
        timer.start();
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new TypingLetters().displayGUI();
            }
        });
    }
}

【讨论】:

  • 感谢您的回复,您的班级非常适合输入单词或句子,但不适合像'A'这样的字母。我只想像用手一样输入一个大小为 500 的字母 A。
  • 啊哈,如果我让你写,你想写在一张纸上,就像字符必须慢慢出现在屏幕上一样,而不是一个字符一次出现, 只有一部分必须像你用钢笔或铅笔书写一样。我现在是吗,至于您的期望是什么?
  • 是的,你解释的正是我的意思。
  • @itro :虽然这个想法很棒,但我很抱歉,因为这超出了我的知识范围,如何实现或者我的头脑真的无法弄清楚如何做到这一点。我可能需要一些时间来真正把它付诸实践,我希望你能在此期间得到答复,否则我会尽快提供一些想法:-)
  • 感谢您的快速回放。我已经创建了一个类,我将把它放在我的问题上,这可能是一个好的开始。在上面查看。
【解决方案2】:

一些想法:

  • 制作视频并播放(例如,与 .gif 相同)

  • 将字母分成小块,然后逐个绘制这些小块

  • 定义路径并让“铅笔”在动态创建的图像上绘制自己

【讨论】:

  • 制作视频是什么意思。你的意思是在我用手写字母 A 时拍摄视频吗?
【解决方案3】:

选项 1:

  1. 在一张纸上绘制图像
  2. 拍一张照片并保存到您的计算机中
  3. 使用 g.drawImage("TheImageYouTook",0,0,sizex,sizey);

选项 2:

你可以选择java字体,但是会有点复杂,如果上面的选项不适合你,请看这个页面,http://docs.oracle.com/javase/6/docs/api/java/awt/Font.html

【讨论】:

  • 我怎样才能让它像有人在用手写作我的意思是用动画?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多