Gå til innhold

Hvor skal metoden plasseres?


Anbefalte innlegg

Hei!

 

Driver å skal sette lage ett program som kommuniserer med en NXT robot, men har problemer med en metode som skal registrere hva slags tast som er trykket ned på tastaturet. Hvor skal jeg plassere metoden?

 

Feilmeldingen sier bare: "illegal start of expression"

 

Koden:

 

import lejos.pc.comm.*;
import java.io.*;

public class BTSend {
   public static void main(String[] args) throws Exception {
     NXTConnector conn = new NXTConnector();

     conn.addLogListener(new NXTCommLogListener(){

        public void logEvent(String message) {
           System.out.println("BTSend Log.listener: "+message);

        }

        public void logEvent(Throwable throwable) {
           System.out.println("BTSend Log.listener - stack trace: ");
            throwable.printStackTrace();

        }


     }
     );
     // Connect to any NXT over Bluetooth
     boolean connected = conn.connectTo("btspp://");


     if (!connected) {
        System.err.println("Failed to connect to any NXT");
        System.exit(1);
     }

     DataOutputStream dos = conn.getDataOut();
     DataInputStream dis = conn.getDataIn();
     boolean kaare = false;

	/*
	*
	*PROBLEMER LIGGER I METODEN UNDER; HVOR SKAL DEN PLASSERES?
	*
	*/


     public void keyPressed(KeyEvent e){
	  String tegn = KeyEvent.getKeyText(e.getKeyCode());
	  System.out.println(tegn);
  }


try {


            System.out.println("Sending " + (tegn));
            dos.writeInt((tegn));
            dos.flush();
         } catch (IOException ioe) {
            System.out.println("IO Exception writing bytes:");
            System.out.println(ioe.getMessage());
        }



     try {
        dos.close();
        dis.close();
        conn.close();
        System.out.println("Ferdig avsluttet");
     } catch (IOException ioe) {
        System.out.println("IOException closing connection:");
        System.out.println(ioe.getMessage());
     }
  }
}

Lenke til kommentar
Videoannonse
Annonse

Du definerer en ny metode inni en annen metode.

Prøv å sette den utenfor main.

 

conn.addLogListener(new NXTCommLogListener(){

        public void logEvent(String message) {
           System.out.println("BTSend Log.listener: "+message);

        }

        public void logEvent(Throwable throwable) {
           System.out.println("BTSend Log.listener - stack trace: ");
            throwable.printStackTrace();

        }


     }
);

 

Hva som skjer her?

Aldri sett før :p

Lenke til kommentar

Jeg skal bruke variabelen tegn denne metoden inne deler av koden, nemelig her:

 

            System.out.println("Sending " + (**********tegn**********));
           dos.writeInt((**********tegn********));
           dos.flush();
       } catch (IOException ioe) {
           System.out.println("IO Exception writing bytes:");
           System.out.println(ioe.getMessage());
       }
       try {
           dos.close();
           dis.close();
           conn.close();
           System.out.println("Ferdig avsluttet");
       } catch (IOException ioe) {
           System.out.println("IOException closing connection:");
           System.out.println(ioe.getMessage());
       }

 

Hvordan skal jeg få hentet resultatet fra metoden?

Endret av Mr.Anki
Lenke til kommentar

Hvis det er mulig, så er vel det mest praktiske å putte akkurat den delen (og/eller mer) av main()-metoden inn i keyPressed()-metoden i stedet?

 

Beklager at jeg ikke kan være mer konkret; det er ikke så veldig lett å hjelpe deg når jeg egentlig ikke aner hva det er du lager. :p

Lenke til kommentar

Kan prøve å forklare litt bedre hva jeg skal lage. Skal lage et program som kommuniserer med en NXT enhet, NXTen brukes til å programmere feks en legobil med diverse motorer mm. Koden over skal opprette en kobling mellom datamaskinen og NXTen og sende tallverdier som igjen gjør at motorene starter. NXTen har en egen javafil som sier hvordan motorene skal reagere når tallverdier blir sendt over.

 

I denne kodesnutten skal ett tegn som tilsvarer knappen en trykker på tastaturet sendes over til NXTen som er programmert slik at om den feks mottar A skal motorene gå fremover:

 

dos.writeInt((tegn));

dos.flush();

 

Ble det litt klarere hva som skal lages nå?

Lenke til kommentar

Jeg skjønner hva du prøver å gjøre nå, ja, men jeg programmerer fremdeles i blinde med tanke på at jeg ikke aner hvordan ting fungerer med NXT-enhetene dine. :p

 

Om jeg har forstått alt riktig, så tror jeg noe slikt bør fungere:

 

[se siste innlegg]

 

Men du lager ikke noen KeyListener som sørger for at keyPressed faktisk blir kjørt i denne koden. Det burde du kanskje gjøre? (Eller kanskje du allerede gjør det et annet sted?)

Endret av Degeim
Lenke til kommentar

En tekstboks og dens addKeyListener-metode eller du kan bruke debuggingskonsollen og en scanner.

 

Hvis du lager en tekstboks trenger du typisk denne koden i main-metoden din:

 

KeyListener keyListener = new KeyListener() {

   public void keyPressed(KeyEvent keyEvent) {
       sendKey(keyEvent);
   }

   public void keyReleased(KeyEvent keyEvent) {}
   public void keyTyped(KeyEvent keyEvent) {}

};

TextfeltetsNavnHer.addKeyListener(keyListener); //Tekstfeltet ditt sitt navn her ...

 

Merk: Dette forutsetter at du endrer navnet på "keyPressed"-metoden du har nå til "sendKey". (Bare så vi ikke har identiske metodenavn; jeg har ikke Java-overload-tankegangen i hodet.)

Endret av Degeim
Lenke til kommentar

Forstår jeg deg riktig med det jeg har gjort nå:

 

Kan jeg skrive mange tegn etter hverandre uten å trykke enter?

 

import lejos.pc.comm.*;
import java.io.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JOptionPane;


public class BTSend {

   public static void main(String[] args) throws Exception {


String tegn =JOptionPane.showInputDialog(null,"Tegn?");            //Tekstboks.
       KeyListener keyListener = new KeyListener() {

	    public void keyPressed(KeyEvent keyEvent) {
	        sendKey(keyEvent);
	    }

	    public void keyReleased(KeyEvent keyEvent) {}
	    public void keyTyped(KeyEvent keyEvent) {}

	};

	tegn.addKeyListener(keyListener); //Tekstfeltet ditt sitt navn her ...
   }

   /*
    *
    *PROBLEMER LIGGER I METODEN UNDER; HVOR SKAL DEN PLASSERES?
    *
    */
   public void sendKey(KeyEvent e) {

       NXTConnector conn = new NXTConnector();

       conn.addLogListener(new NXTCommLogListener() {

           public void logEvent(String message) {
               System.out.println("BTSend Log.listener: " + message);

           }

           public void logEvent(Throwable throwable) {
               System.out.println("BTSend Log.listener - stack trace: ");
               throwable.printStackTrace();

           }
       });

       String tegn = KeyEvent.getKeyText(e.getKeyCode());
       System.out.println(tegn);

       // Connect to any NXT over Bluetooth
       boolean connected = conn.connectTo("btspp://");


       if (!connected) {
           System.err.println("Failed to connect to any NXT");
           System.exit(1);
       }

       DataOutputStream dos = conn.getDataOut();
       DataInputStream dis = conn.getDataIn();
       boolean kaare = false;
       try {


           System.out.println("Sending " + (tegn));
           dos.writeInt((tegn));
           dos.flush();
       } catch (IOException ioe) {
           System.out.println("IO Exception writing bytes:");
           System.out.println(ioe.getMessage());
       }
       try {
           dos.close();
           dis.close();
           conn.close();
           System.out.println("Ferdig avsluttet");
       } catch (IOException ioe) {
           System.out.println("IOException closing connection:");
           System.out.println(ioe.getMessage());
       }
   }
}

Lenke til kommentar

Du forstod mesteparten av tankegangen, men en inputbox er ikke helt det samme som et tekstfelt. Jeg bygger litt på koden din, og gir deg et vindu med en tekstboks:

 

[se siste innlegg]

 

Jeg har dessverre ikke mulighet til å teste koden, så jeg stoler på at du klarer å rette opp i eventuelle syntaksfeil ved hjelp av Eclipse.

Endret av Degeim
Lenke til kommentar

Dette ser bra ut, har ikke NXTen her nå så får ikke testet sikkelig, skal få gjort dette i morgen.

 

Får en feilmelding her som ikke har med NXTen å gjøre (tror jeg):

 

line:20: non-static method sendKey(java.awt.event.KeyEvent) cannot be referenced from a static context
               sendKey(keyEvent);
               ^

 

Kommer fra her:

 

 

        KeyListener keyListener = new KeyListener() {

           public void keyPressed(KeyEvent keyEvent) {
               sendKey(keyEvent);                      //Feil?
           }

           public void keyReleased(KeyEvent keyEvent) {}
           public void keyTyped(KeyEvent keyEvent) {}

       };

Lenke til kommentar

Beklager, jeg var noe korttenkt. Java er ikke morsmålet mitt, så det er mulig jeg gjør ett steg mer enn nødvendig her, men jeg dette fungerer i hvert fall (om du får rensket bort eventuelle syntaksfeil):

 

import lejos.pc.comm.*;
import java.io.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JOptionPane;
import java.awt.event.*;
import javax.swing.*;


public class BTSend extends JPanel {

   public BTSend()
   {
       //Lager en ny instans av BTSend, som nå i praksis er et panel (se linje 10; "extends JPanel").
       JTextField Tekstboks = new JTextField(); //Lager en tekstboks
       Tekstboks.setColumns(20); //Setter bredden på tekstboksen

       KeyListener keyListener = new KeyListener() {

           public void keyPressed(KeyEvent keyEvent) {
               sendKey(keyEvent);
           }

           public void keyReleased(KeyEvent keyEvent) {}
           public void keyTyped(KeyEvent keyEvent) {}

       };

       //Kobler tekstboksen sine tastehendelser sammen med funksjonene på linjene over.
       //Disse kan kanskje virke litte forvirrende, men det som skjer nå er at når 
       //du trykker en tast blir den sendt til keyPressed() over her, og så videre til
       //sendKey() under her.
       Tekstboks.addKeyListener(keyListener);

       //Legger tekstboksen inn i panelet
       this.add(Tekstboks);
   }

   public static void main(String[] args) throws Exception {

       //Lager et vindu
       JFrame Vindu = new JFrame("Mr. Anki sin ting");
       Vindu.add(new BTSend()); //Legger en instans av BTSend, som nå i praksis er et panel, i vinduet
       Vindu.pack(); //Fikser størrelsen på vinduet så panelet får plass
       Vindu.setVisible(true); //Viser vinduet

       //Gjør slik at programmet blir avsluttet når vinduet lukker.
       Vindu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   }


   public void sendKey(KeyEvent e) {

       NXTConnector conn = new NXTConnector();

       conn.addLogListener(new NXTCommLogListener() {

           public void logEvent(String message) {
               System.out.println("BTSend Log.listener: " + message);

           }

           public void logEvent(Throwable throwable) {
               System.out.println("BTSend Log.listener - stack trace: ");
               throwable.printStackTrace();

           }
       });

       String tegn = KeyEvent.getKeyText(e.getKeyCode());
       System.out.println(tegn);

       // Connect to any NXT over Bluetooth
       boolean connected = conn.connectTo("btspp://");


       if (!connected) {
           System.err.println("Failed to connect to any NXT");
           System.exit(1);
       }

       DataOutputStream dos = conn.getDataOut();
       DataInputStream dis = conn.getDataIn();
       boolean kaare = false;
       try {


           System.out.println("Sending " + (tegn));
           dos.writeInt((tegn));
           dos.flush();
       } catch (IOException ioe) {
           System.out.println("IO Exception writing bytes:");
           System.out.println(ioe.getMessage());
       }
       try {
           dos.close();
           dis.close();
           conn.close();
           System.out.println("Ferdig avsluttet");
       } catch (IOException ioe) {
           System.out.println("IOException closing connection:");
           System.out.println(ioe.getMessage());
       }
   }
}

Lenke til kommentar

Har møtt på ett lite problem, slik koden er nå må jeg trykke på en knapp for at connection mellom maskinen og NXTen skal opprettes. Etter at knappen er trykket avsluttes connection men en gang. Ønsker at connection skal være åpen hele tiden.

 

Har du noen tips på hvordan jeg kan løse dette?

Lenke til kommentar

Da må vi flytte tilkoblingen ut av den metoden, for eksempel slik som dette:

 

import lejos.pc.comm.*;
import java.io.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JOptionPane;
import java.awt.event.*;
import javax.swing.*;


public class BTSend extends JPanel {

   NXTConnector conn; //Definerer tilkoblingen utenfor metodene så vi kan nå den fra alle metodene.

   public BTSend()
   {
       //Lager tilkoblingen.
       conn = new NXTConnector();

       //Legger til loglistener. Dersom du ikke bruker denne kan du velge å fjerne de neste 12 linjene.
       conn.addLogListener(new NXTCommLogListener() {

           public void logEvent(String message) {
               System.out.println("BTSend Log.listener: " + message);

           }

           public void logEvent(Throwable throwable) {
               System.out.println("BTSend Log.listener - stack trace: ");
               throwable.printStackTrace();

           }
       });

       //Lager en ny instans av BTSend, som nå i praksis er et panel (se linje 10; "extends JPanel").
       JTextField Tekstboks = new JTextField(); //Lager en tekstboks
       Tekstboks.setColumns(20); //Setter bredden på tekstboksen

       KeyListener keyListener = new KeyListener() {

           public void keyPressed(KeyEvent keyEvent) {
               sendKey(keyEvent);
           }

           public void keyReleased(KeyEvent keyEvent) {}
           public void keyTyped(KeyEvent keyEvent) {}

       };

       //Kobler tekstboksen sine tastehendelser sammen med funksjonene på linjene over.
       //Disse kan kanskje virke litte forvirrende, men det som skjer nå er at når 
       //du trykker en tast blir den sendt til keyPressed() over her, og så videre til
       //sendKey() under her.
       Tekstboks.addKeyListener(keyListener);

       //Legger tekstboksen inn i panelet
       this.add(Tekstboks);
   }

   public static void main(String[] args) throws Exception {

       //Lager et vindu
       JFrame Vindu = new JFrame("Mr. Anki sin ting");
       Vindu.add(new BTSend()); //Legger en instans av BTSend, som nå i praksis er et panel, i vinduet
       Vindu.pack(); //Fikser størrelsen på vinduet så panelet får plass
       Vindu.setVisible(true); //Viser vinduet

       //Gjør slik at programmet blir avsluttet når vinduet lukker.
       Vindu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   }


   public void sendKey(KeyEvent e) {

       String tegn = KeyEvent.getKeyText(e.getKeyCode());
       System.out.println(tegn);

       // Connect to any NXT over Bluetooth
       boolean connected = conn.connectTo("btspp://");


       if (!connected) {
           System.err.println("Failed to connect to any NXT");
           System.exit(1);
       }

       DataOutputStream dos = conn.getDataOut();
       DataInputStream dis = conn.getDataIn();
       boolean kaare = false;
       try {


           System.out.println("Sending " + (tegn));
           dos.writeInt((tegn));
           dos.flush();
       } catch (IOException ioe) {
           System.out.println("IO Exception writing bytes:");
           System.out.println(ioe.getMessage());
       }
       try {
           dos.close();
           dis.close();
           //conn.close(); //Lukker ikke tilkoblingen her.
           System.out.println("Ferdig avsluttet");
       } catch (IOException ioe) {
           System.out.println("IOException closing connection:");
           System.out.println(ioe.getMessage());
       }
   }
}

Endret av Degeim
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...