2016-08-01 8 views
1

Ich mache ein Projekt in der Schule und ich habe eine Besonderheit zu implementieren, aber einige Probleme haben. Was ich tun muss ist, dass ich die Anzahl der Betten in meiner SQL-Datenbank überprüfen muss und wenn es unter eine kritische Zahl fällt, erscheint ein JOptionPane.Stoppen MouseMoved Ereignis in Java

Was ich versuche, ist ein anderes Szenario, das härter ist, 2 Frames geöffnet. Wenn der erste Frame-Benutzer das Bett verwendet, wird er auf den kritischen Wert 10 fallen, während der andere Rahmen, wenn der Benutzer seinen Mauspfeil bewegt, das JOptionPane mit einer Nachricht öffnet.

Ich habe in dieser Community nachgeschlagen, aber ich kann nicht scheinen, die Codes zu implementieren, damit es funktioniert. Ich habe einen Punkt erreicht, an dem es keine Fehler gibt, aber ich kann das JOptionPane nicht schließen. Grundsätzlich möchte ich nur, dass dieses Ereignis nur dann ausgelöst wird, wenn der Benutzer eines der Frames unter die Bettenanzahl fällt.

Ich bin brandneu zu diesem Actionevent. Ich mache dieses Projekt als 3-Tier-Programmierung mit MySQL-Datenbank.

Ich habe an diesen Stellen gesucht, aber ohne Erfolg:

Stopping mouseMoved

How to temporarily disable event listeners in Swing?

-Code für den Rahmen der JOptionPane für Controller Klasse

public HomePageForm() { 
    setTitle("Home"); 
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
    setBounds(100, 100, 640, 428); 
    contentPane = new JPanel(); 
    contentPane.addMouseMotionListener(new MouseMotionAdapter() { 
     @Override 
     public void mouseMoved(MouseEvent e) { 

      String cardioMsg = "Beds are running out for Cardiothoracic Department!"; 
      String oncoMsg = "Beds are running out for Oncology Department!"; 
      String orthoMsg = "Beds are running out for Orthopaedic Department!"; 
      String pediaMsg = "Beds are running out for Pediatric Department!"; 

      if (ignoreMouseMovedEvents) { 
       return; 
      } 

      ArrayList<ChangeBed> bedList = new ArrayList<ChangeBed>(); 

      ChangeBedControl cbc8 = new ChangeBedControl(); 

      bedList = cbc8.processCountBedsAvailableDpt4(); 

      for (int i = 0; i < bedList.size(); i++) { 

       bedsForPediatric = bedList.get(i).getRowCountAvail(); 

      } 

      if (bedsForPediatric <= 3) { 

       int valuePedia = JOptionPane.showConfirmDialog(null, pediaMsg, "URGENT", JOptionPane.WARNING_MESSAGE); 

       if (valuePedia == 0 || valuePedia == 2) { 
        ignoreMouseMovedEvents = true; 
        valuePedia = JOptionPane.CLOSED_OPTION; 
       } 

      } 

     } 
    }); 

Codes zeigen

public ArrayList<ChangeBed> processCountBedsAvailableDpt4() { 

    ChangeBed changeBed = new ChangeBed(); 

    ArrayList<ChangeBed> bedList = new ArrayList<ChangeBed>(); 

    bedList = changeBed.countBedsAvailableDpt4(); 

    return bedList; 

} 

Entity Klasse von SQL DB

public ArrayList<ChangeBed> countBedsAvailableDpt4() { 

    ArrayList<ChangeBed> bedList = new ArrayList<ChangeBed>(); 

    boolean rowBooleanAvail; 

    int rowCountAvail; 

    try { 

     myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/ooadp?useSSL=false", "root", "root"); 

     Statement myStmt = myConn.createStatement(); 

     ResultSet myRs = myStmt.executeQuery("SELECT count(*) FROM bed WHERE bedStatus = 'Available' AND department = 'Pediatric'"); 

     while (myRs.next()) { 

      rowBooleanAvail = myRs.last(); 

      rowCountAvail = myRs.getRow(); 

      ChangeBed cb = new ChangeBed(myRs.getInt(rowCountAvail), ""); 

      bedList.add(cb); 

      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    return bedList; 

} 

Grundsätzlich abrufen Ich habe auch einen Login-Rahmen, beim Einloggen in den Rahmen eröffnet ich in den obigen Codes gezeigt haben. Zuerst zeigt ein JOptionPane bei Mousemoved-Ereignis eine Warnmeldung an. Sobald ich auf Ok/Abbrechen klicke, wird das JOptionPane geschlossen und das mousemoved-Ereignis gestoppt.

Wenn ich einen anderen Login-Rahmen habe, mit dem ich mich auf der Homepage anmelde (Codes des oben gezeigten Rahmens), wird der gleiche Vorgang wiederholt, wobei eine Optionspaneel angezeigt wird.

So jetzt habe ich 2 Homepages geöffnet und beide Mausbewegung deaktiviert und es wird nicht erneut ausgelöst.

Für Frame 2, wenn ich den kritischen Wert treffen sollte, um das JOptionPane zu zeigen, sobald ich die Maus im ersten Startrahmen bewege - wie kann ich das machen?

+2

Unerreichter Hinweis auf Code-Qualität: versuchen Sie nicht, * Ihre * UI mit dem Rest Ihres Programms * zu koppeln. Bedeutung: Erstellen Sie Klassen/Methoden, die mit Ihren "Daten" umgehen; und dann sollte Ihre Benutzeroberfläche diese Klassen/Methoden verwenden. Fügen Sie keine Dutzend Codezeilen in einzelne Listener-Methoden ein. Das funktioniert für einen Tag, aber wenn Sie nächste Woche wiederkommen, werden Sie feststellen, dass solcher Code schwer zu lesen, zu warten, zu erweitern ist ... – GhostCat

+0

Okay, ich habe es .. Ich mache 3-Tier-Programmierung für mein Projekt. Aber nur hoffen, jemanden zu finden, der mir bei meinem Problem helfen könnte. Grundsätzlich das JOptionPane zu schließen und das mousevoved-Ereignis vorübergehend zu stoppen und zu wissen, wie man das Event wieder aktiviert. Danke wird es in Zukunft merken! @GhostCat – domster

+1

1) Siehe [Die Verwendung mehrerer JFrames, gute/schlechte Praxis?] (Http://StackOverflow.com/q/9554636/418556) 2) Für bessere Hilfe früher, post ein [MCVE] oder [Short, Selbstenthaltenes, korrektes Beispiel] (http://www.sscce.org/). –

Antwort

1

Lass uns mit einer Frage antworten: Warum willst du die Events stoppen?

Bedeutung: Sie haben einen Listener programmiert, der auf bestimmte Ereignisse reagiert. Jetzt sagst du: irgendwann; Ich will keine "Reaktionen"; Wie verhindere ich, dass diese Ereignisse in meinen Hörer gelangen ?!

Das ist eine Möglichkeit, es zu betrachten.

Die andere: einfach Ihre Zuhörer sagen (n), dass sie eingehende Ereignisse ignorieren sollten, wie:

Class SomeExample { 
    private boolean ignoreMouseMovedEvents = false; 
    ... 
    @Override 
    public void mouseMoved(MouseEvent e) { 
    if (ignoreMouseMovedEvents) { 
     return; 
    } 
    ... handle move events 

Jetzt müssen Sie nur, dass boolean Feld aktualisieren, wenn Sie die Maus bewegen Ereignisse ignorieren wollen.

Aber lassen Sie uns hier präzise sein: Ich sage nicht, dass ignorieren Ereignisse ist immer die beste Lösung. Ich drücke nur aus: Wenn es schwer für dich ist, zu verhindern, dass Ereignisse "in dein System kommen"; dann ist es vielleicht einfacher, sie kommen zu lassen; aber ändern Sie die Art, wie Ihr System auf sie reagiert.

Endlich: es gibt auch eine etwas andere Variante: Anstatt dem Zuhörer zu sagen, dass er Ereignisse ignorieren soll; Sie können auch Ihre Listener von der Ereignisquelle abmelden. Mit anderen Worten: Sie können Ihren Listener einfach aus dem Rahmen entfernen, an den Sie ihn angehängt haben. Und Sie fügen es erneut hinzu, wenn Ereignisse erneut verarbeitet werden sollen.

+0

Omg .. Yup es funktioniert jetzt! Ich bin fertig mit meinem Projekt. Vielen Dank @GhostCat! Aber was, wenn ich es zurückrufen möchte? Wie bei einem Szenario, bei dem der erste Frame angezeigt wird, hat der Benutzer das JOptionPane bereits geschlossen und der zweite Frame-Benutzer wird den kritischen Wert erreichen. Wie kann der Benutzer aus dem 1. Frame das JOptionPane verwenden, um wieder hochzufahren? – domster

+0

Wenn die Antwort für Sie funktioniert, dann kreuzen Sie einfach das "accept" -Ding an. Aber bitte vermeiden Sie die "eine weitere Frage" als Kommentaransatz. Aber hey: Ich nehme an, dass Ihre beiden JFrames innerhalb derselben JVM-Instanz laufen. In diesem Fall müssen Sie ein Objekt erstellen, auf das ** Ihre ** JFrames zugreifen können. Sie sehen, das ist mein anfänglicher Kommentar: Ihre "DB" Schicht stellt ihre Funktionen einer, zwei, N UI Komponenten zur Verfügung. Bedeutung: JFrame A bringt einige Informationen in diese "DB-Schicht"; und JFrame B erhält seine Informationen von dort. – GhostCat

+0

Offen gesagt, ich bin mir nicht sicher, wie ich das umsetzen soll. Ich habe die Idee .. Tut mir leid, aber wenn ich das Szenario weiter erklären kann. 2 Login Frames, ein User meldet sich an und die Homepage erscheint mit dem JOptionPane @ frame1. Ein anderer Benutzer meldet sich an und die Startseite erscheint mit dem JOptionPane wie frame1. Aber sobald der 2. User für Frame 2 die kritische Zahl erreicht hat. Frame zeigt das JOptionPane wieder. – domster

Verwandte Themen