In windowClosing() abfragen, ob STRG gedrückt wurde

Hutmacher

Bekanntes Mitglied
Hallo!
In meinem Programm sollen bei einem Klick auf den Schließen-Button (Windows) Daten gespeichert werden. Wird allerdings beim Schließen die STRG-Taste gehalten, sollen die Daten nicht gespeichert werden.

Wie kann ich also z.B. aus der windowClosing()-Methode eines JFrames abfragen, ob momentan STRG gedrückt ist? Ist das direkt in der Methode abfragbar oder muss ich den Umweg über keyPressed, keyReleased und einer Instanzvariablen gehen?

Danke 🙂
 
mir würde da nur ein Shutdown-Hook einfallen. Ein Shutdown-Hook ermöglicht es dir, vor dem schließen der JVM noch Aktionen auszuführen (Daten speichern). Der richtige Zeitpunkt zum überprüfen ob Strg beim klick auf [x] gedrückt wird ist das allerdings nicht. Du könntest eine Variable
Code:
isStrgPressed
immer auf true Setzen wenn Strg gedrückt ist, dann diese in der Hook abfragen... Würde mir als erste Idee einfallen 😉
 
Gibts nicht auch die Möglichkeit einen WindowListener zu implementieren und darin zu überprüfen, ob strt gedrückt wurde? Ist das vielleicht ein bisschen einfacher?
 
Danke für eure Antworten 🙂

@Gucky: Leider nicht 🙁 Die Methoden des WindowListeners (windowClosing und der gleichen) bekommen als Argumente WindowEvents, die aber leider keine "isControlDown"-Methode oder "getModfiers" wie in bspw. KeyEvent anbieten.

@NoXiD: So ähnlich habe ich mir auch meinen alternaiven Weg vorgestellt^^ Das Blöde ist nur, dass ich mich dann um so Sachen kümmern muss wie: Was passiert, wenn ich STRG drücke, dann den Fokus auf ein anders Fenster wechsle, und STRG wieder loslasse? Was passiert, wenn ich unerwarteterweise mal in modaler Dialog ins Programm schiebt und ich dann STRG loslasse? Was passiert, wenn ich schon vorm Start des Programms STRG halte und dann schließen möchte? Was passiert, wenn ich beide STRG-Tasten gleichzeitig drücke?

Das sind natürlich alles Dinge, um die man sich kümmern kann (per komplexen Status-Abfragen, FocusListeners, Timer etc.). Aber das ist natürlich umständlich und man übersieht womöglich irgendwelche Randbedingungen^^
 
Zuletzt bearbeitet:
Nicht perfekt aber macht was es soll 🙂

Java:
public class Main {
   /**
    * @param args
    */
   public static void main(String[] args) {
     new tesat();
   }



}

Java:
public class tesat extends JFrame {
   public tesat() {
      super();
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      addWindowListener(new wlist(this));
      setLocationRelativeTo(null);
      setSize(400, 400);
      setVisible(true);
   }
}
Java:
public class wlist implements WindowListener, KeyListener {
   private boolean pressed;

   public wlist() {
      super();
   }

   public wlist(Component c) {
      super();
      c.addKeyListener(this);
   }

   @Override
   public void keyTyped(KeyEvent e) {
      // TODO Automatisch generierter Methodenstub
   }

   @Override
   public void keyPressed(KeyEvent e) {
      if (e.getKeyChar() == 'e') {
         pressed = true;
         System.out.println("ok");
      }
   }

   @Override
   public void keyReleased(KeyEvent e) {
      if (e.getKeyChar() == 'e') {
         pressed = false;
      }
   }

   @Override
   public void windowOpened(WindowEvent e) {
      // TODO Automatisch generierter Methodenstub
   }

   @Override
   public void windowClosing(WindowEvent e) {
      if (pressed) {
         System.out.println("Arbeite alles ab");
      } else {
         System.out.println("Mach dich zu");
      }
   }

   @Override
   public void windowClosed(WindowEvent e) {
   }

   @Override
   public void windowIconified(WindowEvent e) {
      // TODO Automatisch generierter Methodenstub
   }

   @Override
   public void windowDeiconified(WindowEvent e) {
      // TODO Automatisch generierter Methodenstub
   }

   @Override
   public void windowActivated(WindowEvent e) {
      // TODO Automatisch generierter Methodenstub
   }

   @Override
   public void windowDeactivated(WindowEvent e) {
      // TODO Automatisch generierter Methodenstub
   }
}
 
@ssoul26: Danke, dass du dir die Mühe gemacht hast, mir das Beispiel zu schreiben 🙂 Allerdings glaube ich, dass bei dieser Methode ein paar kleine Probleme entstehen könnten. Siehe dazu mal meine Antwort an NoXiD im vorigen Post 🙂
 
Zuletzt bearbeitet:
Hallo,

ich denke, dass nicht nur die technische Ebene betrachtet werden sollte. Dieses Bedienkonzept finde ich etwas zweifelhaft.

Was spricht gegen die gewohnten Bedienkonzepte?
- Also z.B. Ok/Cancel Buttons wenn es ein dialogartiges Fenster ist
- Also ein File -> Save Menu zum Speichern (Bei Dokumenten die bearbeitet werden).
- Einer Abfrage, wenn ungespeicherte Daten im Fenster sind und der Benutzer es schliessen möchte

Ich würde schon etwas verstört reagieren, wenn meine Daten weg sind, nur weil die strg Taste mal hing oder gedrückt wurde. (Nutze ich z.B. als Aktivator für das Micro bei TS3 und ist teil der Hostkey Kombo bei meiner vmware workstation installation....)

Mit den besten Grüßen,

Konrad
 
@kneitzel: Deinen Gedankengängen würde ich auch unmittelbar zustimmen. In der Tat habe ich sie sogar schon umgesetzt, allerdings noch mit ein paar Konfigurationsmöglichkeiten. Damit ich nicht das Ganze System dahinter erklären muss: Ich bin derzeit nur an der technischen Umsetzung interessiert 🙂 Aber trotzdem danke!
 
@kneitzel: Deinen Gedankengängen würde ich auch unmittelbar zustimmen. In der Tat habe ich sie sogar schon umgesetzt, allerdings noch mit ein paar Konfigurationsmöglichkeiten. Damit ich nicht das Ganze System dahinter erklären muss: Ich bin derzeit nur an der technischen Umsetzung interessiert 🙂 Aber trotzdem danke!

Also die Instanzvariable wäre auch das einzige, was mir einfällt. Das liese sich dann auch gut in eine eigene Klasse auslagern damit es dein JFrame nicht zumüllt aber an den beschriebenen Problemen wie STRG wird gedrückt, focus kommt aufs Fenster, [X] wird gedrückt änder das nichts.
Es wäre nur mal interessant, ob nicht generell ein KeyReleased-Event ausgelöst wird, wenn das Fenster den Focus verliert => testen!

Aber: ich denke über JNI solltest du direkt die Tastatur ansprechen können (genauer das OS, da sollte es eigentlich Methoden/Routinen alá
Code:
isKeyDown(int keyCode)
geben) und mit großer Wahrscheinlichkeit zuverlässig feststellen können, ob STRG gedrückt ist.
Wenn das OS mal rumspinnt kannst du halt nichts machen, da ist dann ein Modaler Dialog schon sicherer. Ich persönlich würde mich ärgern, wenn Daten verloren gehen weil Windows bissl langsam war mit reagieren (wenn es mal wieder hängt).
 
Zuletzt bearbeitet:

Zurück
Oben