FlatTestFrame: added scale factor combobox (Java 8 only)

This commit is contained in:
Karl Tauber
2019-10-03 14:26:03 +02:00
parent 86577c5fef
commit 23d448d4fc
3 changed files with 127 additions and 13 deletions

View File

@@ -66,7 +66,7 @@ public class UIScale
private static Boolean jreHiDPI; private static Boolean jreHiDPI;
private static boolean isJreHiDPIEnabled() { public static boolean isJreHiDPIEnabled() {
if( jreHiDPI != null ) if( jreHiDPI != null )
return jreHiDPI; return jreHiDPI;

View File

@@ -25,6 +25,7 @@ import javax.swing.*;
import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.ColorUIResource;
import javax.swing.plaf.metal.MetalLookAndFeel; import javax.swing.plaf.metal.MetalLookAndFeel;
import javax.swing.plaf.nimbus.NimbusLookAndFeel; import javax.swing.plaf.nimbus.NimbusLookAndFeel;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.formdev.flatlaf.util.SystemInfo; import com.formdev.flatlaf.util.SystemInfo;
import com.formdev.flatlaf.util.UIScale; import com.formdev.flatlaf.util.UIScale;
import net.miginfocom.swing.*; import net.miginfocom.swing.*;
@@ -37,19 +38,28 @@ public class FlatTestFrame
{ {
private static final String PREFS_ROOT_PATH = "/flatlaf-test"; private static final String PREFS_ROOT_PATH = "/flatlaf-test";
private static final String KEY_LAF = "laf"; private static final String KEY_LAF = "laf";
private static final String KEY_SCALE_FACTOR = "scaleFactor";
private final String title; private final String title;
private JComponent content; private JComponent content;
private FlatInspector inspector; private FlatInspector inspector;
public static FlatTestFrame create( String[] args, String title ) { public static FlatTestFrame create( String[] args, String title ) {
Preferences prefs = Preferences.userRoot().node( PREFS_ROOT_PATH );
// set scale factor
if( System.getProperty( "flatlaf.uiScale", System.getProperty( "sun.java2d.uiScale" ) ) == null ) {
String scaleFactor = prefs.get( KEY_SCALE_FACTOR, null );
if( scaleFactor != null )
System.setProperty( "flatlaf.uiScale", scaleFactor );
}
// set look and feel // set look and feel
try { try {
if( args.length > 0 ) if( args.length > 0 )
UIManager.setLookAndFeel( args[0] ); UIManager.setLookAndFeel( args[0] );
else { else {
String lafClassName = Preferences.userRoot().node( PREFS_ROOT_PATH ) String lafClassName = prefs.get( KEY_LAF, FlatLightLaf.class.getName() );
.get( KEY_LAF, FlatLightLaf.class.getName() );
UIManager.setLookAndFeel( lafClassName ); UIManager.setLookAndFeel( lafClassName );
} }
} catch( Exception ex ) { } catch( Exception ex ) {
@@ -110,6 +120,11 @@ public class FlatTestFrame
lookAndFeelComboBox.setModel( lafModel ); lookAndFeelComboBox.setModel( lafModel );
updateScaleFactorComboBox();
String scaleFactor = System.getProperty( "flatlaf.uiScale", System.getProperty( "sun.java2d.uiScale" ) );
if( scaleFactor != null )
scaleFactorComboBox.setSelectedItem( scaleFactor );
// register F1, F2 and F3 keys to switch to Light, Dark or Test LaF // register F1, F2 and F3 keys to switch to Light, Dark or Test LaF
registerSwitchToLookAndFeel( KeyEvent.VK_F1, FlatLightLaf.class.getName() ); registerSwitchToLookAndFeel( KeyEvent.VK_F1, FlatLightLaf.class.getName() );
registerSwitchToLookAndFeel( KeyEvent.VK_F2, FlatDarkLaf.class.getName() ); registerSwitchToLookAndFeel( KeyEvent.VK_F2, FlatDarkLaf.class.getName() );
@@ -195,25 +210,54 @@ public class FlatTestFrame
if( newLaf.className.equals( UIManager.getLookAndFeel().getClass().getName() ) ) if( newLaf.className.equals( UIManager.getLookAndFeel().getClass().getName() ) )
return; return;
// hide popup to avoid occasional StackOverflowError when updating UI
lookAndFeelComboBox.setPopupVisible( false );
Preferences.userRoot().node( PREFS_ROOT_PATH ).put( KEY_LAF, newLaf.className ); Preferences.userRoot().node( PREFS_ROOT_PATH ).put( KEY_LAF, newLaf.className );
applyLookAndFeel( newLaf.className, false );
}
private void applyLookAndFeel( String lafClassName, boolean pack ) {
EventQueue.invokeLater( () -> { EventQueue.invokeLater( () -> {
try { try {
// change look and feel // change look and feel
UIManager.setLookAndFeel( newLaf.className ); UIManager.setLookAndFeel( lafClassName );
// update title because user scale factor may change // update title because user scale factor may change
updateTitle(); updateTitle();
// enable/disable scale factor combobox
updateScaleFactorComboBox();
// update all components // update all components
SwingUtilities.updateComponentTreeUI( this ); SwingUtilities.updateComponentTreeUI( this );
// increase size of frame if necessary // increase size of frame if necessary
if( pack )
pack();
else {
int width = getWidth(); int width = getWidth();
int height = getHeight(); int height = getHeight();
Dimension prefSize = getPreferredSize(); Dimension prefSize = getPreferredSize();
if( prefSize.width > width || prefSize.height > height ) if( prefSize.width > width || prefSize.height > height )
setSize( Math.max( prefSize.width, width ), Math.max( prefSize.height, height ) ); setSize( Math.max( prefSize.width, width ), Math.max( prefSize.height, height ) );
}
// limit frame size to screen size
Rectangle screenBounds = getGraphicsConfiguration().getBounds();
screenBounds = FlatUIUtils.subtractInsets( screenBounds, getToolkit().getScreenInsets( getGraphicsConfiguration() ) );
Dimension frameSize = getSize();
if( frameSize.width > screenBounds.width || frameSize.height > screenBounds.height )
setSize( Math.min( frameSize.width, screenBounds.width ), Math.min( frameSize.height, screenBounds.height ) );
// move frame to left/top if necessary
if( getX() + getWidth() > screenBounds.x + screenBounds.width ||
getY() + getHeight() > screenBounds.y + screenBounds.height )
{
setLocation( Math.min( getX(), screenBounds.x + screenBounds.width - getWidth() ),
Math.min( getY(), screenBounds.y + screenBounds.height - getHeight() ) );
}
if( inspector != null ) if( inspector != null )
inspector.update(); inspector.update();
@@ -318,6 +362,31 @@ public class FlatTestFrame
inspector.setEnabled( inspectCheckBox.isSelected() ); inspector.setEnabled( inspectCheckBox.isSelected() );
} }
private void scaleFactorChanged() {
String scaleFactor = (String) scaleFactorComboBox.getSelectedItem();
if( "default".equals( scaleFactor ) )
scaleFactor = null;
// hide popup to avoid occasional StackOverflowError when updating UI
scaleFactorComboBox.setPopupVisible( false );
Preferences prefs = Preferences.userRoot().node( PREFS_ROOT_PATH );
if( scaleFactor != null ) {
System.setProperty( "flatlaf.uiScale", scaleFactor );
prefs.put( KEY_SCALE_FACTOR, scaleFactor );
} else {
System.clearProperty( "flatlaf.uiScale" );
prefs.remove( KEY_SCALE_FACTOR );
}
applyLookAndFeel( UIManager.getLookAndFeel().getClass().getName(), true );
}
private void updateScaleFactorComboBox() {
scaleFactorComboBox.setEnabled( !UIScale.isJreHiDPIEnabled() && UIManager.getLookAndFeel() instanceof FlatLaf );
}
private void initComponents() { private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents // JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
dialogPane = new JPanel(); dialogPane = new JPanel();
@@ -328,6 +397,7 @@ public class FlatTestFrame
rightToLeftCheckBox = new JCheckBox(); rightToLeftCheckBox = new JCheckBox();
enabledCheckBox = new JCheckBox(); enabledCheckBox = new JCheckBox();
inspectCheckBox = new JCheckBox(); inspectCheckBox = new JCheckBox();
scaleFactorComboBox = new JComboBox<>();
closeButton = new JButton(); closeButton = new JButton();
//======== this ======== //======== this ========
@@ -361,6 +431,7 @@ public class FlatTestFrame
"[fill]" + "[fill]" +
"[fill]" + "[fill]" +
"[fill]" + "[fill]" +
"[fill]" +
"[grow,fill]" + "[grow,fill]" +
"[button,fill]", "[button,fill]",
// rows // rows
@@ -395,9 +466,27 @@ public class FlatTestFrame
inspectCheckBox.addActionListener(e -> inspectChanged()); inspectCheckBox.addActionListener(e -> inspectChanged());
buttonBar.add(inspectCheckBox, "cell 4 0"); buttonBar.add(inspectCheckBox, "cell 4 0");
//---- scaleFactorComboBox ----
scaleFactorComboBox.setModel(new DefaultComboBoxModel<>(new String[] {
"default",
"1",
"1.25",
"1.5",
"1.75",
"2.0",
"2.25",
"2.5",
"3",
"3.5",
"4"
}));
scaleFactorComboBox.setMaximumRowCount(20);
scaleFactorComboBox.addActionListener(e -> scaleFactorChanged());
buttonBar.add(scaleFactorComboBox, "cell 5 0");
//---- closeButton ---- //---- closeButton ----
closeButton.setText("Close"); closeButton.setText("Close");
buttonBar.add(closeButton, "cell 6 0"); buttonBar.add(closeButton, "cell 7 0");
} }
dialogPane.add(buttonBar, BorderLayout.SOUTH); dialogPane.add(buttonBar, BorderLayout.SOUTH);
} }
@@ -414,6 +503,7 @@ public class FlatTestFrame
private JCheckBox rightToLeftCheckBox; private JCheckBox rightToLeftCheckBox;
private JCheckBox enabledCheckBox; private JCheckBox enabledCheckBox;
private JCheckBox inspectCheckBox; private JCheckBox inspectCheckBox;
private JComboBox<String> scaleFactorComboBox;
private JButton closeButton; private JButton closeButton;
// JFormDesigner - End of variables declaration //GEN-END:variables // JFormDesigner - End of variables declaration //GEN-END:variables

View File

@@ -21,7 +21,7 @@ new FormModel {
} ) } )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) { add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "insets dialog" "$layoutConstraints": "insets dialog"
"$columnConstraints": "[fill][fill][fill][fill][fill][grow,fill][button,fill]" "$columnConstraints": "[fill][fill][fill][fill][fill][fill][grow,fill][button,fill]"
"$rowSpecs": "[fill]" "$rowSpecs": "[fill]"
} ) { } ) {
name: "buttonBar" name: "buttonBar"
@@ -67,11 +67,35 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 0" "value": "cell 4 0"
} ) } )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "scaleFactorComboBox"
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "default"
addElement( "default" )
addElement( "1" )
addElement( "1.25" )
addElement( "1.5" )
addElement( "1.75" )
addElement( "2.0" )
addElement( "2.25" )
addElement( "2.5" )
addElement( "3" )
addElement( "3.5" )
addElement( "4" )
}
"maximumRowCount": 20
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "scaleFactorChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 0"
} )
add( new FormComponent( "javax.swing.JButton" ) { add( new FormComponent( "javax.swing.JButton" ) {
name: "closeButton" name: "closeButton"
"text": "Close" "text": "Close"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) { }, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 6 0" "value": "cell 7 0"
} ) } )
}, new FormLayoutConstraints( class java.lang.String ) { }, new FormLayoutConstraints( class java.lang.String ) {
"value": "South" "value": "South"
@@ -81,7 +105,7 @@ new FormModel {
} ) } )
}, new FormLayoutConstraints( null ) { }, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 ) "location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 510, 300 ) "size": new java.awt.Dimension( 640, 300 )
} ) } )
} }
} }