Popup: made Popup.show(), hide() and component listener more robust when used in unusual ways (issue #106)

This commit is contained in:
Karl Tauber
2020-06-07 15:25:11 +02:00
parent 049dae6584
commit e18e8e3158

View File

@@ -153,7 +153,8 @@ public class FlatPopupFactory
@Override @Override
public void show() { public void show() {
delegate.show(); if( delegate != null )
delegate.show();
} }
@Override @Override
@@ -185,6 +186,7 @@ public class FlatPopupFactory
private boolean oldOpaque; private boolean oldOpaque;
// medium weight // medium weight
private boolean mediumWeightShown;
private Panel mediumWeightPanel; private Panel mediumWeightPanel;
private JPanel dropShadowPanel; private JPanel dropShadowPanel;
private ComponentListener mediumPanelListener; private ComponentListener mediumPanelListener;
@@ -311,6 +313,11 @@ public class FlatPopupFactory
} }
private void showMediumWeightDropShadow() { private void showMediumWeightDropShadow() {
if( mediumWeightShown )
return;
mediumWeightShown = true;
Window window = SwingUtilities.windowForComponent( owner ); Window window = SwingUtilities.windowForComponent( owner );
if( window == null ) if( window == null )
return; return;
@@ -326,24 +333,29 @@ public class FlatPopupFactory
mediumPanelListener = new ComponentListener() { mediumPanelListener = new ComponentListener() {
@Override @Override
public void componentShown( ComponentEvent e ) { public void componentShown( ComponentEvent e ) {
dropShadowPanel.setVisible( true ); if( dropShadowPanel != null )
dropShadowPanel.setVisible( true );
} }
@Override @Override
public void componentHidden( ComponentEvent e ) { public void componentHidden( ComponentEvent e ) {
dropShadowPanel.setVisible( false ); if( dropShadowPanel != null )
dropShadowPanel.setVisible( false );
} }
@Override @Override
public void componentMoved( ComponentEvent e ) { public void componentMoved( ComponentEvent e ) {
Point location = mediumWeightPanel.getLocation(); if( dropShadowPanel != null && mediumWeightPanel != null ) {
Insets insets = dropShadowPanel.getInsets(); Point location = mediumWeightPanel.getLocation();
dropShadowPanel.setLocation( location.x - insets.left, location.y - insets.top ); Insets insets = dropShadowPanel.getInsets();
dropShadowPanel.setLocation( location.x - insets.left, location.y - insets.top );
}
} }
@Override @Override
public void componentResized( ComponentEvent e ) { public void componentResized( ComponentEvent e ) {
dropShadowPanel.setSize( FlatUIUtils.addInsets( mediumWeightPanel.getSize(), dropShadowPanel.getInsets() ) ); if( dropShadowPanel != null )
dropShadowPanel.setSize( FlatUIUtils.addInsets( mediumWeightPanel.getSize(), dropShadowPanel.getInsets() ) );
} }
}; };
mediumWeightPanel.addComponentListener( mediumPanelListener ); mediumWeightPanel.addComponentListener( mediumPanelListener );