2013-12-20 2 views
1

Чтобы было проще - я хочу, чтобы мы щелкнули мышью по окну, заблокированному модальным JDialog.Как поймать событие щелчка мыши в окне, заблокированном открытым JDialog

Вот пример:

public class BlockedFrameTest 
{ 
    public static void main (final String[] args) 
    { 
     Toolkit.getDefaultToolkit().addAWTEventListener (new AWTEventListener() 
     { 
      @Override 
      public void eventDispatched (final AWTEvent event) 
      { 
       if (event instanceof MouseEvent) 
       { 
        System.out.println (event); 
       } 
      } 
     }, AWTEvent.MOUSE_EVENT_MASK); 

     final JFrame frame = new JFrame ("Frame"); 
     frame.add (new JLabel ("Content") 
     { 
      { 
       setBorder (BorderFactory.createEmptyBorder (100, 100, 100, 100)); 
      } 
     }); 
     frame.pack(); 
     frame.setLocationRelativeTo (null); 
     frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     frame.setVisible (true); 

     final JDialog dialog = new JDialog (frame, "Dialog"); 
     dialog.setModal (true); 
     dialog.add (new JLabel ("Content") 
     { 
      { 
       setBorder (BorderFactory.createEmptyBorder (50, 50, 50, 50)); 
      } 
     }); 
     dialog.pack(); 
     dialog.setLocationRelativeTo (frame); 
     dialog.setVisible (true); 
    } 
} 

Глядя на пример вывода журнала вы увидите, что события из JFrame не передаются, когда JDialog открыт (даже в глобальном слушателю AWT событий добавлен в примере) ,

Так что мне интересно - есть ли способ поймать щелчок на заблокированном JFrame?
Или, по крайней мере, поймать событие, когда что-то заблокированное «тронуто» пользователем?

Причина, по которой я нуждаюсь в этом, заключается в том, чтобы сделать индивидуальный JDialog-клик при возникновении такого события.

ответ

1

Может быть, это помогает:

how to obtain mouse click coordinates outside my window in Java

Его немного трудно, потому что вы покидающие сферу свинг и входящие в домен нативной GUI.

+0

Я знаю, что с использованием нативной функции поймать такое событие может быть решением, но я не буду использовать его, поскольку он только добавит много беспорядка в код и сделает его незабываемым когда-нибудь - я предпочел бы сохранить его pure-java. –

+0

hmm трудно. Как только вы выходите за пределы приложения, технически вы больше не находитесь в Java-мире. –

+0

Не совсем, я просто щелкаю другую часть того же приложения Java - я упомянул, что мне нужно только ловить события, когда пользователь щелкает какую-то другую часть того же приложения, которое заблокировано диалогом, а не другое случайное приложение, запущенное в системе , –

1

Я думаю, что вы не можете сделать, если ваш JDialog модальный, но вы можете использовать следующий трюк с FocusListener:

import java.awt.event.FocusAdapter; 
import java.awt.event.FocusEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.BorderFactory; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Example { 
    public static void main(final String[] args) { 

     final JFrame frame = new JFrame("Frame"); 
     final JDialog dialog = new JDialog(frame, "Dialog"); 
     frame.add(new JLabel("Content") { 
      { 
       setBorder(BorderFactory.createEmptyBorder(100, 100, 100, 100)); 
      } 
     }); 
     frame.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent arg0) { 
       System.out.println("frame pressed"); 
       System.out.println("dialog focused " + dialog.isFocused()); 
       System.out.println("frame focused " + frame.isFocused()); 
       super.mousePressed(arg0); 
      } 
     }); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 


     dialog.add(new JLabel("Content") { 
      { 
       setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50)); 
      } 
     }); 
     dialog.addFocusListener(new FocusAdapter() { 
      @Override 
      public void focusLost(FocusEvent arg0) { 
       super.focusLost(arg0); 
       dialog.requestFocus(); 
      } 
     }); 
     dialog.pack(); 
     dialog.setLocationRelativeTo(frame); 
     dialog.setVisible(true); 
    } 
} 

и выходом:

frame pressed 
dialog focused true 
frame focused false 
+0

Это позволило бы взаимодействовать с содержимым кадра, что плохо. И он не будет полностью имитировать модальность, поэтому я бы предпочел не использовать такие трюки. –

+0

thats только трюк, вы можете управлять взаимодействием с флагом – alex2410

+0

Я знаю, но я скорее использую модальный JDialog, чем какое-то обходное решение, поскольку это более удобно, будет (точно) действовать правильно на разных платформах и не будет требовать поддержки какого-либо кода. –