Gå til innhold

Hvor skal metoden plasseres?


Anbefalte innlegg

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 av Mr.Anki
Lenke til kommentar
Videoannonse
Annonse

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

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

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

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 av Mr.Anki
Lenke til kommentar

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
  • 4 uker senere...

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 :thumbup:

Lenke til kommentar

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

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...