Hallo,
für eine Swing GUI, die sehr kompakt sein soll, brauche ich kleine JTextField, die wen sie den Focus bekommen, eine größeres, ev. mehrzeiliges Eingabefeld anzeigen. Dazu habe ich mir eine eigene Klasse TextPopupWin gebastelt, die so funktionieren soll:
das kleine JTextField bekommt den Focus
am Ort des kleinen JTextFields wird ein JWindow mit einer grösseren JTextArea eingeblendet
auf der JTextArea wird ein FocusListener registriert, der, wenn die JTextArea den Focus verliert (z. B. weil der user ausserhalb von JTextArea/JWindow wohin klickt)
auf dem JWindow wird ein WindowFocusListener registiert, der wenn das JWindow den Focus verliert, dieses schliesst.
Komischerweise muss ich zweimal ausserhalb von JTextArea/JWindow klicken, damit das JWindow geschlossen wird. Ein Wechsal von einem textPopupWin zum nächsten klappt komischerweise.
Hier der Code. Vielen Dank fürs Anschauen und für Tipps.
für eine Swing GUI, die sehr kompakt sein soll, brauche ich kleine JTextField, die wen sie den Focus bekommen, eine größeres, ev. mehrzeiliges Eingabefeld anzeigen. Dazu habe ich mir eine eigene Klasse TextPopupWin gebastelt, die so funktionieren soll:
das kleine JTextField bekommt den Focus
am Ort des kleinen JTextFields wird ein JWindow mit einer grösseren JTextArea eingeblendet
auf der JTextArea wird ein FocusListener registriert, der, wenn die JTextArea den Focus verliert (z. B. weil der user ausserhalb von JTextArea/JWindow wohin klickt)
auf dem JWindow wird ein WindowFocusListener registiert, der wenn das JWindow den Focus verliert, dieses schliesst.
Komischerweise muss ich zweimal ausserhalb von JTextArea/JWindow klicken, damit das JWindow geschlossen wird. Ein Wechsal von einem textPopupWin zum nächsten klappt komischerweise.
Hier der Code. Vielen Dank fürs Anschauen und für Tipps.
Java:
import java.awt.*;
import java.awt.event.*;
import java.util.Locale;
import javax.swing.*;
public class TextPopupDemo{
public static void main(String[] args){
JFrame frame = new JFrame("Integer Document Demo");
Box box = new Box(BoxLayout.Y_AXIS);
Locale.setDefault(Locale.US);
box.add(new JTextField("Click here to change focus"));
box.add(new JLabel("With JWindow"));
final TextPopupWin tp = new TextPopupWin("3.14");
box.add(tp);
box.add(new JLabel("Another"));
final TextPopupWin tp1 = new TextPopupWin("3.14");
box.add(tp1);
frame.getContentPane().add(box);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
class TextPopupWin extends JTextField implements FocusListener{
JWindow popup;
private boolean popupVisible;
private JTextArea gross = new JTextArea("Erstes", 3, 12);
TextPopupWin(String text){
super(text);
setEditable(false);
addFocusListener(this);
Box box = new Box(BoxLayout.Y_AXIS);
box.add(new JTextField("Zweites", 20));
gross.addFocusListener(this);
}
public void focusGained(FocusEvent fe){
if(fe.getComponent() == gross){
System.out.println("textfield gained focus at " + System.currentTimeMillis());
return;
}
Window ancestor = SwingUtilities.getWindowAncestor(this);
popup = new JWindow(ancestor);
popup.add(gross);
popup.pack();
popup.setLocation(this.getLocationOnScreen());
popup.setVisible(true);
popupVisible = true;
popup.addWindowFocusListener(new WindowFocusListener(){
public void windowGainedFocus(WindowEvent we){
System.out.println("windowGainedFocus at " + System.currentTimeMillis());
System.out.println("PopupVisible " + popupVisible);
}
public void windowLostFocus(WindowEvent we){
System.out.println("windowLostFocus at " + System.currentTimeMillis());
System.out.println("PopupVisible " + popupVisible);
if(popupVisible){
popupVisible = false;
popup.setVisible(false);
}
}
});
}
public void focusLost(FocusEvent fe){
if(fe.getComponent() == gross && popupVisible){
System.out.println("textfield lost focus at " + System.currentTimeMillis());
popupVisible = false;
popup.setVisible(false);
}
}
}