Avatar billede preet Nybegynder
02. november 2004 - 12:15 Der er 5 kommentarer og
1 løsning

KeyListener fanger tastetrykket to gange.

Jeg er i gang med at lave en terminal til en ekstern enhed tilsluttet TCP/IP. Terminalen er lavet i en applet og siden indsat som del af et større projekt.

Nu er der det problem, at når jeg skriver en kommando i vinduet opfanges hvert tastetryk to gange, sådan så der i stedet for help bliver sendt hheellpp afsted.

Tekst skrives i et textarea, og kommandoer opfanges tastetryk for tastetryk og sendes derefter afsted når der trykkes enter. Jeg er meget uforstående overfor hvad der sker?

Se kode:

  private void jbInit() throws Exception {
    this.setVisible(true);
    this.setLayout(null);
    input_box.setBackground(Color.black);
    input_box.setFont(new java.awt.Font("DialogInput", 0, 12));
    input_box.setForeground(Color.white);
    input_box.setText("");
    input_box.setBounds(new Rectangle(0, 25, 580, 500));
    input_box.addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent ke) {
        String input_letter = new String("");
        if (ke.getKeyCode() == KeyEvent.VK_ESCAPE) {
          gtp.send_escape();
        }
        if (ke.getKeyCode() == KeyEvent.VK_ENTER) {
          gtp.send(input_text);
          System.out.println("Input_text: " + input_text);
          gtp.send_enter();
          }
          if (ke.getKeyCode() == 8) {
            input_text += "\b";

          }
          if (ke.getKeyCode() == 9) {
            input_text += "\t";

          }
          if (ke.getKeyCode() == 32) {
            input_text += " ";
          }

          if (ke.getKeyCode() > 41 && ke.getKeyCode() < 127) {
            System.out.println(ke.getKeyChar());
            System.out.println(ii + " - " + ke.getKeyCode());
            //input_text += ke.getKeyText(ke.getKeyCode());
            input_text += ke.getKeyChar();
            ii++;
          }

        }
      });

  public void run() {
    int i;
    byte[] in;
    Thread me = Thread.currentThread();
    while (timer == me) {
      try {
        Thread.currentThread().sleep(2);
      }
      catch (InterruptedException e) { }
      if ( (gtp != null) && ((i = gtp.available()) > 0) ) {
        in = gtp.receive();
        for (i = 0; i < in.length; i++) {
          if (in[i] < 0x20 && in[i] != 0x0D && in[i]!= 0x0A){
            //in[i] = 0x20;
          }
        }
        if (!input_text.equals((new String(in)))){
          input_box.append( (new String(in)));
          input_text = "";
        }
      }

    }
  }
Avatar billede _carsten Nybegynder
02. november 2004 - 12:25 #1
Brug keyReleased(), du får en keyReleased() hver gang en tast slippes

            public void keyReleased(KeyEvent ke) {
                //.......
            }
Avatar billede preet Nybegynder
02. november 2004 - 12:50 #2
Det har jeg prøvet, desværre med samme resultat. KeyTyped forsøgte jeg, men den meldte en fejl jeg ikke helt husker...
Avatar billede _carsten Nybegynder
02. november 2004 - 13:14 #3
Prøv lige at teste den her, den udskriver kun Released når du slipper tasten

public class TestKey extends javax.swing.JFrame {

    public TestKey() {
        initComponents();
    }
   
    private void initComponents() {                         
        jTextArea1 = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jTextArea1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                release(evt);
            }
        });

        getContentPane().add(jTextArea1, java.awt.BorderLayout.CENTER);

        pack();
    }                       

    private void release(java.awt.event.KeyEvent evt) {                       
        System.out.println("Released " + evt.getKeyCode());
    }                       
   
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TestKey().setVisible(true);
            }
        });
    }
                   
    private javax.swing.JTextArea jTextArea1;
}
Avatar billede preet Nybegynder
02. november 2004 - 13:23 #4
Jeg har forsøgt lidt frem og tilbage.
Det virkelig mærkelige er, at stand-alone-terminalen virker. Med stand-alone mener jeg, at den ikke er implementeret i det store projekt, men at den selv opretter forbindelse til enheden.

I projektet deler de forbindelsen - gtp, som du kender fra mit tidligere spørgsmål.

Jeg tror simpelthen jeg starter forfra på terminalen, der må være sket en fejl et sted...?
Avatar billede _carsten Nybegynder
02. november 2004 - 13:41 #5
OK - læg selv et svar og accepter dit eget svar, så er spørgsmålet lukket.
Avatar billede preet Nybegynder
03. november 2004 - 08:51 #6
Jeps
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester