Mr.Anki Skrevet 9. april 2011 Forfatter Del Skrevet 9. april 2011 (endret) Hvordan jeg jeg bruke resultatet av variablen "kjellolav" i metoden som ligger over? Har markert hvor i koden jeg vil at resultatet skal sendes. public class BTSend extends JPanel { int kaja = 0; 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(); int bob = 0; boolean bobkaare = false; JFrame Vindu = new JFrame("Mr. Anki sin ting"); Vindu.pack(); //Fikser størrelsen på vinduet så panelet får plass Vindu.add(new BTSend()); Vindu.setVisible(true); //Viser vinduet //Gjør slik at programmet blir avsluttet når vinduet lukker. Vindu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // int jostein = 0; // jostein = sendKey(); try { System.out.println("Sending " + (kjellolav)); dos.writeInt((kjellolav)); //HVORDAN KAN JEG BRUKE KJELLOLAV HER? dos.flush(); } catch (IOException ioe) { System.out.println("IO Exception writing bytes:"); System.out.println(ioe.getMessage()); bobkaare = true; } /* 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()); } */ } 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() { int kjellolav = 0; public void keyPressed(KeyEvent keyEvent) { kjellolav = sendKey(keyEvent); //HVORDAN FÅ RESULTATET AV KJELLOLAV TIL METODEN OVER? System.out.println(kjellolav); } public void keyReleased(KeyEvent keyEvent) {} public void keyTyped(KeyEvent keyEvent) {} }; Tekstboks.addKeyListener(keyListener); //Legger tekstboksen inn i panelet this.add(Tekstboks); } public int sendKey(KeyEvent e) { String tegn = KeyEvent.getKeyText(e.getKeyCode()); int tall = 0; if (tegn.equals("A")) { tall = 1; } return tall; } } Endret 9. april 2011 av Mr.Anki Lenke til kommentar
Degeim Skrevet 10. april 2011 Del Skrevet 10. april 2011 Hvorfor har du flyttet sendingen tilbake til main()? Det i main() skjer kun én eneste gang for hver kjøring av programmet, og er fullstendig uegnet for ting som skal skje for eksempel ved tastetrykk. Med mindre du har en veldig god grunn, så få den tilbake til sendKey-metoden slik jeg viste deg i min forrige kodesnutt. For at du skal kunne bruke en variabel i flere metoder må den defineres utenfor metodene, slik du har gjort med "kaja" her. (Men det er igjen unødvendig hvis du beholder funksjonaliteten i sendKey().) Lenke til kommentar
Mr.Anki Skrevet 10. april 2011 Forfatter Del Skrevet 10. april 2011 Kunnskapen om java er ikke helt god desverre derfor ble den i håp om at det skulle fungere flyttet. La vi gå tilbake til den tidligere koden. Hvor skal jeg definere variabel i som skal brukes flere steder? Liten oppsummering på det som skal skje: 1. Opprette connection 2. Sende tegn, skal kjøre i en loop. 3. Stenge connection når en lukker vinduet. 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()); } } } Lenke til kommentar
Degeim Skrevet 10. april 2011 Del Skrevet 10. april 2011 1. Er allerede i boks. Tilkoblingen blir opprettet sammen med vinduet. 2. Kjører ikke i loop, men bruker events for å "lytte" til når brukeren skriver noe i tekstfeltet. Har du noen problemer med hvordan denne delen fungerer nå? 3. For å få til dette trenger vi litt mer kode: Legg denne mellom "NXTConnector conn; //Definerer tilkoblingen utenfor metodene så vi kan nå den fra alle metodene." og "public BTSend()": class WindowEventHandler extends WindowAdapter { public void windowClosing(WindowEvent evt) { conn.close(); } } Deretter legger du denne linjen like under "JFrame Vindu = new JFrame("Mr. Anki sin ting");": Vindu.addWindowListener(new WindowEventHandler()); Lenke til kommentar
Mr.Anki Skrevet 10. april 2011 Forfatter Del Skrevet 10. april 2011 (endret) Takk skal du ha! Får følgende feilmelding: Line:69: non-static variable this cannot be referenced from a static context Vindu.addWindowListener(new WindowEventHandler()); ^ Markert i koden: 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. class WindowEventHandler extends WindowAdapter { public void windowClosing(WindowEvent evt) { conn.close(); } } 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.addWindowListener(new WindowEventHandler()); //FEILMELDING 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 10. april 2011 av Mr.Anki Lenke til kommentar
Degeim Skrevet 10. april 2011 Del Skrevet 10. april 2011 Prøv nå: import lejos.pc.comm.*; import java.io.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowEvent; 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() { /******************************************************************* * * Hvis du synes sendKey blir kjørt på rare tidspunkt (må du trykke enter for at det skal skje noe? skjer det ved tast-ned i stedet for tast-opp?), * så kan du prøve å bytte på hvilken av de følgende tre som ikke er kommentert ut. * *******************************************************************/ public void keyPressed(KeyEvent keyEvent) { sendKey(keyEvent); } public void keyReleased(KeyEvent keyEvent) { //sendKey(keyEvent); } public void keyTyped(KeyEvent keyEvent) { //sendKey(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"); final BTSend bt = new BTSend(); Vindu.add(bt); //Legger en instans av BTSend, som nå i praksis er et panel, i vinduet Vindu.addWindowListener(new WindowListener() { public void windowOpened(WindowEvent e) {} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e) {} public void windowDeactivated(WindowEvent e) {} public void windowActivated(WindowEvent e) {} public void windowClosed(WindowEvent e) {} //Sørger for at vi kjører lukkemetoden når vinduet lukkes. public void windowClosing(WindowEvent e) { bt.closeConnection(); } }); 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 closeConnection(){ System.out.println("Lukker ..."); conn.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(); System.out.println("Ferdig avsluttet"); } catch (IOException ioe) { System.out.println("IOException closing connection:"); System.out.println(ioe.getMessage()); } } } Lenke til kommentar
Mr.Anki Skrevet 10. april 2011 Forfatter Del Skrevet 10. april 2011 (endret) hmm, må fremdeles trykke en tast for at selve connection skal starte. og deretter feiler hele greia. Edit: Har fått til en fungerende løsning nå, takk for all hjelp Endret 10. april 2011 av Mr.Anki Lenke til kommentar
Marius5051 Skrevet 6. mai 2011 Del Skrevet 6. mai 2011 Nå er jeg fryktelig nysgjerrig på hva denne koden skal gjøre. Det kan da umulig kreves så mye kunnskap for å bruke Lego Mindstorm? Skal kjøpe meg dette selv, neste gang jeg er i England, hvor ma kan få et sett til nesten halve prisen Lenke til kommentar
Mr.Anki Skrevet 6. mai 2011 Forfatter Del Skrevet 6. mai 2011 Det er mulig å programmere roboten med Java, noe som er gjort her. Men den mest brukte måten å programmere de er nok å bruke programvare som følger med, har ikke testet dette men har inntrykk av at det er rimelig enkelt. Type dra og slipp. Lenke til kommentar
Marius5051 Skrevet 6. mai 2011 Del Skrevet 6. mai 2011 Har fått et inntrykk av at programmet som Lego har laget er et enkelt drag-and-drop blokkdiagram, ja. godt mulig at de funksjonene de har lagt til er noe begrenset. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå