2016-05-03 104 views
-1

該代碼位於下方。現在它所做的是不斷移動字母,而我只希望它在移動下一個字母時移動超過一個字符,而不是更多。另外x + = 2是另一種方法,我用它也沒有工作..這基本上應該是一個打字班......請help.It也把所有的字母放在同一個地方..我需要它將它們分開一個空格,並且我不能將相同的字母按兩次或只是將字母移動我想每次打字時都會顯示一個字母,然後每按一次就移動一個字母

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() 
{ 
} 
} 
+0

歡迎來到Stack Overflow! [mcve]中的「Minimal」是指證明問題的最小代碼量。從「G」到「Z」不同於「A」到「F」的情況,您的案件中沒有任何內容;他們沒有增加你的問題的演示,只是讓你的代碼更長。 [mcve]中的「完成」並不意味着「從A到Z」完整,而是代碼編譯的意義。您可以假設我們會假設您知道如何複製並粘貼以完成項目中的其餘案例。請編輯您的問題並修剪您的示例代碼。 – AJNeufeld

回答

0

代碼有很多問題。


首先,無限循環重繪:

​​

這是不好的。刪除它和啓動它的線程!

當應用程序將如何繪製自己(或當窗口幾何體發生更改或窗口暴露,但工具包已經處理所有這些情況時)時,只需要重新繪製JFrame/JPanel/Applet。

好的,那麼什麼時候有什麼改變?可能任何時候你按下一個鍵。

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

    repaint(); 
} 

而不是每20ms重新繪製,現在只有在按下按鍵後才重新繪畫。這可能仍然過於頻繁。 Shift,Alt,Ctrl,Meta,Caps Lock都是鍵;如果你按下其中任何一個,儘管你的應用程序沒有處理任何這些鍵,仍會觸發重繪。但至少是低效率。


二,x是一個字段,而不是本地的paint變量。它在應用程序啓動時初始化爲10,並在調用paint時遞增。

g.drawString(" b",x,10); 

將借鑑在(10,10),當應用程序被啓動,並按下VK_B字符串" b"。但下一次調用重繪時(20ms之後用現有的代碼),它將在(12,10),然後(14,10)和(16,10)等等處繪製它。

相反,你可能想:

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

    // Remainder of paint code ... 
} 

,這樣每次paint被調用時,它繪製以同樣的方式(除非東西在這導致油漆故意畫出不同的應用程序狀態的變化)。


drawString使用像素座標。字母「A」在任何易讀字體中寬度超過2個像素。例如,在這種ASCII藝術中,字母「A」和「B」是5「像素」寬。爲了在字母之間留下間隙,需要在「A」的右側畫出至少6個像素的「B」。

* **** 
* * * * 
* * **** 
***** * * 
* * * * 
* * **** 

<-7px-> 

您可以使用Graphics#getFontMetrics確定多少推進基於前面的字符每一個字符,與給定字體的位置。或者,你可以使用(比方說)16像素的不斷提前。

private final static int ADVANCE = 16; 

public void paint(Graphics g) { 
    int x = 10; 
    if (pickA) { 
     g.drawString("a", x, 10); 
     x += ADVANCE; 
    } 
    if (pickB) { 
     g.drawString("b", x, 10); 
     x += ADVANCE; 
    } 
    // ... 
} 

或者您可以讓工具包爲您完成工作並繪製String

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) 

這裏是最小的工作的例子,我可以幫你。根據需要調整。

@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); 
    } 
} 
+0

代碼確實可以輸入,但它按順序排列,我無法輸入同一個字母兩次。我應該如何讓我可以輸入任何我想輸入的字符,並按照我的意願多次輸入相同的字母? –

+0

聲明一個字段'String typed =「」;'並在'keyPressed'處理程序中爲其添加一個字母,並在'paint'方法中僅添加'g.drawString(typed,10,10);'。 – AJNeufeld

+0

這不起作用,我試過了,它仍然不會輸入它。 –

相關問題