フレームの外側のクリックを検出することは困難です。これは、Javaがアクセスできない他のアプリケーションのクリックである可能性があるためです。
FocusListener
以下に示すように試してみることができます
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
public class AutoCloseFrameDemo {
public static void main( String[] args ) {
final JFrame frame = new JFrame( "Test" );
frame.addFocusListener( new FocusListener() {
private boolean gained = false;
@Override
public void focusGained( FocusEvent e ) {
gained = true;
}
@Override
public void focusLost( FocusEvent e ) {
if ( gained ){
frame.dispose();
}
}
} );
frame.add( new JLabel( "testlabel" ) );
frame.pack();
frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
frame.setVisible( true );
}
}
これは、この単純なユースケースで機能します。JTextField
たとえば、フレームにaを入れてテキストフィールドにフォーカスを合わせると、どうなるかはまだわかりません。それによってJFrame
フォーカスが失われる場合も、アプリケーションは役に立たないでしょう。
編集
もう少し堅牢な解決策は、リスナーをに接続することかもしれませんKeyboardFocusManager
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import java.awt.BorderLayout;
import java.awt.KeyboardFocusManager;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
public class AutoCloseFrameDemo {
public static void main( String[] args ) {
final JFrame frame = new JFrame( "Test" );
KeyboardFocusManager.getCurrentKeyboardFocusManager().
addVetoableChangeListener( "focusedWindow",
new VetoableChangeListener() {
private boolean gained = false;
@Override
public void vetoableChange( PropertyChangeEvent evt ) throws PropertyVetoException {
if ( evt.getNewValue() == frame ) {
gained = true;
}
if ( gained && evt.getNewValue() != frame ) {
frame.dispose();
}
}
} );
frame.add( new JTextField( 10 ), BorderLayout.NORTH );
frame.add( new JTextField( 10 ), BorderLayout.SOUTH );
frame.pack();
frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE );
frame.setVisible( true );
}
}
これにより、フレーム内の異なるテキストフィールド間でフォーカスを切り替えることができます。