2013-12-20 19 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 blick。

回答

1

也許這會有所幫助:

how to obtain mouse click coordinates outside my window in Java

它有點困難,因爲你要離開搖擺的境界,並進入本地的GUI域。

+0

我知道,使用本機功能捕獲這樣的事件可能是一個解決方案,但我不會使用它,因爲它只會在代碼中添加很多混亂,並且會在某一天使它不可維護 - 我寧願保持純Java。 –

+0

嗯困難。只要你點擊應用程序之外,那麼從技術上講,你現在不再處於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

這只是技巧,你可以管理交互與國旗 – alex2410

+0

我知道,但我寧願使用模式JDialog比一些解決方法,因爲它更方便,將(肯定)在不同的平臺上正確行事,並不需要任何代碼來支持。 –

相關問題