mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-06 14:00:55 +03:00
Windows: update fonts (and scaling) when user changes Windows text size
This commit is contained in:
@@ -7,6 +7,8 @@ FlatLaf Change Log
|
|||||||
- Added `Flat*Laf.install()` methods.
|
- Added `Flat*Laf.install()` methods.
|
||||||
- macOS: Use native screen menu bar if system property
|
- macOS: Use native screen menu bar if system property
|
||||||
`apple.laf.useScreenMenuBar` is `true`.
|
`apple.laf.useScreenMenuBar` is `true`.
|
||||||
|
- Windows: Update fonts (and scaling) when user changes Windows text size
|
||||||
|
(Settings > Ease of Access > Display > Make text bigger).
|
||||||
|
|
||||||
|
|
||||||
## 0.11
|
## 0.11
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import java.awt.Color;
|
|||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Container;
|
import java.awt.Container;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
|
import java.awt.EventQueue;
|
||||||
import java.awt.Font;
|
import java.awt.Font;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
import java.awt.KeyboardFocusManager;
|
import java.awt.KeyboardFocusManager;
|
||||||
@@ -28,6 +29,8 @@ import java.awt.Toolkit;
|
|||||||
import java.awt.Window;
|
import java.awt.Window;
|
||||||
import java.awt.event.AWTEventListener;
|
import java.awt.event.AWTEventListener;
|
||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -43,6 +46,7 @@ import javax.swing.LookAndFeel;
|
|||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.UIDefaults;
|
import javax.swing.UIDefaults;
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.UnsupportedLookAndFeelException;
|
||||||
import javax.swing.UIDefaults.LazyValue;
|
import javax.swing.UIDefaults.LazyValue;
|
||||||
import javax.swing.plaf.ColorUIResource;
|
import javax.swing.plaf.ColorUIResource;
|
||||||
import javax.swing.plaf.DimensionUIResource;
|
import javax.swing.plaf.DimensionUIResource;
|
||||||
@@ -71,6 +75,9 @@ public abstract class FlatLaf
|
|||||||
|
|
||||||
private BasicLookAndFeel base;
|
private BasicLookAndFeel base;
|
||||||
|
|
||||||
|
private String desktopPropertyName;
|
||||||
|
private PropertyChangeListener desktopPropertyListener;
|
||||||
|
|
||||||
private AWTEventListener mnemonicListener;
|
private AWTEventListener mnemonicListener;
|
||||||
private static boolean altKeyPressed;
|
private static boolean altKeyPressed;
|
||||||
|
|
||||||
@@ -111,10 +118,30 @@ public abstract class FlatLaf
|
|||||||
altKeyChanged( e.getID() == KeyEvent.KEY_PRESSED );
|
altKeyChanged( e.getID() == KeyEvent.KEY_PRESSED );
|
||||||
};
|
};
|
||||||
Toolkit.getDefaultToolkit().addAWTEventListener( mnemonicListener, AWTEvent.KEY_EVENT_MASK );
|
Toolkit.getDefaultToolkit().addAWTEventListener( mnemonicListener, AWTEvent.KEY_EVENT_MASK );
|
||||||
|
|
||||||
|
// listen to desktop property changes to update UI if system font or scaling changes
|
||||||
|
if( SystemInfo.IS_WINDOWS ) {
|
||||||
|
// Windows 10 allows increasing font size independent of scaling:
|
||||||
|
// Settings > Ease of Access > Display > Make text bigger (100% - 225%)
|
||||||
|
desktopPropertyName = "win.messagebox.font";
|
||||||
|
}
|
||||||
|
if( desktopPropertyName != null ) {
|
||||||
|
desktopPropertyListener = e -> {
|
||||||
|
reSetLookAndFeel();
|
||||||
|
};
|
||||||
|
Toolkit.getDefaultToolkit().addPropertyChangeListener( desktopPropertyName, desktopPropertyListener );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void uninitialize() {
|
public void uninitialize() {
|
||||||
|
// remove desktop property listener
|
||||||
|
if( desktopPropertyListener != null ) {
|
||||||
|
Toolkit.getDefaultToolkit().removePropertyChangeListener( desktopPropertyName, desktopPropertyListener );
|
||||||
|
desktopPropertyName = null;
|
||||||
|
desktopPropertyListener = null;
|
||||||
|
}
|
||||||
|
|
||||||
// remove mnemonic listener
|
// remove mnemonic listener
|
||||||
if( mnemonicListener != null ) {
|
if( mnemonicListener != null ) {
|
||||||
Toolkit.getDefaultToolkit().removeAWTEventListener( mnemonicListener );
|
Toolkit.getDefaultToolkit().removeAWTEventListener( mnemonicListener );
|
||||||
@@ -478,6 +505,35 @@ public abstract class FlatLaf
|
|||||||
return strs;
|
return strs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void reSetLookAndFeel() {
|
||||||
|
EventQueue.invokeLater( () -> {
|
||||||
|
try {
|
||||||
|
// re-set current LaF
|
||||||
|
LookAndFeel lookAndFeel = UIManager.getLookAndFeel();
|
||||||
|
UIManager.setLookAndFeel( lookAndFeel );
|
||||||
|
|
||||||
|
// must fire property change events ourself because old and new LaF are the same
|
||||||
|
PropertyChangeEvent e = new PropertyChangeEvent( UIManager.class, "lookAndFeel", lookAndFeel, lookAndFeel );
|
||||||
|
for( PropertyChangeListener l : UIManager.getPropertyChangeListeners() )
|
||||||
|
l.propertyChange( e );
|
||||||
|
|
||||||
|
// update UI
|
||||||
|
updateUI();
|
||||||
|
} catch( UnsupportedLookAndFeelException ex ) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update UI of all application windows.
|
||||||
|
* Invoke after changing LaF.
|
||||||
|
*/
|
||||||
|
public static void updateUI() {
|
||||||
|
for( Window w : Window.getWindows() )
|
||||||
|
SwingUtilities.updateComponentTreeUI( w );
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isShowMnemonics() {
|
public static boolean isShowMnemonics() {
|
||||||
return altKeyPressed || !UIManager.getBoolean( "Component.hideMnemonics" );
|
return altKeyPressed || !UIManager.getBoolean( "Component.hideMnemonics" );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ import java.awt.event.ComponentEvent;
|
|||||||
import java.awt.event.KeyEvent;
|
import java.awt.event.KeyEvent;
|
||||||
import java.awt.event.WindowAdapter;
|
import java.awt.event.WindowAdapter;
|
||||||
import java.awt.event.WindowEvent;
|
import java.awt.event.WindowEvent;
|
||||||
|
import java.beans.PropertyChangeEvent;
|
||||||
|
import java.beans.PropertyChangeListener;
|
||||||
import java.util.prefs.Preferences;
|
import java.util.prefs.Preferences;
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
import javax.swing.plaf.ColorUIResource;
|
import javax.swing.plaf.ColorUIResource;
|
||||||
@@ -167,6 +169,18 @@ public class FlatTestFrame
|
|||||||
updateTitle();
|
updateTitle();
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
UIManager.addPropertyChangeListener( e -> {
|
||||||
|
if( "lookAndFeel".equals( e.getPropertyName() ) ) {
|
||||||
|
EventQueue.invokeLater( () -> {
|
||||||
|
// update title because user scale factor may change
|
||||||
|
updateTitle();
|
||||||
|
|
||||||
|
// enable/disable scale factor combobox
|
||||||
|
updateScaleFactorComboBox();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateTitle() {
|
private void updateTitle() {
|
||||||
@@ -233,14 +247,8 @@ public class FlatTestFrame
|
|||||||
// change look and feel
|
// change look and feel
|
||||||
UIManager.setLookAndFeel( lafClassName );
|
UIManager.setLookAndFeel( lafClassName );
|
||||||
|
|
||||||
// update title because user scale factor may change
|
|
||||||
updateTitle();
|
|
||||||
|
|
||||||
// enable/disable scale factor combobox
|
|
||||||
updateScaleFactorComboBox();
|
|
||||||
|
|
||||||
// update all components
|
// update all components
|
||||||
SwingUtilities.updateComponentTreeUI( this );
|
FlatLaf.updateUI();
|
||||||
|
|
||||||
// increase size of frame if necessary
|
// increase size of frame if necessary
|
||||||
if( pack )
|
if( pack )
|
||||||
|
|||||||
@@ -79,6 +79,15 @@ class ControlBar
|
|||||||
lafModel.setSelectedItem( lafModel.getElementAt( sel ) );
|
lafModel.setSelectedItem( lafModel.getElementAt( sel ) );
|
||||||
|
|
||||||
lookAndFeelComboBox.setModel( lafModel );
|
lookAndFeelComboBox.setModel( lafModel );
|
||||||
|
|
||||||
|
UIManager.addPropertyChangeListener( e -> {
|
||||||
|
if( "lookAndFeel".equals( e.getPropertyName() ) ) {
|
||||||
|
EventQueue.invokeLater( () -> {
|
||||||
|
// update info label because user scale factor may change
|
||||||
|
updateInfoLabel();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
void initialize( JFrame frame, JTabbedPane tabbedPane ) {
|
void initialize( JFrame frame, JTabbedPane tabbedPane ) {
|
||||||
@@ -173,11 +182,8 @@ class ControlBar
|
|||||||
// change look and feel
|
// change look and feel
|
||||||
UIManager.setLookAndFeel( newLaf.className );
|
UIManager.setLookAndFeel( newLaf.className );
|
||||||
|
|
||||||
// update info label because user scale factor may change
|
|
||||||
updateInfoLabel();
|
|
||||||
|
|
||||||
// update all components
|
// update all components
|
||||||
SwingUtilities.updateComponentTreeUI( frame );
|
FlatLaf.updateUI();
|
||||||
|
|
||||||
// increase size of frame if necessary
|
// increase size of frame if necessary
|
||||||
int width = frame.getWidth();
|
int width = frame.getWidth();
|
||||||
|
|||||||
Reference in New Issue
Block a user