Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我想让一个小程序在每次输入时显示一个字母,然后在每次按下时移到一个字母上_Java_Applet - Fatal编程技术网

Java 我想让一个小程序在每次输入时显示一个字母,然后在每次按下时移到一个字母上

Java 我想让一个小程序在每次输入时显示一个字母,然后在每次按下时移到一个字母上,java,applet,Java,Applet,代码如下。现在它做的是不断移动字母,我只想在按下下一个字母时,它移动一个字符,而不是移动更多。另外,x+=2是我使用的另一种方法,它也不起作用。。这基本上应该是一个打字类。。。请帮忙。它也会把所有的字母放在同一个地方。。我需要它把它们分开一个空间,我不能按两次同一个字母,或者它只是移动字母 public class Type_Client extends Applet implements KeyListener,Runnable { boolean pickA,pickB,pickC,pic

代码如下。现在它做的是不断移动字母,我只想在按下下一个字母时,它移动一个字符,而不是移动更多。另外,x+=2是我使用的另一种方法,它也不起作用。。这基本上应该是一个打字类。。。请帮忙。它也会把所有的字母放在同一个地方。。我需要它把它们分开一个空间,我不能按两次同一个字母,或者它只是移动字母

public class Type_Client extends Applet implements KeyListener,Runnable
{
 boolean pickA,pickB,pickC,pickD,pickE,pickF,pickG,pickH,pickI,pickJ,pickK=false;
 boolean pickL,pickM,pickN,pickO,pickP,pickQ,pickR,pickS,pickT,pickU,pickV=false;
 boolean pickW,pickX,pickY,pickZ=false;
 boolean space=false;
 boolean run=true;
 int x=10;
 Type t1;
 Thread thr;
 public void init()
 {
     t1 = new Type();
     thr=new Thread(this);
     thr.start();
     addKeyListener(this);
 }
     public void keyTyped(KeyEvent k)
 {
 }
 public void keyReleased(KeyEvent k)
 {
 }
 public void keyPressed(KeyEvent k)
 {
     if(k.getKeyCode()==KeyEvent.VK_A)
    {
        pickA=true;
        k.consume();

    }
     if(k.getKeyCode()==KeyEvent.VK_B)
    {
        pickB=true;
        k.consume();
    }
     if(k.getKeyCode()==KeyEvent.VK_C)
    {
        pickC=true;
        k.consume();
    }

     if(k.getKeyCode()==KeyEvent.VK_SPACE)
    {
        space=true;
        k.consume();
        //Spce++;
    }
 }
  public void run()
 {
    while(run==true)
    {
        try{
            Thread.sleep(20);
        }
        catch(Exception e){};
        repaint();
    }
}
public void paint(Graphics g)
{
    if(pickA)
    {
        g.drawString(" a",x,10);

    }
    if(pickB)
    {
        g.drawString(" b",x,10);
        x++;
        x++;
    }
    if(pickC)
    {
        g.drawString(" c",x,10);
        x++;
        x++;
    }

    }
}
public void stop()
 {
 }
public void start()
{
}
}

你的代码有很多问题


首先,无限重绘循环:

public void run() {
    while(run==true) {
        try {
            Thread.sleep(20);
        }
        catch(Exception e) { };
        repaint();
    }
}
这很糟糕。移除它和启动它的线程

当应用程序绘制自身的方式发生变化时(或者当窗口几何图形发生变化或窗口暴露时,但工具箱已经处理了所有这些情况),只需要重新绘制JFrame/JPanel/Applet

好的,那么什么时候会有变化呢?可能在你按键的任何时候

public void keyPressed(KeyEvent k) {
    // Your existing code here

    repaint();
}
现在只在按下一个键后重新绘制,而不是每隔20毫秒重新绘制一次。这可能还是太频繁了<代码>Shift,
Alt
Ctrl
Meta
大写锁定
都是键;如果您按下其中任何一个键,则会触发重新绘制,尽管您的应用程序未处理任何这些键。但至少有一点效率低下


其次,
x
是一个字段,而不是局部绘制变量。当应用程序启动时,它被初始化为
10
,当调用paint时,它将递增

g.drawString(" b",x,10);
当应用程序启动并按下
VK_b
时,将在(10,10)处绘制字符串
“b”
。但是下次调用redraw时(使用现有代码20毫秒后),它将在(12,10),然后(14,10),然后(16,10),依此类推

相反,您可能希望:

public void paint(Graphics g) {
    int x = 10;

    // Remainder of paint code ...
}
因此,每次调用
paint
时,它都以相同的方式绘制(除非应用程序状态发生变化,导致paint故意以不同的方式绘制)


drawString
使用像素坐标。字母“A”在任何易读字体中都超过2像素宽。例如,在这种ASCII技术中,字母“A”和“B”的宽度为5“像素”。要在字母之间留出间隙,“B”需要在“a”的右侧至少画6个像素

或者,您可以让工具箱为您完成工作,并绘制一个
字符串

public void paint(Graphics g) {
    StringBuilder sb = new StringBuilder(27);

    if (pickA) {
        sb.append("a ");
    }
    if (pickB) {
        sb.append("b ");
    }
    // ... remainder cases ...

    g.drawString(sb.toString(), 10, 10);
}

最后,26
pick(Letter)
变量非常糟糕。考虑一种记录按键的不同方法。

一些选择:

boolean picked [] = new boolean[26];     // boolean array (1 per letter)
Set<Integer> picked = new HashSet<>();   // A set of VK_ codes
Set<Character> picked = new HashSet<>(); // A set of characters
BitSet picked = new BitSet(26);          // A set of bits (1 per letter)
boolean picked[]=新的boolean[26];//布尔数组(每个字母1个)
Set picked=new HashSet();//一组VK_uu码
Set picked=new HashSet();//一组字符
拾取的位集=新位集(26);//一组位(每个字母1位)

这是我能为你做的最小的工作示例。根据需要进行调整

@SuppressWarnings("serial")
public class Type_Client extends Applet {

    private String typed = "";

    private KeyAdapter adapter = new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            char ch = e.getKeyChar();
            if (ch >= ' ' && ch <= '~') {
                typed += ch;
                repaint();
            }
        }
    };

    @Override
    public void start() {
        addKeyListener(adapter);
    }

    @Override
    public void stop() {
        removeKeyListener(adapter);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawString(typed, 10, 10);
    }
}
@SuppressWarnings(“串行”)
公共类类型\u客户端扩展小程序{
私有字符串类型=”;
private KeyAdapter=新KeyAdapter(){
@凌驾
按下公共无效键(按键事件e){
char ch=e.getKeyChar();

if(ch>=''&&ch欢迎使用堆栈溢出!中的“Minimal”表示演示问题的代码量最小。从“G”到“Z”的情况与从“A”到“F”的情况没有什么不同;它们不会增加问题的演示,只会使代码变长。“Complete”在“从A到Z”的意义上,in并不意味着完整,而是在代码编译的意义上。您可以假设我们将假设您知道如何复制和粘贴以完成项目中的其余案例。请编辑您的问题并缩减示例代码。代码确实可以键入,但它按顺序键入,我不能键入同一个字母两次。我如何才能键入wha无论我输入多少次相同的字母?声明一个字段
String typed=“”;
并在
按键处理程序中添加一个字母,只需
g.drawString(typed,10,10)
paint
方法中。这不起作用,我尝试了,但它仍然无法键入。它工作正常。添加了显示工作小程序的示例代码。示例代码确实起作用,但当我测试代码时,你说使用它不起作用。但现在它起作用了。
boolean picked [] = new boolean[26];     // boolean array (1 per letter)
Set<Integer> picked = new HashSet<>();   // A set of VK_ codes
Set<Character> picked = new HashSet<>(); // A set of characters
BitSet picked = new BitSet(26);          // A set of bits (1 per letter)
@SuppressWarnings("serial")
public class Type_Client extends Applet {

    private String typed = "";

    private KeyAdapter adapter = new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            char ch = e.getKeyChar();
            if (ch >= ' ' && ch <= '~') {
                typed += ch;
                repaint();
            }
        }
    };

    @Override
    public void start() {
        addKeyListener(adapter);
    }

    @Override
    public void stop() {
        removeKeyListener(adapter);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawString(typed, 10, 10);
    }
}