KeyListener in andere .java file.

Status
Niet open voor verdere reacties.

meesg

Gebruiker
Lid geworden
22 mrt 2011
Berichten
35
Ik wil een game maken en dan per "room" een andere keylistener. Dus wil ik een keylistener in een andere .java file.

Code die ik al heb :

Main.java
[CPP]
package game;

import javax.swing.*;

public class Main extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;

public Main(){
JFrame venster = new JFrame();
venster.setSize(192,144);
venster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
venster.setTitle("Crates");
venster.setLocation(100,100);
venster.setVisible(true);
}

public static void main( String[ ] args){
new Main();
new Menu();
}
}[/CPP]

Menu.java
[CPP]package game;

import java.awt.event.*; // voor muisacties
import javax.swing.*; // voor JPanel en JLabel

public class Menu extends JPanel
{

/**
*
*/
private static final long serialVersionUID = 1L;


// maak leeg paneel met gele achtergrond dat muisactiviteit hoort
public Menu () // constructor
{
addKeyListener(new KeyListener(){

@Override
public void keyPressed(KeyEvent e) {
System.out.println("helloWorld");

}

@Override
public void keyReleased(KeyEvent e) {

}

@Override
public void keyTyped(KeyEvent e) {

}

});
}
}[/CPP]
 
Laatst bewerkt:
Hoi,

Wat je nu doet, is voor elke ''key'' die je indrukt, print je de melding Hello World uit.
Je zult dit zien in de programmeeromgeving, niet in jouw venster. Let hier op.

Wat je nu nog moet doen, is kijken welke waarde 'e' heeft.
Van daaruit kun je doen en laten wat je wilt bij de bijbehorende letter.

Voorbeeld:
Je bent in kamer 1 en er is op de knop A gedrukt:

Code:
public void keyPressed(KeyEvent e)
{
    if(e.getActionCommand().charAt(0).equals('A')) //kijk welke letter er ingedrukt is door dit op te vragen
    {
        if(getCurrentRoom() == 1) //naar eigen smaak aan te passen
        {
            //doe iets
        }
    }
}

public int getCurrentRoom()
{
    return room; //room is dan de huidige kamer
}
 
Laatst bewerkt:
Hoi,

Wat je nu doet, is voor elke ''key'' die je indrukt, print je de melding Hello World uit. Je zult dit zien in de programmeeromgeving, niet in jouw venster. Let hier op.
Ik werk met netbeans en hoor dat te zien (tenminste als ik iets print krijg ik het altijd te zien)

Wat je nu nog moet doen, is kijken welke waarde 'e' heeft.
Van daaruit kun je doen en laten wat je wilt bij de bijbehorende letter.

Voorbeeld:
Je bent in kamer 1 en er is op de knop A gedrukt:

Code:
public void keyPressed(KeyEvent e)
{
    if(e.getActionCommand().charAt(0).equals('A')) //kijk welke letter er ingedrukt is door dit op te vragen
    {
        if(getCurrentRoom() == 1) //naar eigen smaak aan te passen
        {
            //doe iets
        }
    }
}

public int getCurrentRoom()
{
    return room; //room is dan de huidige kamer
}
Ik doe het altijd met if(e.getKeyCode()==37)

Maar hij doet nu nog helemaal niks wil niks opstarten of printen ofzo.
 
Ik wil je een tip geven bij het importeren: Gebruik alleen de imports die nodig zijn. Het programma zal trager werken hoe meer je importeert. (Jij gebruikt .*, maar het is verstandiger te kiezen voor .jframe, .jpanel, enz.)

Ik heb je code van Main.java geprobeerd in mijn Netbeans en ik krijg wel een venster te zien. Zoek eens uit of je wel de goede file executeert? Want de code is goed.
Dat verklaart ook dat meteen dat hij niets print.

Groetjes,

Mike
 
Laatst bewerkt:
Volgens mij moet het venster.addKeyListener(new KeyListener() zijn maar dat kan alleen in de .java file waar je een venster maakt

EDIT : snap nu wat je bedoeld de keylistener doet niks de rest wel ;)
 
Laatst bewerkt:
Inderdaad, er staat nu momenteel niets wat naar de listener luistert. Mogelijk wil je het volgende gebruiken:

Code:
this.addKeyListener(new KeyListener()
{
    //override methodes
});

Nu gebruik je een JPanel die luistert naar keys, aangezien je jouw klasse van een JPanel afleidt.
 
Heb nu niet werkend :

Main.java
[CPP]
package game;

import javax.swing.*;

public class Main extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
public int i;
public Main(){
JFrame venster = new JFrame();
venster.setSize(192,144);
venster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
venster.setTitle("Crates");
venster.setLocation(100,100);
venster.setVisible(true);
}

public static void main( String[ ] args){
new Main();
new Menu();
System.out.println();
}
}[/CPP]

Menu.java
[CPP]
package game;

import java.awt.event.*; // voor muisacties
import javax.swing.*;

public class Menu extends JFrame
{

/**
*
*/
private static final long serialVersionUID = 1L;

// maak leeg paneel met gele achtergrond dat muisactiviteit hoort
public Menu () // constructor
{

this.addKeyListener(new KeyListener(){

@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==38) {
System.out.println("pijl boven");
}


}

@Override
public void keyReleased(KeyEvent e) {

}

@Override
public void keyTyped(KeyEvent e) {

}

});
}
}
[/CPP]

Als je een andere manier weet om der een keylistener in te brengen vind ik dat ook goed
 
Een andere mogelijkheid is een ActionListener:

Code:
package game;
 
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
 
public class Menu extends JFrame implements ActionListener
{

    private static final long serialVersionUID = 1L;
 
    public Menu ()
    {    
    }

    public void ActionPerformed(ActionEvent e) //override methode, hoort bij de implementatie
    {
        char c = e.getActionCommand.charAt(0);
        //doe iets met c;
    }
}
 
Dus als je iets onder "char c = e.getActionCommand.charAt(0);" zet dan gebeurt er iets als je op c drukt
 
Verder nog iets wat not done is:

[cpp]

public CustomFrame extends JFrame{

public customFrame(){

JFrame frame = new JFrame();
}

[/cpp]

je bent dus een JFrame in een JFrame aan het maken. verder maak je geen gebruik van je super class.
easy fix: Of gebruik je superclass en haal JFrame frame = new JFrame(); weg, of haal de extends JFrame weg.
 
Laatst bewerkt:
[cpp]

public CustomFrame extends JFrame{

public customFrame(){

super.setSize(600,600);
//etcetera
}
}
[/cpp]
 
Toch nog niet helemaal krijg nu 2 frames
code :

Main
[cpp]
package game;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;

public class Main extends JFrame{
/**
*
*/
private static final long serialVersionUID = 1L;
public final int room = 0;
/* Room 1 = menu
* Room 2 = opties
* Room 3 = game
*/
public Main(){
super.setSize(192,144);
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.setTitle("Crates");
super.setLocation(100,100);
super.setVisible(true);
}

public static void main( String[ ] args){
new Main();
new Menu();
System.out.println();
}
}
[/cpp]

Menu
[cpp]
package game;

import java.awt.event.*;
import javax.swing.*;

public class Menu extends Main
{

/**
*
*/
private static final long serialVersionUID = 1L;
int kiezer = 1;

public Menu () // constructor
{
super.addKeyListener(new KeyListener(){

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
}

@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==38){
System.out.println("Omhoog");
if(kiezer > 1){
kiezer--;
}
else{
kiezer = 3;
}
System.out.println(kiezer);
}
if(e.getKeyCode()==40){
System.out.println("Omlaag");
if(kiezer < 3){
kiezer++;
}
else{
kiezer = 1;
}
System.out.println(kiezer);
}
}

});
}
}
[/cpp]
 
dat klopt inderdaad.
Aangezien je 2 jframes opened. namelijk Menu en Main. Misschien moet je toch eens kijken naar overervings technieken je extend namelijk Main van JFrame, vervolgens maak je een 2e classe aan die Main extends.

kijk hier eens naar, als je snapt wat hier allemaal gedaan wordt dan zul je deze problemen niet meer krijgen

http://docs.oracle.com/javase/tutorial/java/concepts/index.html
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan