2016-08-01 10 views
1

Я делаю проект в школе, и у меня есть функция отличия для реализации, но у меня есть некоторые проблемы. Что мне нужно сделать, так это то, что я должен проверить количество спальных мест, оставшихся в моей базе данных SQL, и если он будет ниже критического числа, появится JOptionPane.Остановка MouseMoved Event в Java

Что я пытаюсь сделать, это еще один сценарий, который является более жестким, 2 кадра открыты. Например, пользователь первого кадра использует кровать, он упадет до критического значения 10, на другом кадре, когда пользователь перемещает стрелку мыши, появляется сообщение JOptionPane, показывающее сообщение.

Я искал в этом сообществе, но я не могу реализовать коды, чтобы заставить его работать. Я дошел до того, что ошибок нет, но я не могу закрыть JOptionPane. В принципе, я бы хотел, чтобы это событие срабатывало только тогда, когда пользователь обоих фреймов опускался ниже слоя.

Я новичок в этом мероприятии. Я делаю этот проект как трехуровневое программирование с базой данных MySQL.

Я смотрел на этих сайтах, но безрезультатно:

Stopping mouseMoved

How to temporarily disable event listeners in Swing?

Код для рамы, чтобы показать JOptionPane

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; 
       } 

      } 

     } 
    }); 

коды для контроллеров класса

public ArrayList<ChangeBed> processCountBedsAvailableDpt4() { 

    ChangeBed changeBed = new ChangeBed(); 

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

    bedList = changeBed.countBedsAvailableDpt4(); 

    return bedList; 

} 

Entity класс для извлечения из БД SQL

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; 

} 

В принципе я также Войти кадр, при входе в систему он открывает рамку, которую я показал в вышеуказанных кодов. Сначала показывает событие JOptionPane on Mousemoved, на котором отображается предупреждающее сообщение. Как только я нажму Ok/Cancel, он закрывает JOptionPane и останавливает событие mousemoved.

Если у меня есть другой логин, в котором я заходил на главную страницу (коды фрейма, показанные выше), тот же процесс будет повторяться, когда будет показана опция.

Итак, теперь у меня будет открыта 2 общедоступных страницы, и обе муссоменное событие деактивировано, и оно не будет срабатывать снова.

Для кадра 2, если бы я попал в критическое значение, чтобы показать JOptionPane, как только я перевешу мышь в первый ракурс домашней страницы - как я могу это сделать?

+2

Несвязанный намек на качество кода: попробуйте не * пара * ваш пользовательский интерфейс для остальной части вашей программы. Значение: создавать классы/методы, которые обрабатывают ваши «данные»; и тогда ваш пользовательский интерфейс должен использовать эти классы/методы. Не ставьте десятки строк кода в один метод прослушивания. Это работает в течение дня, но когда вы вернетесь на следующей неделе, вы обнаружите, что такой код трудно читать, поддерживать, расширять ... – GhostCat

+0

Хорошо, я понял. Я занимаюсь программированием на 3 уровня для моего проекта. Но просто надеюсь найти кого-то, кто мог бы помочь мне с моей проблемой. В основном закрытие JOptionPane и временное приостановление события mousemoved и знание того, как активировать событие. Спасибо, обратите внимание на будущее! @GhostCat – domster

+1

1) См. [Использование нескольких JFrames, Good/Bad Practice?] (Http://stackoverflow.com/q/9554636/418556) 2) Для лучшей помощи раньше, отправьте сообщение [MCVE] или [Short, Самостоятельный, правильный пример] (http://www.sscce.org/). –

ответ

1

Давайте ответим на вопрос: почему вы хотите остановить события?

Смысл: вы запрограммировали прослушиватель, который реагирует на определенные события. Теперь вы говорите: в какой-то момент; Я не хочу «реакций»; так как я могу предотвратить то, что происходит в моем слушателе ?!

Это один из способов взглянуть на него.

Другой: просто скажите вашему слушателю (ы), что они должны игнорировать входящие события, как:

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

Теперь вам просто нужно обновить это логическое поле всякий раз, когда вы хотите, чтобы игнорировать события перемещения мыши.

Но давайте уточним здесь: Я не говорю, что игнорирование событий всегда является лучшим решением. Я просто выражаю: если вам трудно предотвратить события от «входа в вашу систему»; тогда, может быть, легче позволить им прийти; но измените способ реагирования вашей системы на вашу систему.

И наконец: есть также несколько другое изменение этого: вместо того, чтобы рассказывать слушателю о игнорировании событий; вы можете также удалить регистрацию своих слушателей из источника событий. Другими словами: вы можете просто удалить слушателя из рамки, к которому вы его привязали. И вы повторно добавляете его, когда события должны быть обработаны снова.

+0

Омг .. Он работает сейчас! Я закончил с моим проектом. Большое спасибо @GhostCat! Но что, если я хочу его перезвонить? Как и наоборот, с помощью 1-го кадра пользователь уже закрыл JOptionPane, а второй пользователь Frame поразил критическое значение. Как пользователь из 1-го кадра будет воспроизводить JOptionPane? – domster

+0

Если ответ работает на вас, тогда просто проверьте «принять» вещь рядом с ним. Но, пожалуйста, избегайте «еще одного вопроса» в качестве комментария. Но heck: Я предполагаю, что ваши два JFrames работают в одном экземпляре JVM. Если это так, вам нужно создать объект, к которому ** оба ** имеют доступ к вашим JFrames. Понимаете, это мой первоначальный комментарий: ваш уровень «DB» предоставляет свои функции одному, двум, N компонентам пользовательского интерфейса. Значение: JFrame A помещает некоторую информацию в этот «уровень БД»; и JFrame B получает информацию оттуда. – GhostCat

+0

Честно говоря, я не знаю, как реализовать. Я понимаю ... Извините, но если я еще могу объяснить сценарий. 2 Login Frames, один пользователь входит в систему, и на главной странице появляется JOptionPane @ frame1. Другой пользователь входит в систему, и на главной странице появляется JOptionPane, например frame1. Но как только второй пользователь для кадра 2 попадает в критическое число. Рамка снова показывает JOptionPane. – domster

 Смежные вопросы

  • Нет связанных вопросов^_^