BlueJ warte bis Taste Gedrückt?BlueJ Warten?
Ich habe bereits eine Funktion gefunden damit BlueJ eine gewisse zeit wartet:
Sys.warte(50); //warte 50 Ms
Jetzt suche ich eine Elegante Möglichkeit um zu warten bis eine Taste Gedrückt wurde. Bis jetzt habe ich es mit einer while schleife gemmacht wobei das sehr bescheiden funktioniert:
while(!tastatur.enter() )
{}
2 Antworten
In BlueJ musst du wohl eine Verzögerung in die While-Schleife einbauen, weil leere Schleifen Java unheimlich auf die Nerven gehen.
Wenn du ECHTES Java programmieren würdest, könntest du sogenannte keyListener verwenden. Die rufen sofort deine Methoden auf, wenn jemand eine Taste drückt.
Das kombiniert mit der Suspend-Funktion von Thread lässt dich sowas auch in deinem Hauptprogramm machen.
Eine Sache mißverstehst du.
GLOOP IST eine externe Bibliothek, die nur ein Bruchteil von Javaentwicklern benutzen würde.
KeyListener sind Bestandteil der JavaSE-API die jeder, der Java installiert hat, zwangsläufig haben muss.
also muss ich in die while schleife ein Sys.warte () oder so einbauen?
Das würde die Performance etwas schonen und sollte klappen.
Das Warten oder die Nutzung von Schleifen ist sehr ineffizient und unsauber. Nutze stattdessen Listener, in diesem Fall den KeyListener. Der minimale Code für Swing sieht beispielsweise folgendermaßen aus:
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.awt.EventQueue;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
// Klasse muss Listener implementieren
public class Test extends JFrame implements KeyListener {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test test = new Test();
test.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Test() {
setSize(500, 500);
// Listener hinzufügen
addKeyListener(this);
}
// Die folgenden drei Methoden müssen in der Klasse
// implementiert werden
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
JOptionPane.showMessageDialog(null, "Enter wurde gedrückt!");
}
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {}
}
Stattdessen ist die Nutzung von anonymen Listenern ebenfalls eine korrekte Schreibweise:
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.awt.EventQueue;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Test extends JFrame {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Test test = new Test();
test.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Test() {
setSize(500, 500);
// Listener hinzufügen
addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
JOptionPane.showMessageDialog(null, "Enter wurde gedrückt!");
}
}
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyReleased(KeyEvent e) {}
});
}
}
ehrlich gesagz hab ich kein plan von irgendwelchen listenern und wir dürfen auch nur mit gloop arbeiten...😅
Ist halt nur BlueJ. Listener sind Funktionen die aufgerufen werden, wenn etwas passiert, in diesem Fall ein KeyListener wenn man mit Fokus auf ein UI-Element eine Taste drückt.
Würde man machen, wnen man eine AWT-basiertes UI macht.
BlueJ basiert soweit ich weiß auf AWT, aber trotzdem sollte man hier wohl bei BlueJ-Lösungen bleiben.
Mit BlueJ lassen sich auch Swing- und AWT-Anwendungen entwickeln. Er verwendet aber leider GLOOP. Ich habe mir gerade mal die Dokumentation davon angesehen. Von Listenern ist dort keine Rede, also bleibt wohl nur die unschöne Möglichkeit, eine Schleife zu verwenden...
Sollte man verschiedene anfragen mit der gleichen Taste bestätigen will, sollte man es wie folgt machen da sonst mit einem druck möglicherweise mehrere Aktionen ausgeführt werden:
Es ist zwar lang, aber Funktioniert bei mir immer zuverlässig und klappt auch ohne andere Bibliotheken.
Ich hoffe ich konnte hiermit noch jemandem helfen ^^