Hallo,
ich will ein Object basteln, welches optisch gesehen ähnlich der Combobox ist. Die Box besteht aus einem TextField und einem Button dahinter. Wenn ich auf den Button klicke, dann soll sich ein JWindow öffnen. Platziert wird auf dem JWindow irgend etwas anderes, beispielsweise ein TextField, eine Liste, eine Tabelle oder sonst etwas. Man soll dort die Möglichkeit haben, irgend etwas zu machen. Die dafür notwendige Componente erhält einen FocusListener. Der Listener soll dafür da sein, dass wenn ich auf meiner GUI ein anderes Element auswähle (im unteren Beispiel das "field" oder den "button"), dann soll sich das JWindwo schließen. Ich baue also darauf, dass der FocusListener.focusLost angesprochen wird.
Dies funktioniert soweit eigentlich ganz gut.
Was jedoch nicht funktioniert, wenn ich nun das Frame verschiebe/vergrößere/verkleiner/etc. Natürlich will ich, dass dann das JWindow geschlossen wird, so wie bei der Combobox auch, sobald ich die Titelleiste des Frames anfasse.
Wie kann ich das erreichen?
Ich habe hier ein kleines Beispiel:
Wenn ich auf den Button klicke, geht das JWindow auf. Dort ist ein TextField enthalten, welches den Focus bekommt (field2). Wenn ich nun in das andere field klicke, wird das FocusEvent richtig ausgelöst, aber NICHT, wenn ich auf die Titelleiste klicke
ich will ein Object basteln, welches optisch gesehen ähnlich der Combobox ist. Die Box besteht aus einem TextField und einem Button dahinter. Wenn ich auf den Button klicke, dann soll sich ein JWindow öffnen. Platziert wird auf dem JWindow irgend etwas anderes, beispielsweise ein TextField, eine Liste, eine Tabelle oder sonst etwas. Man soll dort die Möglichkeit haben, irgend etwas zu machen. Die dafür notwendige Componente erhält einen FocusListener. Der Listener soll dafür da sein, dass wenn ich auf meiner GUI ein anderes Element auswähle (im unteren Beispiel das "field" oder den "button"), dann soll sich das JWindwo schließen. Ich baue also darauf, dass der FocusListener.focusLost angesprochen wird.
Dies funktioniert soweit eigentlich ganz gut.
Was jedoch nicht funktioniert, wenn ich nun das Frame verschiebe/vergrößere/verkleiner/etc. Natürlich will ich, dass dann das JWindow geschlossen wird, so wie bei der Combobox auch, sobald ich die Titelleiste des Frames anfasse.
Wie kann ich das erreichen?
Ich habe hier ein kleines Beispiel:
Wenn ich auf den Button klicke, geht das JWindow auf. Dort ist ein TextField enthalten, welches den Focus bekommt (field2). Wenn ich nun in das andere field klicke, wird das FocusEvent richtig ausgelöst, aber NICHT, wenn ich auf die Titelleiste klicke
Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JWindow;
public class Example extends JFrame{
JTextField field;
JTextField field2;
JWindow window;
public Example() {
initGUI();
}
private void initGUI(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
field = new JTextField();
field2 = new JTextField();
window = new JWindow(this);
window.getContentPane().add(field2);
window.setSize(100, 100);
field2.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
System.out.println("focus lost");
// hier soll dann später noch das JWindow geschlossen werden.
}
@Override
public void focusGained(FocusEvent e) {
System.out.println("focus gained");
}
});
JButton button = new JButton("click");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
window.setLocation(
field.getLocationOnScreen().x,
field.getLocationOnScreen().y + field.getHeight()
);
field2.requestFocus();
window.setVisible(true);
}
});
this.add(field, BorderLayout.CENTER);
this.add(button, BorderLayout.EAST);
this.pack();
this.setVisible(true);
}
public static void main (String args[]){
new Example();
}
}