Hallo miteinander!
Ich habe folgendes vor: In einem JFrame wird ein Popup aufgerufen. Während dieses Popup geöffnet ist, sollen die Elemente im Content Pane nicht aktiviert werden können. Hierfür setze ich das Glass Pane mit den entsprechenden Event-Listenern.
Nun zum Problem: Sobald das Glass Pane auf visible gesetzt wird, sind die Elemente des Popups zwar nutzbar (mit System.out leicht zu überprüfen), jedoch werden offenbar keine Repaints mehr gemacht. Das heißt zum Beispiel für Buttons, dass sie nicht "eingedrückt" werden, wenn man auf sie klickt, oder die Inhalte von JSpinnern nicht aktualisiert werden. Auch sämtliche Hover-Events sind nicht mehr zu sehen.
Ich habe das Problem mal auf die nötigsten Zeilen heruntergebrochen, damit ihr euch selbst ein Bild machen könnt:
Der Button "Test" spuckt hierbei das erwartete System.out aus, man sieht aber nicht, dass man ihn klickt. Hat jemand eine Idee, wieso die entsprechenden Repaints nicht mehr getriggert werden und wie ich sie wieder reinbekomme?
Überhaupt kommt mir die ganze Anzeige komisch vor. Nach meinem Verständnis müsste doch GlassPane auch über LayeredPane (enthält Popups) liegen, was hier aber nicht der Fall ist (Popup liegt über dem GlassPane). Oder vertu' ich mich da?
Ich bin mir übrigens voll bewusst, dass ein modaler Dialog sehr viel einfacher wäre. Geht aber in dem Fall leider nicht, weil soll halt so sein
EDIT: Hab' nochmal schnell einen Screenshot von dem Programm hochgeladen.
Ich habe folgendes vor: In einem JFrame wird ein Popup aufgerufen. Während dieses Popup geöffnet ist, sollen die Elemente im Content Pane nicht aktiviert werden können. Hierfür setze ich das Glass Pane mit den entsprechenden Event-Listenern.
Nun zum Problem: Sobald das Glass Pane auf visible gesetzt wird, sind die Elemente des Popups zwar nutzbar (mit System.out leicht zu überprüfen), jedoch werden offenbar keine Repaints mehr gemacht. Das heißt zum Beispiel für Buttons, dass sie nicht "eingedrückt" werden, wenn man auf sie klickt, oder die Inhalte von JSpinnern nicht aktualisiert werden. Auch sämtliche Hover-Events sind nicht mehr zu sehen.
Ich habe das Problem mal auf die nötigsten Zeilen heruntergebrochen, damit ihr euch selbst ein Bild machen könnt:
Java:
public class PopupGlassPaneTest
{
public static void main(final String[] args)
{
// The frame
final JFrame frame = new JFrame();
frame.setSize(800, 600);
frame.setLayout(new GridLayout(3, 2));
for (int i = 0; i < 6; i++)
{
frame.add(new JButton("Button " + i));
}
frame.setVisible(true);
// The pop-up
final JButton testButton = new JButton("TEST");
testButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(final ActionEvent e)
{
System.out.println("BUTTON PRESSED");
}
});
final JPanel panel = new JPanel();
panel.add(testButton);
final Popup popup = PopupFactory.getSharedInstance().getPopup(frame, panel, frame.getX() + 75, frame.getY() + 100);
popup.show();
// The glass pane
final JPanel glassPane = new PopupGlassPaneTest.GlassPane();
glassPane.setOpaque(false);
frame.setGlassPane(glassPane);
glassPane.setVisible(true);
}
private static class GlassPane extends JPanel
{
@Override
public void paintComponent(final Graphics g)
{
super.paintComponent(g);
final Color ppColor = new Color(70, 70, 255, 120);
g.setColor(ppColor);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
}
}
}
Der Button "Test" spuckt hierbei das erwartete System.out aus, man sieht aber nicht, dass man ihn klickt. Hat jemand eine Idee, wieso die entsprechenden Repaints nicht mehr getriggert werden und wie ich sie wieder reinbekomme?
Überhaupt kommt mir die ganze Anzeige komisch vor. Nach meinem Verständnis müsste doch GlassPane auch über LayeredPane (enthält Popups) liegen, was hier aber nicht der Fall ist (Popup liegt über dem GlassPane). Oder vertu' ich mich da?
Ich bin mir übrigens voll bewusst, dass ein modaler Dialog sehr viel einfacher wäre. Geht aber in dem Fall leider nicht, weil soll halt so sein
EDIT: Hab' nochmal schnell einen Screenshot von dem Programm hochgeladen.
Zuletzt bearbeitet: