DesktopIcon: automatically update preview (without invoking from DesktopManager)

This commit is contained in:
Karl Tauber
2021-04-11 14:55:24 +02:00
parent a7a4a19824
commit 39bf68a6bd
2 changed files with 28 additions and 5 deletions

View File

@@ -30,6 +30,7 @@ import java.awt.Point;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException; import java.beans.PropertyVetoException;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
@@ -79,11 +80,21 @@ public class FlatDesktopIconUI
private JToolTip titleTip; private JToolTip titleTip;
private ActionListener closeListener; private ActionListener closeListener;
private MouseInputListener mouseInputListener; private MouseInputListener mouseInputListener;
private PropertyChangeListener ancestorListener;
public static ComponentUI createUI( JComponent c ) { public static ComponentUI createUI( JComponent c ) {
return new FlatDesktopIconUI(); return new FlatDesktopIconUI();
} }
@Override
public void installUI( JComponent c ) {
super.installUI( c );
// update dock icon preview if already iconified
if( c.isDisplayable() )
updateDockIconPreviewLater();
}
@Override @Override
public void uninstallUI( JComponent c ) { public void uninstallUI( JComponent c ) {
super.uninstallUI( c ); super.uninstallUI( c );
@@ -140,6 +151,17 @@ public class FlatDesktopIconUI
}; };
closeButton.addActionListener( closeListener ); closeButton.addActionListener( closeListener );
closeButton.addMouseListener( mouseInputListener ); closeButton.addMouseListener( mouseInputListener );
ancestorListener = e -> {
if( e.getNewValue() != null ) {
// update dock icon preview if desktopIcon is added to desktop (internal frame was iconified)
updateDockIconPreviewLater();
} else {
// remove preview icon to release memory
dockIcon.setIcon( null );
}
};
desktopIcon.addPropertyChangeListener( "ancestor", ancestorListener );
} }
@Override @Override
@@ -150,6 +172,9 @@ public class FlatDesktopIconUI
closeButton.removeMouseListener( mouseInputListener ); closeButton.removeMouseListener( mouseInputListener );
closeListener = null; closeListener = null;
mouseInputListener = null; mouseInputListener = null;
desktopIcon.removePropertyChangeListener( "ancestor", ancestorListener );
ancestorListener = null;
} }
@Override @Override
@@ -247,15 +272,15 @@ public class FlatDesktopIconUI
paint( g, c ); paint( g, c );
} }
void updateDockIcon() { private void updateDockIconPreviewLater() {
// use invoke later to make sure that components are updated when switching LaF // use invoke later to make sure that components are updated when switching LaF
EventQueue.invokeLater( () -> { EventQueue.invokeLater( () -> {
if( dockIcon != null ) if( dockIcon != null )
updateDockIconLater(); updateDockIconPreview();
} ); } );
} }
private void updateDockIconLater() { protected void updateDockIconPreview() {
// make sure that frame is not selected // make sure that frame is not selected
if( frame.isSelected() ) { if( frame.isSelected() ) {
try { try {

View File

@@ -141,8 +141,6 @@ public class FlatDesktopPaneUI
if( !iconifiedFrames.contains( f ) ) if( !iconifiedFrames.contains( f ) )
iconifiedFrames.add( f ); iconifiedFrames.add( f );
layoutDock(); layoutDock();
((FlatDesktopIconUI)f.getDesktopIcon().getUI()).updateDockIcon();
} }
protected void removeFromDock( JInternalFrame f ) { protected void removeFromDock( JInternalFrame f ) {