Nee - WindowListener hatte ich auch probiert, sorry.JPKI hat gesagt.:Mit der Methode windowDeactivated(WindowEvent) von WindowListener?
Gentoo, KDE 3.5.7 und Sun JDK 1.6.0.JPKI hat gesagt.:Müsste aber klappen...?
Welches Betriebssystem benutzt du?
Welche JRE?
Da steckt neben anderen sowohl ein JPanel als auch ein JLabel drin... allerdings habe ich das mit dem FocusListener dann auch schnell wieder verworfen weil es eh nicht das ist was ich möchte. Das Fenster soll nicht bei verlusst des Focus, sondern erst beim Klick mit der Maus verschwinden - egal ob dieser Klick im Fenster (das ist natürlich einfach) oder ausserhalb passiert.André Uhres hat gesagt.:Was hast du im JWindow drin? Wenn keine fokusierbare Komponente drin ist (z.B. ein JButton),
dann kann es imho nicht funktionieren mit dem FocusListener.
EDIT:oder mit einem JLabel oder JPanel drin müsste es auch funktionieren, wenn du
ihn auf setFocusable(true) setzt.
EDIT 2:Oder vielleicht den JWindow selbst auf setFocusable(true) setzen.
Wenig späktakulär - so etwa:JPKI hat gesagt.:Poste bitte mal den Versuch mit dem Window-Listener!
public class Main extends JWindow implements WindowListener {
public static void main(String[] args) throws IOException {
new Main();
}
public Main() {
setSize(200, 200);
addWindowListener(this);
JButton b=new JButton("exit");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
System.exit(0);
}
});
add(b);
setEnabled(true);
setVisible(true);
}
public void windowDeactivated(WindowEvent e) {
System.out.println("JA!");
}
public void windowActivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public class Main2 extends JFrame implements WindowListener {
public static void main(String[] args) throws IOException {
new Main2();
}
public Main2() {
setSize(200, 200);
addWindowListener(this);
JButton b=new JButton("exit");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
System.exit(0);
}
});
add(b);
setEnabled(true);
setUndecorated(true);
setVisible(true);
}
public void windowDeactivated(WindowEvent e) {
System.out.println("JA!");
}
public void windowActivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
}
Danke, aber nicht ganz - jetzt würde sich das Fenster immer schließen wenn es den Focus verliert.merlin2 hat gesagt.:So funktioniert es. Ist jetzt zwar ein JFrame, sieht aber gleich aus.
merlin2 hat gesagt.:..warum sollte es das tun?
Hilefoks hat gesagt.:..Das Fenster soll nicht bei verlusst des Focus, sondern erst beim Klick mit der Maus verschwinden
- egal ob dieser Klick im Fenster (das ist natürlich einfach) oder ausserhalb passiert..
Wenn der Focus egal ist, ist mouseClicked() von MouseListener angebracht. Das Verlassen des Fensters kannst du mit mouseExited() überprüfen.Hilefoks hat gesagt.:Das Fenster soll nicht bei verlusst des Focus, sondern erst beim Klick mit der Maus verschwinden
- egal ob dieser Klick im Fenster (das ist natürlich einfach) oder ausserhalb passiert
Sorry - Ja ;-)JPKI hat gesagt.:Edit: Schwachsinn, ...
Richtig - ich möchte das sich das Fenster auch dann schließt wenn es deaktiviert ist und keinen Fokus hat. Ich habe aber noch Hoffnung das jemand eine gute Idee hat das hinzubekommen - irgendwie steckt diese Funktionalität ja in den Tiefen von Java, schließlich kann ein Popup eines Systray das ja auch....?!JPKI hat gesagt.:...Hilefoks will ja, dass das Fenster auch bei einem Klick geschlossen wird, wenn es deaktiviert ist und keinen Fokus hat, oder ???:L ? Dann wär das was ich da oben geschrieben hab natürlich Schwachsinn :?: ???:L :bahnhof:
Hab ich...? Möglich, aber:André Uhres hat gesagt.:@Hilefoks: Du hast deine Erfordernisse zwar schon wiederholt geändert...
"auch dann" bezog sich auf den klick ohne das das Fenster den Focus besitzt...Richtig - ich möchte das sich das Fenster auch dann schließt wenn es deaktiviert ist und keinen Fokus hat.
public class Main {
TrayIcon trayIcon;
PopupMenu rpopup;
JWindow lpopup;
public static void main(String[] args) throws AWTException {
new Main();
}
Main() throws AWTException {
SystemTray tray=SystemTray.getSystemTray();
trayIcon=new TrayIcon(new ImageIcon("").getImage(), "TestApp");
trayIcon.setImageAutoSize(true);
rpopup=new PopupMenu();
rpopup.add(new MenuItem("Foo"));
rpopup.add(new MenuItem("Bar"));
lpopup=new JWindow();
lpopup.add(new JButton("Bla"));
lpopup.setSize(200, 50);
trayIcon.setPopupMenu(rpopup);
trayIcon.addMouseListener(new TrayIconMouseListener());
tray.add(trayIcon);
}
class TrayIconMouseListener extends MouseAdapter {
boolean showLPopup=true;
public void mouseClicked(MouseEvent e) {
if(e.getButton()==1) {
if(showLPopup) {
showLPopup=false;
lpopup.setLocation((int) (e.getPoint().getX()-lpopup.getSize().getWidth()), (int) (e.getPoint().getY()-lpopup.getSize().getHeight()));
lpopup.setVisible(true);
}
else { showLPopup=true; lpopup.setVisible(false); }
}
else if(e.getButton()==2)
System.exit(0);
}
}
}
Ja schon... aber irgendwie gefällt mir dieser Ansatz nicht... es ist ein wenig wie "mit Kanonen auf Spatzen schießen". Aber ich mach mir darüber noch ein paar Gedanken. Das Problem an dieser Lösung ist eben das ganze dann auch plattformunabhängig zu realisieren bzw. das dann auch testen zu können - ich besitze weder MacOS noch Windows.JPKI hat gesagt.:Wenn du noch andere Sprachen außer Java kannst, könntest du da eventuell was über JNI drehen...
public class Main extends JWindow implements WindowListener{
public static void main(String[] args) throws IOException {
new Main();
}
public Main() {
setSize(200, 200);
addWindowListener(this);
JButton b=new JButton("exit");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
System.exit(0);
}
});
JComboBox bla = new JComboBox();
bla.addItem("BLA 1");
bla.addItem("BLA 2");
add(bla);
// add(b);
setEnabled(true);
setVisible(true);
}
public void windowDeactivated(WindowEvent e) {
System.out.println("JA!");
}
public void windowActivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
}
Aber ich möchte das es zu geht. ;-)thE_29 hat gesagt.:Hier geht das Popupmenu bei mir aber nicht zu!