Compare commits

...

67 Commits
0.40 ... 0.42

Author SHA1 Message Date
Karl Tauber
4487c9985c release 0.42 2020-09-17 15:51:27 +02:00
Karl Tauber
a53ce99977 PasswordField: support disabling Caps Lock warning icon (issue #172) 2020-09-17 15:34:57 +02:00
Karl Tauber
5444719895 Extras: added screenshots to README.md and instructions for using UI inspectors 2020-09-17 14:20:59 +02:00
Karl Tauber
b66139281d FlatHtmlTest: fixed labels and added HTML tooltips 2020-09-17 13:50:56 +02:00
Karl Tauber
8925c27eb9 ToolTip: avoid that tooltip hides owner component (issue #164) 2020-09-17 13:32:28 +02:00
Karl Tauber
99be346387 FlatWindowDecorationsTest: disable "add/remove/change menu" buttons if shown in dialog, which does not have a menubar 2020-09-17 13:28:02 +02:00
Karl Tauber
81d46ba8ee Demo: show simple dialog for "File > New"
(used to test previous commit)
2020-09-17 13:26:45 +02:00
Karl Tauber
ef4c467b20 fixed occasional wrong positioning of heavy weight popups when using multiple screens with different scaling factors (issue #166)
workaround for https://bugs.openjdk.java.net/browse/JDK-8224608
2020-09-17 11:43:20 +02:00
Karl Tauber
44d196fb8c Demo: menu item "Options > Window decorations" did exit Demo
(regression in commit ee6a1da709)
2020-09-16 22:52:19 +02:00
Karl Tauber
867c4fff58 fixed compiling flatlaf-extras on Java 9+ 2020-09-15 18:06:56 +02:00
Karl Tauber
5643546117 UI defaults inspector:
- add placeholder text to filter field
- fixed menu item text in Demo
2020-09-15 17:56:20 +02:00
Karl Tauber
549832ba96 UI defaults inspector:
- fixed: indicate when a LaF UI value was overridden with UIManager.put(key,value)
- auto-refresh if UIManager.put(key,value) was invoked
2020-09-15 17:30:13 +02:00
Karl Tauber
a8744b2bb4 made disabled text color slightly lighter in dark themes for better readability (issue #174) 2020-09-15 15:47:12 +02:00
Karl Tauber
e292d3444c UI defaults inspector: avoid that restored window bounds are outside of screens 2020-09-15 15:09:03 +02:00
Karl Tauber
ee6a1da709 Demo: exit even if UI defaults inspector window is shown 2020-09-15 13:44:00 +02:00
Karl Tauber
8c15bc746b UI defaults inspector: render values of type Border, GrayFilter, Object[] and int[]; paint icons with light gray background 2020-09-15 13:16:01 +02:00
Karl Tauber
aebb083180 UI defaults inspector: indicate when a LaF UI value was overridden with UIManager.put(key,value) 2020-09-15 12:02:51 +02:00
Karl Tauber
5438549b6d UI defaults inspector: horizontally align rgb() and hsl() in color values 2020-09-15 10:56:28 +02:00
Karl Tauber
0077708235 UI defaults inspector: install it in FlatTestFrame and FlatThemeFileEditor 2020-09-15 00:32:04 +02:00
Karl Tauber
2fd99ec9f3 UI defaults inspector: support sorting 2020-09-15 00:16:57 +02:00
Karl Tauber
0d266c4990 UI defaults inspector: use short format for hex colors if possible; use uppercase hex 2020-09-14 23:53:54 +02:00
Karl Tauber
0982675b5f UI defaults inspector: support filter by value
this is also a preparation to support sort by value
2020-09-14 23:13:44 +02:00
Karl Tauber
3bac5d3c80 UI defaults inspector:
- update table if LaF was switched or F5 key pressed
- added LaF name to window title
- close window with ESC key
2020-09-14 21:18:52 +02:00
Karl Tauber
58338f4848 UI defaults inspector: scroll with Up, Down, PageUp and PageDown keys if filter field is focused 2020-09-14 20:35:41 +02:00
Karl Tauber
9c261d3a3f UI defaults inspector: support filter by key and by value type 2020-09-14 18:17:05 +02:00
Karl Tauber
5441ac6640 UI defaults inspector: added separator between component groups and draw component name with lighter color 2020-09-14 15:18:10 +02:00
Karl Tauber
015b04a29a UI defaults inspector: initial commit with basic functionality 2020-09-14 15:16:16 +02:00
Karl Tauber
12ec0abf54 UI defaults: moved some common properties from FlatLightLaf.properties and FlatDarkLaf.properties to FlatLaf.properties 2020-09-12 22:00:17 +02:00
Karl Tauber
c8d461cdee UI defaults: moved "globals" from FlatLightLaf.properties and FlatDarkLaf.properties to FlatLaf.properties 2020-09-12 20:53:23 +02:00
Karl Tauber
faecffeadd TextComponents: fixed text color of disabled text components in dark themes (issue #174) 2020-09-12 18:45:40 +02:00
Karl Tauber
b3c76c21b4 UIDefaultsLoader: moved some code to where it belongs (for previous commit) 2020-09-12 18:38:35 +02:00
Karl Tauber
1697735162 UIDefaultsLoader: changed processing of "globals" so that they are first added to the properties table (instead of directly modifying defaults table), which is then parsed and copied to defaults table
this has the advantage that they can be referenced in other values, which did not work before (because they only existed in `defaults` table)

used for Tree.textForeground
verified with UIDefaultsDump that there are no side effects
2020-09-12 18:13:34 +02:00
Karl Tauber
ecb94bac6d use short color format #RGB (instead of #RRGGBB) where possible 2020-09-11 21:24:00 +02:00
Karl Tauber
7ebeacf16e UIDefaultsDump: dump FlatTestLaf 2020-09-11 21:08:07 +02:00
Karl Tauber
d0079ab66b UIDefaultsLoader: use class loader from FlatLaf.registerCustomDefaultsSource(String, ClassLoader) also for instantiating classes specified in values
see commit b208017117
2020-09-11 17:58:12 +02:00
Karl Tauber
147e400bd6 FlatInspector: limit parent level to real depth at mouse location (issue #169) 2020-09-11 17:37:40 +02:00
Karl Tauber
c44905ea5e InternalFrame: support draggable border for resizing frame inside of the visible frame border (issue #121) 2020-09-04 22:59:09 +02:00
Karl Tauber
98b9df06fe Window decorations: fixed wrong window bounds when resizing window to another screen with different scaling factor (issue #166) 2020-09-04 09:46:12 +02:00
Karl Tauber
02473080a5 Window decorations: fixed wrong window placement when moving window to another screen with different scaling factor (issue #166) 2020-09-03 19:26:52 +02:00
Karl Tauber
c6beb9dc0a Demo: menu items "File > Open" and "File > Save As" now show file choosers 2020-09-03 18:16:28 +02:00
Karl Tauber
dcce14b122 FlatScreenInfo tool added 2020-09-03 15:55:12 +02:00
Karl Tauber
a2ac24ac74 Demo: "SplitPane & Tabs" tab improved 2020-09-03 15:09:28 +02:00
Karl Tauber
600f812f45 Demo: removed too large gap between content panel and control bar 2020-09-03 12:01:49 +02:00
Karl Tauber
e945f46f25 Demo: "Data components" tab: added checkboxes to control table grid and selection 2020-09-03 11:53:50 +02:00
Karl Tauber
c78c653b0a FlatComponents2Test: moved table checkboxes into tableOptionsPanel 2020-09-03 11:26:16 +02:00
Karl Tauber
e0b3663239 FlatComponents2Test: support testing large amount of list/tree/table rows 2020-09-03 11:12:00 +02:00
Karl Tauber
3cc9c98040 Demo:
- "Data components" tab: increase component height if frame is made larger
- "SplitPane & Tabs" tab: increased some gaps and renamed TabbedPane option checkboxes
- "Option Pane" and "Extras" tabs: minor layout improvements
2020-09-02 19:08:24 +02:00
Karl Tauber
ec8213b891 release 0.41 2020-09-02 11:23:43 +02:00
Karl Tauber
ae61383742 README.md: screenshots updated; removed unused screenshots 2020-09-01 18:50:26 +02:00
Karl Tauber
cc90a2ad75 Demo: reworked "More Components" tab and added screenshot mode 2020-09-01 17:24:26 +02:00
Karl Tauber
28634cda56 README.md: screenshots updated 2020-09-01 12:20:40 +02:00
Karl Tauber
3b71fcd690 Demo: fixed too large gap between themes list and control bar 2020-08-31 18:25:01 +02:00
Karl Tauber
5923ac65df smoother transition from old to new theme, independent of UI complexity, when using animated theme change 2020-08-31 18:10:54 +02:00
Karl Tauber
faffc9393d fixed sub-pixel text rendering in animated theme change; use weak hash map for static map to avoid memory leak for the case that something went wrong 2020-08-31 18:07:37 +02:00
Karl Tauber
6da220f36c IntelliJ Themes: updated themes to newest versions (used IJThemesUpdater) 2020-08-27 00:05:29 +02:00
Karl Tauber
21d78671d6 Demo: show hint popups to guide users to some features of the FlatLaf Demo application; added "Options > Show hints" menu item 2020-08-26 23:17:55 +02:00
Karl Tauber
af5a0ec0b7 Window decorations: fixed title pane background color in IntelliJ themes if window is inactive 2020-08-26 16:13:44 +02:00
Karl Tauber
ff214455a3 Window decorations: fixed iconify, maximize and close icon colors if window is inactive 2020-08-26 15:03:26 +02:00
Karl Tauber
3e941e3e42 Demo: fixed restoring last used theme on startup (regression in 0.39 since commit a8f4c8e843) 2020-08-26 12:35:26 +02:00
Karl Tauber
2f876d553f List and Table: fixed possible NPE in unusual cases 2020-08-26 12:16:11 +02:00
Karl Tauber
b208017117 added API to register packages or folders where FlatLaf searches for application specific properties files with custom UI defaults 2020-08-26 12:07:00 +02:00
Karl Tauber
a1dab94a61 TextArea: update background color property if enabled or editable state changes in the same way as Swing does it for all other text components (issue #147) 2020-08-25 19:15:53 +02:00
Karl Tauber
e55b2afd60 Button: show "selected" state (issue #161) 2020-08-25 16:41:40 +02:00
Karl Tauber
535c3ddf6c FlatSVGIcon now allows specifying ClassLoader that is used to load SVG file (issue #163) 2020-08-24 23:31:18 +02:00
Karl Tauber
3008d99fcd updated svgSalamander to version 1.1.2.3 2020-08-24 22:45:35 +02:00
Karl Tauber
fd37339e2f TableHeader: fixed NPE for the (unusual) case that JTableHeader is used without JTable 2020-08-13 17:07:44 +02:00
Karl Tauber
e29eca203c Theme Editor: build fat jar (includes all dependencies) (issue #160) 2020-08-12 14:02:04 +02:00
105 changed files with 6384 additions and 1747 deletions

View File

@@ -1,6 +1,68 @@
FlatLaf Change Log
==================
## 0.42
#### New features and improvements
- Demo: Improved "SplitPane & Tabs" and "Data Components" tabs.
- Demo: Menu items "File > Open" and "File > Save As" now show file choosers.
- InternalFrame: Support draggable border for resizing frame inside of the
visible frame border. (issue #121)
- `FlatUIDefaultsInspector` added (see [FlatLaf Extras](flatlaf-extras)). A
simple UI defaults inspector that shows a window with all UI defaults used in
current theme (look and feel).
- Made disabled text color slightly lighter in dark themes for better
readability. (issue #174)
- PasswordField: Support disabling Caps Lock warning icon. (issue #172)
#### Fixed bugs
- TextComponents: Fixed text color of disabled text components in dark themes.
- Custom window decorations: Fixed wrong window placement when moving window to
another screen with different scaling factor. (issue #166)
- Custom window decorations: Fixed wrong window bounds when resizing window to
another screen with different scaling factor. (issue #166)
- Fixed occasional wrong positioning of heavy weight popups when using multiple
screens with different scaling factors. (issue #166)
- ToolTip: Avoid that tooltip hides owner component. (issue #164)
## 0.41
#### New features and improvements
- Added API to register packages or folders where FlatLaf searches for
application specific properties files with custom UI defaults (see
`FlatLaf.registerCustomDefaultsSource(...)` methods).
- Demo: Show hint popups to guide users to some features of the FlatLaf Demo
application.
- Extras: `FlatSVGIcon` now allows specifying `ClassLoader` that is used to load
SVG file. (issue #163)
- Smoother transition from old to new theme, independent of UI complexity, when
using animated theme change (see [FlatLaf Extras](flatlaf-extras)).
#### Fixed bugs
- Button: "selected" state was not shown. (issue #161)
- TextArea: Update background color property if enabled or editable state
changes in the same way as Swing does it for all other text components. (issue
#147)
- Demo: Fixed restoring last used theme on startup. (regression in 0.39)
- Custom window decorations: Fixed iconify, maximize and close icon colors if
window is inactive.
- Custom window decorations: Fixed title pane background color in IntelliJ
themes if window is inactive.
- Fixed sub-pixel text rendering in animated theme change (see
[FlatLaf Extras](flatlaf-extras)).
#### Other Changes
- Extras: Updated dependency
[svgSalamander](https://github.com/JFormDesigner/svgSalamander) to version
1.1.2.3.
## 0.40
#### New features

View File

@@ -11,9 +11,9 @@ scales on **HiDPI** displays and runs on Java 8 or newer.
The look is heavily inspired by **Darcula** and **IntelliJ** themes from
IntelliJ IDEA 2019.2+ and uses almost the same colors and icons.
![Flat Light Demo](images/FlatLightDemo.png)
![Flat Light](images/flat_light.png)
![Flat Dark Demo](images/FlatDarkDemo.png)
![Flat Dark](images/flat_dark.png)
IntelliJ Platform Themes
@@ -22,9 +22,7 @@ IntelliJ Platform Themes
FlatLaf can use 3rd party themes created for IntelliJ Platform (see
[IntelliJ Themes Pack](flatlaf-intellij-themes)):
![Cyan Light Demo](images/CyanLightDemo.png)
![Dark Purple Demo](images/DarkPurpleDemo.png)
![IntelliJ Platform Themes](images/intellij_platform_themes.png)
Demo

View File

@@ -14,8 +14,8 @@
* limitations under the License.
*/
val releaseVersion = "0.40"
val developmentVersion = "0.41-SNAPSHOT"
val releaseVersion = "0.42"
val developmentVersion = "0.43-SNAPSHOT"
version = if( java.lang.Boolean.getBoolean( "release" ) ) releaseVersion else developmentVersion

View File

@@ -29,6 +29,7 @@ import java.awt.image.ImageFilter;
import java.awt.image.ImageProducer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
@@ -76,6 +77,8 @@ public abstract class FlatLaf
static final Logger LOG = Logger.getLogger( FlatLaf.class.getName() );
private static final String DESKTOPFONTHINTS = "awt.font.desktophints";
private static List<Object> customDefaultsSources;
private String desktopPropertyName;
private String desktopPropertyName2;
private PropertyChangeListener desktopPropertyListener;
@@ -552,6 +555,87 @@ public abstract class FlatLaf
defaults.put( key, value );
}
static List<Object> getCustomDefaultsSources() {
return customDefaultsSources;
}
/**
* Registers a package where FlatLaf searches for properties files with custom UI defaults.
* <p>
* This can be used to specify application specific UI defaults that override UI values
* of existing themes or to define own UI values used in custom controls.
* <p>
* There may be multiple properties files in that package for multiple themes.
* The properties file name must match the used theme class names.
* E.g. {@code FlatLightLaf.properties} for class {@link FlatLightLaf}
* or {@code FlatDarkLaf.properties} for class {@link FlatDarkLaf}.
* {@code FlatLaf.properties} is loaded first for all themes.
* <p>
* These properties files are loaded after theme and addon properties files
* and can therefore override all UI defaults.
* <p>
* Invoke this method before setting the look and feel.
*
* @param packageName a package name (e.g. "com.myapp.resources")
*/
public static void registerCustomDefaultsSource( String packageName ) {
registerCustomDefaultsSource( packageName, null );
}
public static void unregisterCustomDefaultsSource( String packageName ) {
unregisterCustomDefaultsSource( packageName, null );
}
/**
* Registers a package where FlatLaf searches for properties files with custom UI defaults.
* <p>
* See {@link #registerCustomDefaultsSource(String)} for details.
*
* @param packageName a package name (e.g. "com.myapp.resources")
* @param classLoader a class loader used to find resources, or {@code null}
*/
public static void registerCustomDefaultsSource( String packageName, ClassLoader classLoader ) {
if( customDefaultsSources == null )
customDefaultsSources = new ArrayList<>();
customDefaultsSources.add( packageName );
customDefaultsSources.add( classLoader );
}
public static void unregisterCustomDefaultsSource( String packageName, ClassLoader classLoader ) {
if( customDefaultsSources == null )
return;
int size = customDefaultsSources.size();
for( int i = 0; i < size - 1; i++ ) {
Object source = customDefaultsSources.get( i );
if( packageName.equals( source ) && customDefaultsSources.get( i + 1 ) == classLoader ) {
customDefaultsSources.remove( i + 1 );
customDefaultsSources.remove( i );
break;
}
}
}
/**
* Registers a folder where FlatLaf searches for properties files with custom UI defaults.
* <p>
* See {@link #registerCustomDefaultsSource(String)} for details.
*
* @param folder a folder
*/
public static void registerCustomDefaultsSource( File folder ) {
if( customDefaultsSources == null )
customDefaultsSources = new ArrayList<>();
customDefaultsSources.add( folder );
}
public static void unregisterCustomDefaultsSource( File folder ) {
if( customDefaultsSources == null )
return;
customDefaultsSources.remove( folder );
}
private static void reSetLookAndFeel() {
EventQueue.invokeLater( () -> {
LookAndFeel lookAndFeel = UIManager.getLookAndFeel();

View File

@@ -531,6 +531,7 @@ public class IntelliJTheme
uiKeyMapping.put( "Slider.trackWidth", "" ); // ignore (used in Material Theme UI Lite)
// TitlePane
uiKeyCopying.put( "TitlePane.inactiveBackground", "TitlePane.background" );
uiKeyMapping.put( "TitlePane.infoForeground", "TitlePane.foreground" );
uiKeyMapping.put( "TitlePane.inactiveInfoForeground", "TitlePane.inactiveForeground" );

View File

@@ -19,14 +19,18 @@ package com.formdev.flatlaf;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Insets;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.function.Function;
import java.util.logging.Level;
@@ -115,6 +119,46 @@ class UIDefaultsLoader
addonClassLoaders.add( addonClassLoader );
}
// load custom properties files (usually provides by applications)
List<Object> customDefaultsSources = FlatLaf.getCustomDefaultsSources();
int size = (customDefaultsSources != null) ? customDefaultsSources.size() : 0;
for( int i = 0; i < size; i++ ) {
Object source = customDefaultsSources.get( i );
if( source instanceof String && i + 1 < size ) {
// load from package in classloader
String packageName = (String) source;
ClassLoader classLoader = (ClassLoader) customDefaultsSources.get( ++i );
// use class loader also for instantiating classes specified in values
if( classLoader != null && !addonClassLoaders.contains( classLoader ) )
addonClassLoaders.add( classLoader );
packageName = packageName.replace( '.', '/' );
if( classLoader == null )
classLoader = FlatLaf.class.getClassLoader();
for( Class<?> lafClass : lafClasses ) {
String propertiesName = packageName + '/' + lafClass.getSimpleName() + ".properties";
try( InputStream in = classLoader.getResourceAsStream( propertiesName ) ) {
if( in != null )
properties.load( in );
}
}
} else if( source instanceof File ) {
// load from folder
File folder = (File) source;
for( Class<?> lafClass : lafClasses ) {
File propertiesFile = new File( folder, lafClass.getSimpleName() + ".properties" );
if( !propertiesFile.isFile() )
continue;
try( InputStream in = new FileInputStream( propertiesFile ) ) {
properties.load( in );
}
}
}
}
// add additional defaults
if( additionalDefaults != null )
properties.putAll( additionalDefaults );
@@ -154,6 +198,29 @@ class UIDefaultsLoader
}
}
// get (and remove) globals, which override all other defaults that end with same suffix
HashMap<String, String> globals = new HashMap<>();
Iterator<Entry<Object, Object>> it = properties.entrySet().iterator();
while( it.hasNext() ) {
Entry<Object, Object> e = it.next();
String key = (String) e.getKey();
if( key.startsWith( GLOBAL_PREFIX ) ) {
globals.put( key.substring( GLOBAL_PREFIX.length() ), (String) e.getValue() );
it.remove();
}
}
// override UI defaults with globals
for( Object okey : defaults.keySet() ) {
if( okey instanceof String && ((String)okey).contains( "." ) ) {
String key = (String) okey;
String globalKey = key.substring( key.lastIndexOf( '.' ) + 1 );
String globalValue = globals.get( globalKey );
if( globalValue != null && !properties.containsKey( key ) )
properties.put( key, globalValue );
}
}
Function<String, String> propertiesGetter = key -> {
return properties.getProperty( key );
};
@@ -161,37 +228,10 @@ class UIDefaultsLoader
return resolveValue( value, propertiesGetter );
};
// get globals, which override all other defaults that end with same suffix
HashMap<String, Object> globals = new HashMap<>();
// parse and add properties to UI defaults
for( Map.Entry<Object, Object> e : properties.entrySet() ) {
String key = (String) e.getKey();
if( !key.startsWith( GLOBAL_PREFIX ) )
continue;
String value = resolveValue( (String) e.getValue(), propertiesGetter );
try {
globals.put( key.substring( GLOBAL_PREFIX.length() ),
parseValue( key, value, null, resolver, addonClassLoaders ) );
} catch( RuntimeException ex ) {
logParseError( Level.SEVERE, key, value, ex );
}
}
// override UI defaults with globals
for( Object key : defaults.keySet() ) {
if( key instanceof String && ((String)key).contains( "." ) ) {
String skey = (String) key;
String globalKey = skey.substring( skey.lastIndexOf( '.' ) + 1 );
Object globalValue = globals.get( globalKey );
if( globalValue != null )
defaults.put( key, globalValue );
}
}
// add non-global properties to UI defaults
for( Map.Entry<Object, Object> e : properties.entrySet() ) {
String key = (String) e.getKey();
if( key.startsWith( VARIABLE_PREFIX ) || key.startsWith( GLOBAL_PREFIX ) )
if( key.startsWith( VARIABLE_PREFIX ) )
continue;
String value = resolveValue( (String) e.getValue(), propertiesGetter );

View File

@@ -67,8 +67,11 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault Button.focusedBackground Color optional
* @uiDefault Button.hoverBackground Color optional
* @uiDefault Button.pressedBackground Color optional
* @uiDefault Button.selectedBackground Color
* @uiDefault Button.selectedForeground Color
* @uiDefault Button.disabledBackground Color optional
* @uiDefault Button.disabledText Color
* @uiDefault Button.disabledSelectedBackground Color
* @uiDefault Button.default.background Color
* @uiDefault Button.default.startBackground Color optional; if set, a gradient paint is used and Button.default.background is ignored
* @uiDefault Button.default.endBackground Color optional; if set, a gradient paint is used
@@ -84,6 +87,7 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault Button.toolbar.spacingInsets Insets
* @uiDefault Button.toolbar.hoverBackground Color
* @uiDefault Button.toolbar.pressedBackground Color
* @uiDefault Button.toolbar.selectedBackground Color
*
* @author Karl Tauber
*/
@@ -101,8 +105,11 @@ public class FlatButtonUI
protected Color focusedBackground;
protected Color hoverBackground;
protected Color pressedBackground;
protected Color selectedBackground;
protected Color selectedForeground;
protected Color disabledBackground;
protected Color disabledText;
protected Color disabledSelectedBackground;
protected Color defaultBackground;
protected Color defaultEndBackground;
@@ -119,6 +126,7 @@ public class FlatButtonUI
protected Insets toolbarSpacingInsets;
protected Color toolbarHoverBackground;
protected Color toolbarPressedBackground;
protected Color toolbarSelectedBackground;
private Icon helpButtonIcon;
@@ -150,8 +158,11 @@ public class FlatButtonUI
focusedBackground = UIManager.getColor( prefix + "focusedBackground" );
hoverBackground = UIManager.getColor( prefix + "hoverBackground" );
pressedBackground = UIManager.getColor( prefix + "pressedBackground" );
selectedBackground = UIManager.getColor( prefix + "selectedBackground" );
selectedForeground = UIManager.getColor( prefix + "selectedForeground" );
disabledBackground = UIManager.getColor( prefix + "disabledBackground" );
disabledText = UIManager.getColor( prefix + "disabledText" );
disabledSelectedBackground = UIManager.getColor( prefix + "disabledSelectedBackground" );
if( UIManager.getBoolean( "Button.paintShadow" ) ) {
shadowWidth = FlatUIUtils.getUIInt( "Button.shadowWidth", 2 );
@@ -174,6 +185,7 @@ public class FlatButtonUI
toolbarSpacingInsets = UIManager.getInsets( "Button.toolbar.spacingInsets" );
toolbarHoverBackground = UIManager.getColor( prefix + "toolbar.hoverBackground" );
toolbarPressedBackground = UIManager.getColor( prefix + "toolbar.pressedBackground" );
toolbarSelectedBackground = UIManager.getColor( prefix + "toolbar.selectedBackground" );
helpButtonIcon = UIManager.getIcon( "HelpButton.icon" );
@@ -369,6 +381,17 @@ public class FlatButtonUI
}
protected Color getBackground( JComponent c ) {
if( ((AbstractButton)c).isSelected() ) {
// in toolbar use same colors for disabled and enabled because
// we assume that toolbar icon is shown disabled
boolean toolBarButton = isToolBarButton( c );
return buttonStateColor( c,
toolBarButton ? toolbarSelectedBackground : selectedBackground,
toolBarButton ? toolbarSelectedBackground : disabledSelectedBackground,
null, null,
toolBarButton ? toolbarPressedBackground : pressedBackground );
}
if( !c.isEnabled() )
return disabledBackground;
@@ -430,6 +453,9 @@ public class FlatButtonUI
if( !c.isEnabled() )
return disabledText;
if( ((AbstractButton)c).isSelected() && !isToolBarButton( c ) )
return selectedForeground;
// use component foreground if explicitly set
Color fg = c.getForeground();
if( isCustomForeground( fg ) )

View File

@@ -57,4 +57,8 @@ public class FlatEmptyBorder
insets.bottom = scale( bottom );
return insets;
}
public Insets getUnscaledBorderInsets() {
return super.getBorderInsets();
}
}

View File

@@ -84,6 +84,8 @@ import javax.swing.plaf.basic.BasicInternalFrameUI;
public class FlatInternalFrameUI
extends BasicInternalFrameUI
{
protected FlatWindowResizer windowResizer;
public static ComponentUI createUI( JComponent c ) {
return new FlatInternalFrameUI( (JInternalFrame) c );
}
@@ -97,6 +99,18 @@ public class FlatInternalFrameUI
super.installUI( c );
LookAndFeel.installProperty( frame, "opaque", false );
windowResizer = createWindowResizer();
}
@Override
public void uninstallUI( JComponent c ) {
super.uninstallUI( c );
if( windowResizer != null ) {
windowResizer.uninstall();
windowResizer = null;
}
}
@Override
@@ -104,6 +118,10 @@ public class FlatInternalFrameUI
return new FlatInternalFrameTitlePane( w );
}
protected FlatWindowResizer createWindowResizer() {
return new FlatWindowResizer.InternalFrameResizer( frame, this::getDesktopManager );
}
//---- class FlatInternalFrameBorder --------------------------------------
public static class FlatInternalFrameBorder

View File

@@ -126,6 +126,9 @@ public class FlatListUI
* or the application has to be changed to extend a FlatLaf renderer.
*/
private void toggleSelectionColors() {
if( list == null )
return;
if( FlatUIUtils.isPermanentFocusOwner( list ) ) {
if( list.getSelectionBackground() == selectionInactiveBackground )
list.setSelectionBackground( selectionBackground );

View File

@@ -60,6 +60,7 @@ import com.formdev.flatlaf.util.HiDPIUtils;
* @uiDefault Component.minimumWidth int
* @uiDefault Component.isIntelliJTheme boolean
* @uiDefault PasswordField.placeholderForeground Color
* @uiDefault PasswordField.showCapsLock boolean
* @uiDefault PasswordField.capsLockIcon Icon
* @uiDefault TextComponent.selectAllOnFocusPolicy String never, once (default) or always
*
@@ -71,6 +72,7 @@ public class FlatPasswordFieldUI
protected int minimumWidth;
protected boolean isIntelliJTheme;
protected Color placeholderForeground;
protected boolean showCapsLock;
protected Icon capsLockIcon;
private FocusListener focusListener;
@@ -88,6 +90,7 @@ public class FlatPasswordFieldUI
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" );
placeholderForeground = UIManager.getColor( prefix + ".placeholderForeground" );
showCapsLock = UIManager.getBoolean( "PasswordField.showCapsLock" );
capsLockIcon = UIManager.getIcon( "PasswordField.capsLockIcon" );
LookAndFeel.installProperty( getComponent(), "opaque", false );
@@ -160,6 +163,9 @@ public class FlatPasswordFieldUI
}
protected void paintCapsLock( Graphics g ) {
if( !showCapsLock )
return;
JTextComponent c = getComponent();
if( !FlatUIUtils.isPermanentFocusOwner( c ) ||
!Toolkit.getDefaultToolkit().getLockingKeyState( KeyEvent.VK_CAPS_LOCK ) )

View File

@@ -21,6 +21,7 @@ import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.MouseInfo;
import java.awt.Panel;
import java.awt.Point;
import java.awt.Rectangle;
@@ -33,6 +34,7 @@ import javax.swing.JComponent;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JToolTip;
import javax.swing.JWindow;
import javax.swing.Popup;
import javax.swing.PopupFactory;
import javax.swing.RootPaneContainer;
@@ -41,6 +43,7 @@ import javax.swing.UIManager;
import javax.swing.border.Border;
import com.formdev.flatlaf.FlatClientProperties;
import com.formdev.flatlaf.util.SystemInfo;
import com.formdev.flatlaf.util.UIScale;
/**
* A popup factory that adds drop shadows to popups on Windows.
@@ -59,19 +62,97 @@ public class FlatPopupFactory
public Popup getPopup( Component owner, Component contents, int x, int y )
throws IllegalArgumentException
{
Point pt = fixToolTipLocation( owner, contents, x, y );
if( pt != null ) {
x = pt.x;
y = pt.y;
}
if( !isDropShadowPainted( owner, contents ) )
return new NonFlashingPopup( super.getPopup( owner, contents, x, y ), contents );
return new NonFlashingPopup( getPopupForScreenOfOwner( owner, contents, x, y, false ), contents );
// macOS and Linux adds drop shadow to heavy weight popups
if( SystemInfo.isMacOS || SystemInfo.isLinux ) {
Popup popup = getHeavyWeightPopup( owner, contents, x, y );
Popup popup = getPopupForScreenOfOwner( owner, contents, x, y, true );
if( popup == null )
popup = super.getPopup( owner, contents, x, y );
popup = getPopupForScreenOfOwner( owner, contents, x, y, false );
return new NonFlashingPopup( popup, contents );
}
// create drop shadow popup
return new DropShadowPopup( super.getPopup( owner, contents, x, y ), owner, contents );
return new DropShadowPopup( getPopupForScreenOfOwner( owner, contents, x, y, false ), owner, contents );
}
/**
* Creates a popup for the screen that the owner component is on.
* <p>
* PopupFactory caches heavy weight popup windows and reuses them.
* On a dual screen setup, if the popup owner has moved from one screen to the other one,
* then the cached heavy weight popup window may be connected to the wrong screen.
* If the two screens use different scaling factors, then the popup location and size
* is scaled when the popup becomes visible, which shows the popup in the wrong location
* (or on wrong screen). The re-scaling is done in WWindowPeer.setBounds() (Java 9+).
* <p>
* To fix this, dispose popup windows that are on wrong screen and get new popup.
* <p>
* This is a workaround for https://bugs.openjdk.java.net/browse/JDK-8224608
*/
private Popup getPopupForScreenOfOwner( Component owner, Component contents, int x, int y, boolean forceHeavyWeight )
throws IllegalArgumentException
{
int count = 0;
for(;;) {
// create new or get cached popup
Popup popup = forceHeavyWeight
? getHeavyWeightPopup( owner, contents, x, y )
: super.getPopup( owner, contents, x, y );
// get heavy weight popup window; is null for non-heavy weight popup
Window popupWindow = SwingUtilities.windowForComponent( contents );
// check whether heavy weight popup window is on same screen as owner component
if( popupWindow == null ||
popupWindow.getGraphicsConfiguration() == owner.getGraphicsConfiguration() )
return popup;
// remove contents component from popup window
if( popupWindow instanceof JWindow )
((JWindow)popupWindow).getContentPane().removeAll();
// dispose unused popup
// (do not invoke popup.hide() because this would cache the popup window)
popupWindow.dispose();
// avoid endless loop (should newer happen; PopupFactory cache size is 5)
if( ++count > 10 )
return popup;
}
}
/**
* Shows the given popup and, if necessary, fixes the location of a heavy weight popup window.
* <p>
* On a dual screen setup, where screens use different scale factors, it may happen
* that the window location changes when showing a heavy weight popup window.
* E.g. when opening an dialog on the secondary screen and making combobox popup visible.
* <p>
* This is a workaround for https://bugs.openjdk.java.net/browse/JDK-8224608
*/
private static void showPopupAndFixLocation( Popup popup, Window popupWindow ) {
if( popupWindow != null ) {
// remember location of heavy weight popup window
int x = popupWindow.getX();
int y = popupWindow.getY();
popup.show();
// restore popup window location if it has changed
// (probably scaled when screens use different scale factors)
if( popupWindow.getX() != x || popupWindow.getY() != y )
popupWindow.setLocation( x, y );
} else
popup.show();
}
private boolean isDropShadowPainted( Component owner, Component contents ) {
@@ -127,6 +208,31 @@ public class FlatPopupFactory
}
}
/**
* Usually ToolTipManager places a tooltip at (mouseLocation.x, mouseLocation.y + 20).
* In case that the tooltip would be partly outside of the screen,
* ToolTipManagerthe changes the location so that the entire tooltip fits on screen.
* But this can place the tooltip under the mouse location and hide the owner component.
* <p>
* This method checks whether the current mouse location is within tooltip bounds
* and corrects the y-location so that the tooltip is placed above the mouse location.
*/
private Point fixToolTipLocation( Component owner, Component contents, int x, int y ) {
if( !(contents instanceof JToolTip) )
return null;
Point mouseLocation = MouseInfo.getPointerInfo().getLocation();
Dimension tipSize = contents.getPreferredSize();
// check whether mouse location is within tooltip bounds
Rectangle tipBounds = new Rectangle( x, y, tipSize.width, tipSize.height );
if( !tipBounds.contains( mouseLocation ) )
return null;
// place tooltip above mouse location
return new Point( x, mouseLocation.y - tipSize.height - UIScale.scale( 20 ) );
}
//---- class NonFlashingPopup ---------------------------------------------
private class NonFlashingPopup
@@ -157,7 +263,7 @@ public class FlatPopupFactory
@Override
public void show() {
if( delegate != null ) {
delegate.show();
showPopupAndFixLocation( delegate, popupWindow );
// increase tooltip size if necessary because it may be too small on HiDPI screens
// https://bugs.openjdk.java.net/browse/JDK-8213535
@@ -249,7 +355,7 @@ public class FlatPopupFactory
// create heavy weight popup for drop shadow
int x = popupWindow.getX() - insets.left;
int y = popupWindow.getY() - insets.top;
dropShadowDelegate = getHeavyWeightPopup( owner, dropShadowPanel, x, y );
dropShadowDelegate = getPopupForScreenOfOwner( owner, dropShadowPanel, x, y, true );
// make drop shadow popup window translucent
dropShadowWindow = SwingUtilities.windowForComponent( dropShadowPanel );
@@ -291,7 +397,7 @@ public class FlatPopupFactory
@Override
public void show() {
if( dropShadowDelegate != null )
dropShadowDelegate.show();
showPopupAndFixLocation( dropShadowDelegate, dropShadowWindow );
if( mediumWeightPanel != null )
showMediumWeightDropShadow();

View File

@@ -172,7 +172,7 @@ public class FlatRootPaneUI
}
protected FlatWindowResizer createWindowResizer() {
return new FlatWindowResizer( rootPane );
return new FlatWindowResizer.WindowResizer( rootPane );
}
protected FlatTitlePane createTitlePane() {

View File

@@ -158,7 +158,7 @@ public class FlatTableHeaderUI
g2.setColor( separatorColor );
int sepCount = columnCount;
if( header.getTable().getAutoResizeMode() != JTable.AUTO_RESIZE_OFF && !isVerticalScrollBarVisible() )
if( header.getTable() != null && header.getTable().getAutoResizeMode() != JTable.AUTO_RESIZE_OFF && !isVerticalScrollBarVisible() )
sepCount--;
if( header.getComponentOrientation().isLeftToRight() ) {

View File

@@ -188,6 +188,9 @@ public class FlatTableUI
* or the application has to be changed to extend a FlatLaf renderer.
*/
private void toggleSelectionColors() {
if( table == null )
return;
if( FlatUIUtils.isPermanentFocusOwner( table ) ) {
if( table.getSelectionBackground() == selectionInactiveBackground )
table.setSelectionBackground( selectionBackground );

View File

@@ -60,6 +60,7 @@ public class FlatTextAreaUI
{
protected int minimumWidth;
protected boolean isIntelliJTheme;
protected Color background;
protected Color disabledBackground;
protected Color inactiveBackground;
@@ -67,12 +68,20 @@ public class FlatTextAreaUI
return new FlatTextAreaUI();
}
@Override
public void installUI( JComponent c ) {
super.installUI( c );
updateBackground();
}
@Override
protected void installDefaults() {
super.installDefaults();
minimumWidth = UIManager.getInt( "Component.minimumWidth" );
isIntelliJTheme = UIManager.getBoolean( "Component.isIntelliJTheme" );
background = UIManager.getColor( "TextArea.background" );
disabledBackground = UIManager.getColor( "TextArea.disabledBackground" );
inactiveBackground = UIManager.getColor( "TextArea.inactiveBackground" );
}
@@ -81,6 +90,7 @@ public class FlatTextAreaUI
protected void uninstallDefaults() {
super.uninstallDefaults();
background = null;
disabledBackground = null;
inactiveBackground = null;
}
@@ -89,26 +99,36 @@ public class FlatTextAreaUI
protected void propertyChange( PropertyChangeEvent e ) {
super.propertyChange( e );
FlatEditorPaneUI.propertyChange( getComponent(), e );
switch( e.getPropertyName() ) {
case "editable":
case "enabled":
updateBackground();
break;
}
}
@Override
protected void paintSafely( Graphics g ) {
super.paintSafely( HiDPIUtils.createGraphicsTextYCorrection( (Graphics2D) g ) );
}
@Override
protected void paintBackground( Graphics g ) {
private void updateBackground() {
JTextComponent c = getComponent();
Color background = c.getBackground();
g.setColor( !(background instanceof UIResource)
? background
: (isIntelliJTheme && (!c.isEnabled() || !c.isEditable())
? FlatUIUtils.getParentBackground( c )
: (!c.isEnabled()
? disabledBackground
: (!c.isEditable() ? inactiveBackground : background))) );
g.fillRect( 0, 0, c.getWidth(), c.getHeight() );
if( !(background instanceof UIResource) )
return;
// do not update background if it currently has a unknown color (assigned from outside)
if( background != this.background &&
background != disabledBackground &&
background != inactiveBackground )
return;
Color newBackground = !c.isEnabled()
? disabledBackground
: (!c.isEditable()
? inactiveBackground
: this.background);
if( newBackground != background )
c.setBackground( newBackground );
}
@Override
@@ -128,4 +148,22 @@ public class FlatTextAreaUI
return FlatEditorPaneUI.applyMinimumWidth( c, size, minimumWidth );
}
@Override
protected void paintSafely( Graphics g ) {
super.paintSafely( HiDPIUtils.createGraphicsTextYCorrection( (Graphics2D) g ) );
}
@Override
protected void paintBackground( Graphics g ) {
JTextComponent c = getComponent();
// for compatibility with IntelliJ themes
if( isIntelliJTheme && (!c.isEnabled() || !c.isEditable()) && (c.getBackground() instanceof UIResource) ) {
FlatUIUtils.paintParentBackground( g, c );
return;
}
super.paintBackground( g );
}
}

View File

@@ -240,12 +240,15 @@ public class FlatTitlePane
protected void activeChanged( boolean active ) {
boolean hasEmbeddedMenuBar = rootPane.getJMenuBar() != null && isMenuBarEmbedded();
Color background = FlatUIUtils.nonUIResource( active ? activeBackground : inactiveBackground );
Color foreground = FlatUIUtils.nonUIResource( active
? (hasEmbeddedMenuBar ? embeddedForeground : activeForeground)
: inactiveForeground );
Color foreground = FlatUIUtils.nonUIResource( active ? activeForeground : inactiveForeground );
Color titleForeground = (hasEmbeddedMenuBar && active) ? FlatUIUtils.nonUIResource( embeddedForeground ) : foreground;
setBackground( background );
titleLabel.setForeground( foreground );
titleLabel.setForeground( titleForeground );
iconifyButton.setForeground( foreground );
maximizeButton.setForeground( foreground );
restoreButton.setForeground( foreground );
closeButton.setForeground( foreground );
titleLabel.setHorizontalAlignment( hasEmbeddedMenuBar ? SwingConstants.CENTER : SwingConstants.LEADING );
@@ -751,8 +754,7 @@ debug*/
//---- interface MouseListener ----
private int lastXOnScreen;
private int lastYOnScreen;
private Point dragOffset;
@Override
public void mouseClicked( MouseEvent e ) {
@@ -776,8 +778,10 @@ debug*/
@Override
public void mousePressed( MouseEvent e ) {
lastXOnScreen = e.getXOnScreen();
lastYOnScreen = e.getYOnScreen();
if( window == null )
return; // should newer occur
dragOffset = SwingUtilities.convertPoint( FlatTitlePane.this, e.getPoint(), window );
}
@Override public void mouseReleased( MouseEvent e ) {}
@@ -788,46 +792,45 @@ debug*/
@Override
public void mouseDragged( MouseEvent e ) {
if( window == null )
return; // should newer occur
if( hasJBRCustomDecoration() )
return; // do nothing if running in JBR
int xOnScreen = e.getXOnScreen();
int yOnScreen = e.getYOnScreen();
if( lastXOnScreen == xOnScreen && lastYOnScreen == yOnScreen )
return;
// restore window if it is maximized
if( window instanceof Frame ) {
Frame frame = (Frame) window;
int state = frame.getExtendedState();
if( (state & Frame.MAXIMIZED_BOTH) != 0 ) {
int maximizedX = window.getX();
int maximizedY = window.getY();
int maximizedWidth = window.getWidth();
// restore window size, which also moves window to pre-maximized location
frame.setExtendedState( state & ~Frame.MAXIMIZED_BOTH );
// fix drag offset to ensure that window remains under mouse position
// for the case that dragging starts in the right area of the maximized window
int restoredWidth = window.getWidth();
int newX = maximizedX;
JComponent rightComp = getComponentOrientation().isLeftToRight() ? buttonPanel : leftPanel;
if( xOnScreen >= maximizedX + restoredWidth - rightComp.getWidth() - 10 )
newX = xOnScreen + rightComp.getWidth() + 10 - restoredWidth;
// move window near mouse
window.setLocation( newX, maximizedY );
return;
int center = restoredWidth / 2;
if( dragOffset.x > center ) {
// this is same/similar to what Windows 10 does
if( dragOffset.x > maximizedWidth - center )
dragOffset.x = restoredWidth - (maximizedWidth - dragOffset.x);
else
dragOffset.x = center;
}
}
}
// compute new window location
int newX = window.getX() + (xOnScreen - lastXOnScreen);
int newY = window.getY() + (yOnScreen - lastYOnScreen);
int newX = e.getXOnScreen() - dragOffset.x;
int newY = e.getYOnScreen() - dragOffset.y;
if( newX == window.getX() && newY == window.getY() )
return;
// move window
window.setLocation( newX, newY );
lastXOnScreen = xOnScreen;
lastYOnScreen = yOnScreen;
}
@Override public void mouseMoved( MouseEvent e ) {}

View File

@@ -22,7 +22,6 @@ import java.awt.Component;
import java.awt.Graphics;
import java.beans.PropertyChangeEvent;
import javax.swing.AbstractButton;
import javax.swing.ButtonModel;
import javax.swing.JComponent;
import javax.swing.JToggleButton;
import javax.swing.UIManager;
@@ -50,18 +49,17 @@ import com.formdev.flatlaf.util.UIScale;
* @uiDefault ToggleButton.startBackground Color optional; if set, a gradient paint is used and ToggleButton.background is ignored
* @uiDefault ToggleButton.endBackground Color optional; if set, a gradient paint is used
* @uiDefault ToggleButton.pressedBackground Color
* @uiDefault ToggleButton.disabledBackground Color optional
* @uiDefault ToggleButton.disabledText Color
* @uiDefault ToggleButton.toolbar.hoverBackground Color
* @uiDefault ToggleButton.toolbar.pressedBackground Color
*
* <!-- FlatToggleButtonUI -->
*
* @uiDefault ToggleButton.selectedBackground Color
* @uiDefault ToggleButton.selectedForeground Color
* @uiDefault ToggleButton.disabledBackground Color optional
* @uiDefault ToggleButton.disabledText Color
* @uiDefault ToggleButton.disabledSelectedBackground Color
* @uiDefault ToggleButton.toolbar.hoverBackground Color
* @uiDefault ToggleButton.toolbar.pressedBackground Color
* @uiDefault ToggleButton.toolbar.selectedBackground Color
*
* <!-- FlatToggleButtonUI -->
*
* @uiDefault ToggleButton.tab.underlineHeight int
* @uiDefault ToggleButton.tab.underlineColor Color
* @uiDefault ToggleButton.tab.disabledUnderlineColor Color
@@ -75,12 +73,6 @@ import com.formdev.flatlaf.util.UIScale;
public class FlatToggleButtonUI
extends FlatButtonUI
{
protected Color selectedBackground;
protected Color selectedForeground;
protected Color disabledSelectedBackground;
protected Color toolbarSelectedBackground;
protected int tabUnderlineHeight;
protected Color tabUnderlineColor;
protected Color tabDisabledUnderlineColor;
@@ -108,12 +100,6 @@ public class FlatToggleButtonUI
super.installDefaults( b );
if( !defaults_initialized ) {
selectedBackground = UIManager.getColor( "ToggleButton.selectedBackground" );
selectedForeground = UIManager.getColor( "ToggleButton.selectedForeground" );
disabledSelectedBackground = UIManager.getColor( "ToggleButton.disabledSelectedBackground" );
toolbarSelectedBackground = UIManager.getColor( "ToggleButton.toolbar.selectedBackground" );
tabUnderlineHeight = UIManager.getInt( "ToggleButton.tab.underlineHeight" );
tabUnderlineColor = UIManager.getColor( "ToggleButton.tab.underlineColor" );
tabDisabledUnderlineColor = UIManager.getColor( "ToggleButton.tab.disabledUnderlineColor" );
@@ -185,30 +171,4 @@ public class FlatToggleButtonUI
} else
super.paintBackground( g, c );
}
@Override
protected Color getBackground( JComponent c ) {
ButtonModel model = ((AbstractButton)c).getModel();
if( model.isSelected() ) {
// in toolbar use same colors for disabled and enabled because
// we assume that toolbar icon is shown disabled
boolean toolBarButton = isToolBarButton( c );
return buttonStateColor( c,
toolBarButton ? toolbarSelectedBackground : selectedBackground,
toolBarButton ? toolbarSelectedBackground : disabledSelectedBackground,
null, null,
toolBarButton ? toolbarPressedBackground : pressedBackground );
}
return super.getBackground( c );
}
@Override
protected Color getForeground( JComponent c ) {
if( c.isEnabled() && ((AbstractButton)c).isSelected() && !isToolBarButton( c ) )
return selectedForeground;
return super.getForeground( c );
}
}

View File

@@ -17,11 +17,13 @@
package com.formdev.flatlaf.ui;
import static java.awt.Cursor.*;
import static javax.swing.SwingConstants.*;
import java.awt.Container;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.Window;
@@ -34,54 +36,59 @@ import java.awt.event.WindowEvent;
import java.awt.event.WindowStateListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.function.Supplier;
import javax.swing.DesktopManager;
import javax.swing.JComponent;
import javax.swing.JInternalFrame;
import javax.swing.JLayeredPane;
import javax.swing.JRootPane;
import javax.swing.UIManager;
import com.formdev.flatlaf.util.UIScale;
/**
* Resizes frames and dialogs.
* Resizes frames, dialogs or internal frames.
* <p>
* Could also be used to implement resize support for any Swing component
* by creating a new subclass.
*
* @author Karl Tauber
*/
public class FlatWindowResizer
implements PropertyChangeListener, WindowStateListener, ComponentListener
public abstract class FlatWindowResizer
implements PropertyChangeListener, ComponentListener
{
protected final static Integer WINDOW_RESIZER_LAYER = JLayeredPane.DRAG_LAYER + 1;
protected final JRootPane rootPane;
protected final JComponent resizeComp;
protected final int borderDragThickness = FlatUIUtils.getUIInt( "RootPane.borderDragThickness", 5 );
protected final int cornerDragWidth = FlatUIUtils.getUIInt( "RootPane.cornerDragWidth", 16 );
protected final boolean honorFrameMinimumSizeOnResize = UIManager.getBoolean( "RootPane.honorFrameMinimumSizeOnResize" );
protected final boolean honorDialogMinimumSizeOnResize = UIManager.getBoolean( "RootPane.honorDialogMinimumSizeOnResize" );
protected final JComponent north;
protected final JComponent south;
protected final JComponent west;
protected final JComponent east;
protected final DragBorderComponent topDragComp;
protected final DragBorderComponent bottomDragComp;
protected final DragBorderComponent leftDragComp;
protected final DragBorderComponent rightDragComp;
protected Window window;
protected FlatWindowResizer( JComponent resizeComp ) {
this.resizeComp = resizeComp;
public FlatWindowResizer( JRootPane rootPane ) {
this.rootPane = rootPane;
topDragComp = createDragBorderComponent( NW_RESIZE_CURSOR, N_RESIZE_CURSOR, NE_RESIZE_CURSOR );
bottomDragComp = createDragBorderComponent( SW_RESIZE_CURSOR, S_RESIZE_CURSOR, SE_RESIZE_CURSOR );
leftDragComp = createDragBorderComponent( NW_RESIZE_CURSOR, W_RESIZE_CURSOR, SW_RESIZE_CURSOR );
rightDragComp = createDragBorderComponent( NE_RESIZE_CURSOR, E_RESIZE_CURSOR, SE_RESIZE_CURSOR );
north = createDragBorderComponent( NW_RESIZE_CURSOR, N_RESIZE_CURSOR, NE_RESIZE_CURSOR );
south = createDragBorderComponent( SW_RESIZE_CURSOR, S_RESIZE_CURSOR, SE_RESIZE_CURSOR );
west = createDragBorderComponent( NW_RESIZE_CURSOR, W_RESIZE_CURSOR, SW_RESIZE_CURSOR );
east = createDragBorderComponent( NE_RESIZE_CURSOR, E_RESIZE_CURSOR, SE_RESIZE_CURSOR );
Container cont = (resizeComp instanceof JRootPane) ? ((JRootPane)resizeComp).getLayeredPane() : resizeComp;
Object cons = (cont instanceof JLayeredPane) ? WINDOW_RESIZER_LAYER : null;
cont.add( topDragComp, cons, 0 );
cont.add( bottomDragComp, cons, 1 );
cont.add( leftDragComp, cons, 2 );
cont.add( rightDragComp, cons, 3 );
JLayeredPane layeredPane = rootPane.getLayeredPane();
layeredPane.add( north, WINDOW_RESIZER_LAYER );
layeredPane.add( south, WINDOW_RESIZER_LAYER );
layeredPane.add( west, WINDOW_RESIZER_LAYER );
layeredPane.add( east, WINDOW_RESIZER_LAYER );
resizeComp.addComponentListener( this );
resizeComp.addPropertyChangeListener( "ancestor", this );
rootPane.addComponentListener( this );
rootPane.addPropertyChangeListener( "ancestor", this );
if( rootPane.isDisplayable() )
if( resizeComp.isDisplayable() )
addNotify();
}
@@ -92,85 +99,96 @@ public class FlatWindowResizer
public void uninstall() {
removeNotify();
rootPane.removeComponentListener( this );
rootPane.removePropertyChangeListener( "ancestor", this );
resizeComp.removeComponentListener( this );
resizeComp.removePropertyChangeListener( "ancestor", this );
JLayeredPane layeredPane = rootPane.getLayeredPane();
layeredPane.remove( north );
layeredPane.remove( south );
layeredPane.remove( west );
layeredPane.remove( east );
Container cont = topDragComp.getParent();
cont.remove( topDragComp );
cont.remove( bottomDragComp );
cont.remove( leftDragComp );
cont.remove( rightDragComp );
}
public void doLayout() {
if( !north.isVisible() )
if( !topDragComp.isVisible() )
return;
int x = 0;
int y = 0;
int width = rootPane.getWidth();
int height = rootPane.getHeight();
int width = resizeComp.getWidth();
int height = resizeComp.getHeight();
if( width == 0 || height == 0 )
return;
Insets resizeInsets = getResizeInsets();
int thickness = UIScale.scale( borderDragThickness );
int y2 = y + thickness;
int height2 = height - (thickness * 2);
int topThickness = Math.max( resizeInsets.top, thickness );
int bottomThickness = Math.max( resizeInsets.bottom, thickness );
int leftThickness = Math.max( resizeInsets.left, thickness );
int rightThickness = Math.max( resizeInsets.right, thickness );
int y2 = y + topThickness;
int height2 = height - topThickness - bottomThickness;
north.setBounds( x, y, width, thickness );
south.setBounds( x, y + height - thickness, width, thickness );
west.setBounds( x, y2, thickness, height2 );
east.setBounds( x + width - thickness, y2, thickness, height2 );
// set bounds of drag components
topDragComp.setBounds( x, y, width, topThickness );
bottomDragComp.setBounds( x, y + height - bottomThickness, width, bottomThickness );
leftDragComp.setBounds( x, y2, leftThickness, height2 );
rightDragComp.setBounds( x + width - rightThickness, y2, rightThickness, height2 );
// set corner drag widths
int cornerDelta = UIScale.scale( cornerDragWidth - borderDragThickness );
topDragComp.setCornerDragWidths( leftThickness + cornerDelta, rightThickness + cornerDelta );
bottomDragComp.setCornerDragWidths( leftThickness + cornerDelta, rightThickness + cornerDelta );
leftDragComp.setCornerDragWidths( cornerDelta, cornerDelta );
rightDragComp.setCornerDragWidths( cornerDelta, cornerDelta );
}
protected Insets getResizeInsets() {
return new Insets( 0, 0, 0, 0 );
}
protected void addNotify() {
Container parent = rootPane.getParent();
window = (parent instanceof Window) ? (Window) parent : null;
if( window instanceof Frame ) {
window.addPropertyChangeListener( "resizable", this );
window.addWindowStateListener( this );
}
updateVisibility();
}
protected void removeNotify() {
if( window instanceof Frame ) {
window.removePropertyChangeListener( "resizable", this );
window.removeWindowStateListener( this );
}
window = null;
updateVisibility();
}
protected void updateVisibility() {
boolean visible = isWindowResizable();
if( visible == north.isVisible() )
if( visible == topDragComp.isVisible() )
return;
north.setVisible( visible );
south.setVisible( visible );
west.setVisible( visible );
topDragComp.setVisible( visible );
bottomDragComp.setVisible( visible );
leftDragComp.setVisible( visible );
// The east component is not hidden, instead its bounds are set to 0,0,1,1 and
// it is disabled. This is necessary so that DragBorderComponent.paintComponent() is invoked.
east.setEnabled( visible );
rightDragComp.setEnabled( visible );
if( visible ) {
east.setVisible( true ); // necessary because it is initially invisible
rightDragComp.setVisible( true ); // necessary because it is initially invisible
doLayout();
} else
east.setBounds( 0, 0, 1, 1 );
rightDragComp.setBounds( 0, 0, 1, 1 );
}
protected boolean isWindowResizable() {
if( window instanceof Frame )
return ((Frame)window).isResizable() && (((Frame)window).getExtendedState() & Frame.MAXIMIZED_BOTH) == 0;
if( window instanceof Dialog )
return ((Dialog)window).isResizable();
boolean isDialog() {
return false;
}
protected abstract boolean isWindowResizable();
protected abstract Rectangle getWindowBounds();
protected abstract void setWindowBounds( Rectangle r );
protected abstract boolean honorMinimumSizeOnResize();
protected abstract Dimension getWindowMinimumSize();
protected void beginResizing( int direction ) {}
protected void endResizing() {}
//---- interface PropertyChangeListener ----
@Override
public void propertyChange( PropertyChangeEvent e ) {
switch( e.getPropertyName() ) {
@@ -187,10 +205,7 @@ public class FlatWindowResizer
}
}
@Override
public void windowStateChanged( WindowEvent e ) {
updateVisibility();
}
//---- interface ComponentListener ----
@Override
public void componentResized( ComponentEvent e ) {
@@ -201,6 +216,163 @@ public class FlatWindowResizer
@Override public void componentShown( ComponentEvent e ) {}
@Override public void componentHidden( ComponentEvent e ) {}
//---- class WindowResizer ------------------------------------------------
/**
* Resizes frames and dialogs.
*/
public static class WindowResizer
extends FlatWindowResizer
implements WindowStateListener
{
protected Window window;
public WindowResizer( JRootPane rootPane ) {
super( rootPane );
}
@Override
protected void addNotify() {
Container parent = resizeComp.getParent();
window = (parent instanceof Window) ? (Window) parent : null;
if( window instanceof Frame ) {
window.addPropertyChangeListener( "resizable", this );
window.addWindowStateListener( this );
}
super.addNotify();
}
@Override
protected void removeNotify() {
if( window instanceof Frame ) {
window.removePropertyChangeListener( "resizable", this );
window.removeWindowStateListener( this );
}
window = null;
super.removeNotify();
}
@Override
protected boolean isWindowResizable() {
if( window instanceof Frame )
return ((Frame)window).isResizable() && (((Frame)window).getExtendedState() & Frame.MAXIMIZED_BOTH) == 0;
if( window instanceof Dialog )
return ((Dialog)window).isResizable();
return false;
}
@Override
protected Rectangle getWindowBounds() {
return window.getBounds();
}
@Override
protected void setWindowBounds( Rectangle r ) {
window.setBounds( r );
// immediately layout drag border components
doLayout();
if( Toolkit.getDefaultToolkit().isDynamicLayoutActive() ) {
window.validate();
resizeComp.repaint();
}
}
@Override
protected boolean honorMinimumSizeOnResize() {
return
(honorFrameMinimumSizeOnResize && window instanceof Frame) ||
(honorDialogMinimumSizeOnResize && window instanceof Dialog);
}
@Override
protected Dimension getWindowMinimumSize() {
return window.getMinimumSize();
}
@Override
boolean isDialog() {
return window instanceof Dialog;
}
@Override
public void windowStateChanged( WindowEvent e ) {
updateVisibility();
}
}
//---- class InternalFrameResizer -----------------------------------------
/**
* Resizes internal frames.
*/
public static class InternalFrameResizer
extends FlatWindowResizer
{
protected final Supplier<DesktopManager> desktopManager;
public InternalFrameResizer( JInternalFrame frame, Supplier<DesktopManager> desktopManager ) {
super( frame );
this.desktopManager = desktopManager;
frame.addPropertyChangeListener( "resizable", this );
}
@Override
public void uninstall() {
getFrame().removePropertyChangeListener( "resizable", this );
super.uninstall();
}
private JInternalFrame getFrame() {
return (JInternalFrame) resizeComp;
}
@Override
protected Insets getResizeInsets() {
return getFrame().getInsets();
}
@Override
protected boolean isWindowResizable() {
return getFrame().isResizable();
}
@Override
protected Rectangle getWindowBounds() {
return getFrame().getBounds();
}
@Override
protected void setWindowBounds( Rectangle r ) {
desktopManager.get().resizeFrame( getFrame(), r.x, r.y, r.width, r.height );
}
@Override
protected boolean honorMinimumSizeOnResize() {
return true;
}
@Override
protected Dimension getWindowMinimumSize() {
return getFrame().getMinimumSize();
}
@Override
protected void beginResizing( int direction ) {
desktopManager.get().beginResizingFrame( getFrame(), direction );
}
@Override
protected void endResizing() {
desktopManager.get().endResizingFrame( getFrame() );
}
}
//---- class DragBorderComponent ------------------------------------------
protected class DragBorderComponent
@@ -212,9 +384,15 @@ public class FlatWindowResizer
private final int trailingResizeDir;
private int resizeDir = -1;
private int dragStartMouseX;
private int dragStartMouseY;
private Rectangle dragStartWindowBounds;
private int leadingCornerDragWidth;
private int trailingCornerDragWidth;
// offsets of mouse position to window edges
private int dragLeftOffset;
private int dragRightOffset;
private int dragTopOffset;
private int dragBottomOffset;
protected DragBorderComponent( int leadingResizeDir, int centerResizeDir, int trailingResizeDir ) {
this.leadingResizeDir = leadingResizeDir;
@@ -228,6 +406,11 @@ public class FlatWindowResizer
addMouseMotionListener( this );
}
void setCornerDragWidths( int leading, int trailing ) {
leadingCornerDragWidth = leading;
trailingCornerDragWidth = trailing;
}
protected void setResizeDir( int resizeDir ) {
if( this.resizeDir == resizeDir )
return;
@@ -247,12 +430,25 @@ public class FlatWindowResizer
super.paintChildren( g );
// this is necessary because Dialog.setResizable() does not fire events
if( window instanceof Dialog )
if( isDialog() )
updateVisibility();
/*debug
int width = getWidth();
int height = getHeight();
g.setColor( java.awt.Color.blue );
boolean topOrBottom = (centerResizeDir == N_RESIZE_CURSOR || centerResizeDir == S_RESIZE_CURSOR);
if( topOrBottom ) {
g.drawLine( leadingCornerDragWidth, 0, leadingCornerDragWidth, height );
g.drawLine( width - trailingCornerDragWidth, 0, width - trailingCornerDragWidth, height );
} else {
g.drawLine( 0, leadingCornerDragWidth, width, leadingCornerDragWidth );
g.drawLine( 0, height - trailingCornerDragWidth, width, height - trailingCornerDragWidth );
}
g.setColor( java.awt.Color.red );
g.drawRect( 0, 0, getWidth() - 1, getHeight() - 1 );
g.drawRect( 0, 0, width - 1, height - 1 );
debug*/
}
@@ -262,114 +458,116 @@ debug*/
@Override
public void mousePressed( MouseEvent e ) {
if( window == null )
if( !isWindowResizable() )
return;
dragStartMouseX = e.getXOnScreen();
dragStartMouseY = e.getYOnScreen();
dragStartWindowBounds = window.getBounds();
int xOnScreen = e.getXOnScreen();
int yOnScreen = e.getYOnScreen();
Rectangle windowBounds = getWindowBounds();
// compute offsets of mouse position to window edges
dragLeftOffset = xOnScreen - windowBounds.x;
dragTopOffset = yOnScreen - windowBounds.y;
dragRightOffset = windowBounds.x + windowBounds.width - xOnScreen;
dragBottomOffset = windowBounds.y + windowBounds.height - yOnScreen;
int direction = 0;
switch( resizeDir ) {
case N_RESIZE_CURSOR: direction = NORTH; break;
case S_RESIZE_CURSOR: direction = SOUTH; break;
case W_RESIZE_CURSOR: direction = WEST; break;
case E_RESIZE_CURSOR: direction = EAST; break;
case NW_RESIZE_CURSOR: direction = NORTH_WEST; break;
case NE_RESIZE_CURSOR: direction = NORTH_EAST; break;
case SW_RESIZE_CURSOR: direction = SOUTH_WEST; break;
case SE_RESIZE_CURSOR: direction = SOUTH_EAST; break;
}
beginResizing( direction );
}
@Override
public void mouseReleased( MouseEvent e ) {
dragStartWindowBounds = null;
if( !isWindowResizable() )
return;
dragLeftOffset = dragRightOffset = dragTopOffset = dragBottomOffset = 0;
endResizing();
}
@Override
public void mouseEntered( MouseEvent e ) {
}
@Override
public void mouseExited( MouseEvent e ) {
}
@Override public void mouseEntered( MouseEvent e ) {}
@Override public void mouseExited( MouseEvent e ) {}
@Override
public void mouseMoved( MouseEvent e ) {
boolean topBottom = (centerResizeDir == N_RESIZE_CURSOR || centerResizeDir == S_RESIZE_CURSOR);
int xy = topBottom ? e.getX() : e.getY();
int wh = topBottom ? getWidth() : getHeight();
int cornerWH = UIScale.scale( cornerDragWidth - (topBottom ? 0 : borderDragThickness) );
boolean topOrBottom = (centerResizeDir == N_RESIZE_CURSOR || centerResizeDir == S_RESIZE_CURSOR);
int xy = topOrBottom ? e.getX() : e.getY();
int wh = topOrBottom ? getWidth() : getHeight();
setResizeDir( xy <= cornerWH
setResizeDir( xy <= leadingCornerDragWidth
? leadingResizeDir
: (xy >= wh - cornerWH
: (xy >= wh - trailingCornerDragWidth
? trailingResizeDir
: centerResizeDir) );
}
@Override
public void mouseDragged( MouseEvent e ) {
if( dragStartWindowBounds == null )
return;
if( !isWindowResizable() )
return;
int mouseDeltaX = e.getXOnScreen() - dragStartMouseX;
int mouseDeltaY = e.getYOnScreen() - dragStartMouseY;
int xOnScreen = e.getXOnScreen();
int yOnScreen = e.getYOnScreen();
int deltaX = 0;
int deltaY = 0;
int deltaWidth = 0;
int deltaHeight = 0;
// north
if( resizeDir == N_RESIZE_CURSOR || resizeDir == NW_RESIZE_CURSOR || resizeDir == NE_RESIZE_CURSOR ) {
deltaY = mouseDeltaY;
deltaHeight = -mouseDeltaY;
}
// south
if( resizeDir == S_RESIZE_CURSOR || resizeDir == SW_RESIZE_CURSOR || resizeDir == SE_RESIZE_CURSOR )
deltaHeight = mouseDeltaY;
// west
if( resizeDir == W_RESIZE_CURSOR || resizeDir == NW_RESIZE_CURSOR || resizeDir == SW_RESIZE_CURSOR ) {
deltaX = mouseDeltaX;
deltaWidth = -mouseDeltaX;
}
// east
if( resizeDir == E_RESIZE_CURSOR || resizeDir == NE_RESIZE_CURSOR || resizeDir == SE_RESIZE_CURSOR )
deltaWidth = mouseDeltaX;
// Get current window bounds and compute new bounds based them.
// This is necessary because window manager may alter window bounds while resizing.
// E.g. when having two monitors with different scale factors and resizing
// a window on first screen to the second screen, then the window manager may
// decide at some point that the window should be only on second screen
// and adjusts its bounds.
Rectangle oldBounds = getWindowBounds();
Rectangle newBounds = new Rectangle( oldBounds );
// compute new window bounds
Rectangle newBounds = new Rectangle( dragStartWindowBounds );
newBounds.x += deltaX;
newBounds.y += deltaY;
newBounds.width += deltaWidth;
newBounds.height += deltaHeight;
// top
if( resizeDir == N_RESIZE_CURSOR || resizeDir == NW_RESIZE_CURSOR || resizeDir == NE_RESIZE_CURSOR ) {
newBounds.y = yOnScreen - dragTopOffset;
newBounds.height += (oldBounds.y - newBounds.y);
}
// bottom
if( resizeDir == S_RESIZE_CURSOR || resizeDir == SW_RESIZE_CURSOR || resizeDir == SE_RESIZE_CURSOR )
newBounds.height = (yOnScreen + dragBottomOffset) - newBounds.y;
// left
if( resizeDir == W_RESIZE_CURSOR || resizeDir == NW_RESIZE_CURSOR || resizeDir == SW_RESIZE_CURSOR ) {
newBounds.x = xOnScreen - dragLeftOffset;
newBounds.width += (oldBounds.x - newBounds.x);
}
// right
if( resizeDir == E_RESIZE_CURSOR || resizeDir == NE_RESIZE_CURSOR || resizeDir == SE_RESIZE_CURSOR )
newBounds.width = (xOnScreen + dragRightOffset) - newBounds.x;
// apply minimum window size
boolean honorMinimumSizeOnResize =
(honorFrameMinimumSizeOnResize && window instanceof Frame) ||
(honorDialogMinimumSizeOnResize && window instanceof Dialog);
Dimension minimumSize = honorMinimumSizeOnResize ? window.getMinimumSize() : null;
Dimension minimumSize = honorMinimumSizeOnResize() ? getWindowMinimumSize() : null;
if( minimumSize == null )
minimumSize = UIScale.scale( new Dimension( 150, 50 ) );
if( newBounds.width < minimumSize.width ) {
if( deltaX != 0 )
if( newBounds.x != oldBounds.x )
newBounds.x -= (minimumSize.width - newBounds.width);
newBounds.width = minimumSize.width;
}
if( newBounds.height < minimumSize.height ) {
if( deltaY != 0 )
if( newBounds.y != oldBounds.y )
newBounds.y -= (minimumSize.height - newBounds.height);
newBounds.height = minimumSize.height;
}
// set window bounds
if( !newBounds.equals( dragStartWindowBounds ) ) {
window.setBounds( newBounds );
// immediately layout drag border components
FlatWindowResizer.this.doLayout();
if( Toolkit.getDefaultToolkit().isDynamicLayoutActive() ) {
window.validate();
rootPane.repaint();
}
}
if( !newBounds.equals( oldBounds ) )
setWindowBounds( newBounds );
}
}
}

View File

@@ -0,0 +1,53 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.util;
import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Component;
import java.awt.Insets;
import javax.swing.border.EmptyBorder;
/**
* Empty border that scales insets.
*
* @author Karl Tauber
*/
public class ScaledEmptyBorder
extends EmptyBorder
{
public ScaledEmptyBorder( int top, int left, int bottom, int right ) {
super( top, left, bottom, right );
}
public ScaledEmptyBorder( Insets insets ) {
super( insets );
}
@Override
public Insets getBorderInsets() {
return new Insets( scale( top ), scale( left ), scale( bottom ), scale( right ) );
}
@Override
public Insets getBorderInsets( Component c, Insets insets ) {
insets.left = scale( left );
insets.top = scale( top );
insets.right = scale( right );
insets.bottom = scale( bottom );
return insets;
}
}

View File

@@ -21,18 +21,20 @@
#---- variables ----
@background=#3c3f41
@foreground=#bbbbbb
@foreground=#bbb
@selectionBackground=#4B6EAF
@selectionForeground=@foreground
@selectionInactiveBackground=#0D293E
@selectionInactiveForeground=@foreground
@disabledText=#777777
@disabledText=#888
@textComponentBackground=#45494A
@menuBackground=darken(@background,5%)
@menuHoverBackground=lighten(@menuBackground,10%,derived)
@menuCheckBackground=lighten(@menuBackground,10%,derived)
@menuCheckHoverBackground=lighten(@menuBackground,20%,derived)
@cellFocusColor=#000000
@menuAcceleratorForeground=darken(@foreground,15%)
@menuAcceleratorSelectionForeground=@selectionForeground
@cellFocusColor=#000
@icon=#adadad
# Drop (use lazy colors for IntelliJ platform themes, which usually do not specify these colors)
@@ -42,24 +44,6 @@
@dropLineShortColor=lighten(List.selectionBackground,30%,lazy)
#---- globals ----
*.background=@background
*.foreground=@foreground
*.textBackground=@background
*.textForeground=@foreground
*.caretForeground=@foreground
*.inactiveBackground=@background
*.inactiveForeground=@foreground
*.selectionBackground=@selectionBackground
*.selectionForeground=@selectionForeground
*.disabledBackground=@background
*.disabledForeground=@disabledText
*.disabledText=@disabledText
*.acceleratorForeground=darken(@foreground,15%)
*.acceleratorSelectionForeground=@selectionForeground
#---- system colors ----
activeCaption=#434E60
@@ -74,6 +58,9 @@ controlDkShadow=lighten($controlShadow,10%)
Button.background=#4c5052
Button.hoverBackground=lighten($Button.background,3%,derived)
Button.pressedBackground=lighten($Button.background,6%,derived)
Button.selectedBackground=lighten($Button.background,10%,derived)
Button.selectedForeground=@foreground
Button.disabledSelectedBackground=lighten($Button.background,3%,derived)
Button.borderColor=#5e6060
Button.disabledBorderColor=#5e6060
@@ -81,7 +68,7 @@ Button.focusedBorderColor=#466d94
Button.hoverBorderColor=$Button.focusedBorderColor
Button.default.background=#365880
Button.default.foreground=#bbbbbb
Button.default.foreground=#bbb
Button.default.hoverBackground=lighten($Button.default.background,3%,derived)
Button.default.pressedBackground=lighten($Button.default.background,6%,derived)
Button.default.borderColor=#4c708c
@@ -92,6 +79,7 @@ Button.default.boldText=true
Button.toolbar.hoverBackground=lighten($Button.background,1%,derived)
Button.toolbar.pressedBackground=lighten($Button.background,4%,derived)
Button.toolbar.selectedBackground=lighten($Button.background,7%,derived)
#---- CheckBox ----
@@ -132,12 +120,10 @@ CheckBox.icon[filled].selectedPressedBackground=darken($CheckBox.icon[filled].se
#---- ComboBox ----
ComboBox.background=@textComponentBackground
ComboBox.buttonBackground=@textComponentBackground
ComboBox.buttonEditableBackground=#404445
ComboBox.buttonArrowColor=#9A9DA1
ComboBox.buttonDisabledArrowColor=#585858
ComboBox.buttonHoverArrowColor=#bbbbbb
ComboBox.buttonHoverArrowColor=#bbb
#---- Component ----
@@ -187,11 +173,6 @@ InternalFrame.activeDropShadowOpacity=0.5
InternalFrame.inactiveDropShadowOpacity=0.75
#---- List ----
List.background=@textComponentBackground
#---- Menu ----
Menu.icon.arrowColor=#A7A7A7
@@ -201,7 +182,6 @@ Menu.icon.disabledArrowColor=#606060
#---- MenuBar ----
MenuBar.borderColor=#515151
MenuBar.hoverBackground=@menuHoverBackground
#---- MenuItemCheckBox ----
@@ -228,17 +208,12 @@ PopupMenu.borderColor=#5e5e5e
#---- ProgressBar ----
ProgressBar.background=#555555
ProgressBar.background=#555
ProgressBar.foreground=#4A88C7
ProgressBar.selectionForeground=@foreground
ProgressBar.selectionBackground=@foreground
#---- RadioButton ----
RadioButton.icon[filled].centerDiameter=5
#---- RootPane ----
RootPane.activeBorderColor=darken(@background,7%,derived)
@@ -265,7 +240,7 @@ Separator.foreground=#515151
Slider.trackColor=#646464
Slider.thumbColor=#A6A6A6
Slider.tickColor=#888888
Slider.tickColor=#888
Slider.hoverColor=darken($Slider.thumbColor,15%,derived)
Slider.disabledForeground=#4c5052
@@ -278,7 +253,6 @@ SplitPaneDivider.oneTouchHoverArrowColor=#7A7D81
#---- TabbedPane ----
TabbedPane.disabledForeground=@disabledText
TabbedPane.underlineColor=#4A88C7
TabbedPane.disabledUnderlineColor=#7a7a7a
TabbedPane.hoverColor=#2e3133
@@ -288,13 +262,11 @@ TabbedPane.contentAreaColor=#323232
#---- Table ----
Table.background=@textComponentBackground
Table.gridColor=lighten($Table.background,3%)
#---- TableHeader ----
TableHeader.background=@textComponentBackground
TableHeader.separatorColor=lighten($TableHeader.background,10%)
TableHeader.bottomSeparatorColor=$TableHeader.separatorColor
@@ -309,7 +281,6 @@ TitlePane.buttonPressedBackground=lighten($TitlePane.background,20%,derived)
#---- ToggleButton ----
ToggleButton.selectedBackground=lighten($ToggleButton.background,10%,derived)
ToggleButton.selectedForeground=@foreground
ToggleButton.disabledSelectedBackground=lighten($ToggleButton.background,3%,derived)
ToggleButton.toolbar.selectedBackground=lighten($ToggleButton.background,7%,derived)
@@ -323,5 +294,4 @@ ToolTip.background=#1e2123
#---- Tree ----
Tree.background=@textComponentBackground
Tree.hash=#505355

View File

@@ -23,7 +23,7 @@
Button.focusedBackground=null
Button.default.background=#4D8AC9
Button.default.foreground=#FFFFFF
Button.default.foreground=#fff
Button.default.focusedBackground=null
Button.default.borderColor=#3D75B2
Button.default.hoverBorderColor=#A9C9F5

View File

@@ -67,6 +67,22 @@ ViewportUI=com.formdev.flatlaf.ui.FlatViewportUI
@menuItemMargin=3,6,3,6
#---- globals ----
*.background=@background
*.foreground=@foreground
*.caretForeground=@foreground
*.inactiveBackground=@background
*.inactiveForeground=@disabledText
*.selectionBackground=@selectionBackground
*.selectionForeground=@selectionForeground
*.disabledBackground=@background
*.disabledForeground=@disabledText
*.disabledText=@disabledText
*.acceleratorForeground=@menuAcceleratorForeground
*.acceleratorSelectionForeground=@menuAcceleratorSelectionForeground
#---- system colors ----
desktop=@textComponentBackground
@@ -184,6 +200,8 @@ ComboBox.editorColumns=0
ComboBox.maximumRowCount=15
[mac]ComboBox.showPopupOnNavigation=true
ComboBox.buttonStyle=auto
ComboBox.background=@textComponentBackground
ComboBox.buttonBackground=@textComponentBackground
#---- Component ----
@@ -288,6 +306,7 @@ List.cellFocusColor=@cellFocusColor
List.cellNoFocusBorder=com.formdev.flatlaf.ui.FlatListCellBorder$Default
List.focusCellHighlightBorder=com.formdev.flatlaf.ui.FlatListCellBorder$Focused
List.focusSelectedCellHighlightBorder=com.formdev.flatlaf.ui.FlatListCellBorder$Selected
List.background=@textComponentBackground
List.selectionInactiveBackground=@selectionInactiveBackground
List.selectionInactiveForeground=@selectionInactiveForeground
List.dropCellBackground=@dropCellBackground
@@ -313,6 +332,7 @@ Menu.background=@menuBackground
MenuBar.border=com.formdev.flatlaf.ui.FlatMenuBarBorder
MenuBar.background=@menuBackground
MenuBar.hoverBackground=@menuHoverBackground
MenuBar.itemMargins=3,8,3,8
@@ -373,6 +393,7 @@ PasswordField.margin=@textComponentMargin
PasswordField.background=@textComponentBackground
PasswordField.placeholderForeground=@disabledText
PasswordField.echoChar=\u2022
PasswordField.showCapsLock=true
PasswordField.capsLockIcon=com.formdev.flatlaf.icons.FlatCapsLockIcon
@@ -411,6 +432,7 @@ ProgressBar.repaintInterval=15
RadioButton.border=com.formdev.flatlaf.ui.FlatMarginBorder
RadioButton.icon=com.formdev.flatlaf.icons.FlatRadioButtonIcon
RadioButton.icon.centerDiameter=8
RadioButton.icon[filled].centerDiameter=5
RadioButton.margin=2,2,2,2
RadioButton.iconTextGap=4
RadioButton.rollover=true
@@ -522,6 +544,7 @@ TabbedPane.tabAreaInsets=0,0,0,0
TabbedPane.selectedTabPadInsets=0,0,0,0
TabbedPane.tabRunOverlay=0
TabbedPane.tabsOverlapBorder=true
TabbedPane.disabledForeground=@disabledText
TabbedPane.shadow=@background
TabbedPane.contentBorderInsets=null
@@ -544,6 +567,7 @@ Table.focusCellHighlightBorder=com.formdev.flatlaf.ui.FlatTableCellBorder$Focuse
Table.focusSelectedCellHighlightBorder=com.formdev.flatlaf.ui.FlatTableCellBorder$Selected
Table.focusCellBackground=@textComponentBackground
Table.focusCellForeground=@foreground
Table.background=@textComponentBackground
Table.selectionInactiveBackground=@selectionInactiveBackground
Table.selectionInactiveForeground=@selectionInactiveForeground
Table.dropCellBackground=@dropCellBackground
@@ -557,6 +581,7 @@ Table.dropLineShortColor=@dropLineShortColor
TableHeader.height=25
TableHeader.cellBorder=2,3,2,3
TableHeader.focusCellBackground=$TableHeader.background
TableHeader.background=@textComponentBackground
#---- TextArea ----
@@ -628,6 +653,7 @@ ToggleButton.rollover=true
ToggleButton.background=$Button.background
ToggleButton.pressedBackground=$Button.pressedBackground
ToggleButton.selectedForeground=@foreground
ToggleButton.toolbar.hoverBackground=$Button.toolbar.hoverBackground
ToggleButton.toolbar.pressedBackground=$Button.toolbar.pressedBackground
@@ -668,9 +694,11 @@ ToolTipManager.enableToolTipMode=activeApplication
Tree.border=1,1,1,1
Tree.editorBorder=1,1,1,1,@cellFocusColor
Tree.background=@textComponentBackground
Tree.selectionInactiveBackground=@selectionInactiveBackground
Tree.selectionInactiveForeground=@selectionInactiveForeground
Tree.textBackground=$Tree.background
Tree.textForeground=$Tree.foreground
Tree.selectionBorderColor=@cellFocusColor
Tree.dropCellBackground=@dropCellBackground
Tree.dropCellForeground=@dropCellForeground

View File

@@ -21,18 +21,20 @@
#---- variables ----
@background=#f2f2f2
@foreground=#000000
@foreground=#000
@selectionBackground=#2675BF
@selectionForeground=#ffffff
@selectionForeground=#fff
@selectionInactiveBackground=#d4d4d4
@selectionInactiveForeground=@foreground
@disabledText=#8C8C8C
@textComponentBackground=#ffffff
@textComponentBackground=#fff
@menuBackground=#fff
@menuHoverBackground=darken(@menuBackground,10%,derived)
@menuCheckBackground=darken(@menuBackground,10%,derived)
@menuCheckHoverBackground=darken(@menuBackground,20%,derived)
@cellFocusColor=#000000
@menuAcceleratorForeground=lighten(@foreground,30%)
@menuAcceleratorSelectionForeground=@selectionForeground
@cellFocusColor=#000
@icon=#afafaf
# Drop (use lazy colors for IntelliJ platform themes, which usually do not specify these colors)
@@ -42,24 +44,6 @@
@dropLineShortColor=darken(List.selectionBackground,20%,lazy)
#---- globals ----
*.background=@background
*.foreground=@foreground
*.textBackground=#cccccc
*.textForeground=@foreground
*.caretForeground=@foreground
*.inactiveBackground=@background
*.inactiveForeground=@disabledText
*.selectionBackground=@selectionBackground
*.selectionForeground=@selectionForeground
*.disabledBackground=@background
*.disabledForeground=@disabledText
*.disabledText=@disabledText
*.acceleratorForeground=lighten(@foreground,30%)
*.acceleratorSelectionForeground=@selectionForeground
#---- system colors ----
activeCaption=#99b4d1
@@ -71,10 +55,13 @@ controlDkShadow=darken($controlShadow,15%)
#---- Button ----
Button.background=#ffffff
Button.background=#fff
Button.focusedBackground=#e3f1fa
Button.hoverBackground=darken($Button.background,3%,derived)
Button.pressedBackground=darken($Button.background,10%,derived)
Button.selectedBackground=darken($Button.background,20%,derived)
Button.selectedForeground=@foreground
Button.disabledSelectedBackground=darken($Button.background,13%,derived)
Button.borderColor=$Component.borderColor
Button.disabledBorderColor=$Component.disabledBorderColor
@@ -94,13 +81,14 @@ Button.default.borderWidth=2
Button.toolbar.hoverBackground=darken($Button.background,12%,derived)
Button.toolbar.pressedBackground=darken($Button.background,15%,derived)
Button.toolbar.selectedBackground=$Button.selectedBackground
#---- CheckBox ----
# enabled
CheckBox.icon.borderColor=#b0b0b0
CheckBox.icon.background=#FFFFFF
CheckBox.icon.background=#fff
CheckBox.icon.selectedBorderColor=$CheckBox.icon.borderColor
CheckBox.icon.selectedBackground=$CheckBox.icon.background
CheckBox.icon.checkmarkColor=#4F9EE3
@@ -126,7 +114,7 @@ CheckBox.icon.pressedBackground=$Button.pressedBackground
# enabled
CheckBox.icon[filled].selectedBorderColor=#4B97D9
CheckBox.icon[filled].selectedBackground=#4F9EE3
CheckBox.icon[filled].checkmarkColor=#FFFFFF
CheckBox.icon[filled].checkmarkColor=#fff
# focused
CheckBox.icon[filled].selectedFocusedBorderColor=#ACCFF7
CheckBox.icon[filled].selectedFocusedBackground=$CheckBox.icon[filled].selectedBackground
@@ -139,12 +127,10 @@ CheckBox.icon[filled].selectedPressedBackground=darken($CheckBox.icon[filled].se
#---- ComboBox ----
ComboBox.background=@textComponentBackground
ComboBox.buttonBackground=@textComponentBackground
ComboBox.buttonEditableBackground=#fafafa
ComboBox.buttonArrowColor=#666666
ComboBox.buttonArrowColor=#666
ComboBox.buttonDisabledArrowColor=#ABABAB
ComboBox.buttonHoverArrowColor=#999999
ComboBox.buttonHoverArrowColor=#999
#---- Component ----
@@ -199,21 +185,15 @@ InternalFrame.activeDropShadowOpacity=0.25
InternalFrame.inactiveDropShadowOpacity=0.5
#---- List ----
List.background=@textComponentBackground
#---- Menu ----
Menu.icon.arrowColor=#666666
Menu.icon.arrowColor=#666
Menu.icon.disabledArrowColor=#ABABAB
#---- MenuBar ----
MenuBar.borderColor=#cdcdcd
MenuBar.hoverBackground=@menuHoverBackground
#---- MenuItemCheckBox ----
@@ -246,11 +226,6 @@ ProgressBar.selectionForeground=@textComponentBackground
ProgressBar.selectionBackground=@foreground
#---- RadioButton ----
RadioButton.icon[filled].centerDiameter=5
#---- RootPane ----
RootPane.activeBorderColor=#707070
@@ -277,7 +252,7 @@ Separator.foreground=#d1d1d1
Slider.trackColor=#c4c4c4
Slider.thumbColor=#6e6e6e
Slider.tickColor=#888888
Slider.tickColor=#888
Slider.hoverColor=lighten($Slider.thumbColor,15%,derived)
Slider.disabledForeground=#c0c0c0
@@ -285,12 +260,11 @@ Slider.disabledForeground=#c0c0c0
#---- SplitPane ----
SplitPaneDivider.draggingColor=#c4c4c4
SplitPaneDivider.oneTouchHoverArrowColor=#333333
SplitPaneDivider.oneTouchHoverArrowColor=#333
#---- TabbedPane ----
TabbedPane.disabledForeground=@disabledText
TabbedPane.underlineColor=#4083C9
TabbedPane.disabledUnderlineColor=#ababab
TabbedPane.hoverColor=#d9d9d9
@@ -300,13 +274,11 @@ TabbedPane.contentAreaColor=#bfbfbf
#---- Table ----
Table.background=@textComponentBackground
Table.gridColor=darken($Table.background,3%)
#---- TableHeader ----
TableHeader.background=@textComponentBackground
TableHeader.separatorColor=darken($TableHeader.background,10%)
TableHeader.bottomSeparatorColor=$TableHeader.separatorColor
@@ -321,7 +293,6 @@ TitlePane.buttonPressedBackground=darken($TitlePane.background,20%,derived)
#---- ToggleButton ----
ToggleButton.selectedBackground=darken($ToggleButton.background,20%,derived)
ToggleButton.selectedForeground=@foreground
ToggleButton.disabledSelectedBackground=darken($ToggleButton.background,13%,derived)
ToggleButton.toolbar.selectedBackground=$ToggleButton.selectedBackground
@@ -335,5 +306,4 @@ ToolTip.background=#fafafa
#---- Tree ----
Tree.background=@textComponentBackground
Tree.hash=#E6E6E6

View File

@@ -16,6 +16,7 @@
package com.formdev.flatlaf.demo;
import java.awt.Component;
import javax.swing.*;
import javax.swing.text.DefaultEditorKit;
import net.miginfocom.swing.*;
@@ -114,14 +115,14 @@ class BasicComponentsPanel
JScrollPane scrollPane12 = new JScrollPane();
JTextPane textPane4 = new JTextPane();
JTextPane textPane5 = new JTextPane();
JLabel label3 = new JLabel();
JTextField textField5 = new JTextField();
JComboBox<String> comboBox7 = new JComboBox<>();
JSpinner spinner3 = new JSpinner();
JLabel label4 = new JLabel();
JTextField textField7 = new JTextField();
JComboBox<String> comboBox8 = new JComboBox<>();
JSpinner spinner4 = new JSpinner();
JLabel errorHintsLabel = new JLabel();
JTextField errorHintsTextField = new JTextField();
JComboBox<String> errorHintsComboBox = new JComboBox<>();
JSpinner errorHintsSpinner = new JSpinner();
JLabel warningHintsLabel = new JLabel();
JTextField warningHintsTextField = new JTextField();
JComboBox<String> warningHintsComboBox = new JComboBox<>();
JSpinner warningHintsSpinner = new JSpinner();
JPopupMenu popupMenu1 = new JPopupMenu();
JMenuItem cutMenuItem = new JMenuItem();
JMenuItem copyMenuItem = new JMenuItem();
@@ -129,12 +130,12 @@ class BasicComponentsPanel
//======== this ========
setLayout(new MigLayout(
"hidemode 3",
"insets dialog,hidemode 3",
// columns
"[]" +
"[]" +
"[]" +
"[]" +
"[sizegroup 1]" +
"[sizegroup 1]" +
"[sizegroup 1]" +
"[sizegroup 1]" +
"[]" +
"[]",
// rows
@@ -606,44 +607,44 @@ class BasicComponentsPanel
textPane5.setText("No scroll pane");
add(textPane5, "cell 5 11,growx");
//---- label3 ----
label3.setText("Error hints:");
add(label3, "cell 0 12");
//---- errorHintsLabel ----
errorHintsLabel.setText("Error hints:");
add(errorHintsLabel, "cell 0 12");
//---- textField5 ----
textField5.putClientProperty("JComponent.outline", "error");
add(textField5, "cell 1 12,growx");
//---- errorHintsTextField ----
errorHintsTextField.putClientProperty("JComponent.outline", "error");
add(errorHintsTextField, "cell 1 12,growx");
//---- comboBox7 ----
comboBox7.putClientProperty("JComponent.outline", "error");
comboBox7.setModel(new DefaultComboBoxModel<>(new String[] {
//---- errorHintsComboBox ----
errorHintsComboBox.putClientProperty("JComponent.outline", "error");
errorHintsComboBox.setModel(new DefaultComboBoxModel<>(new String[] {
"Editable"
}));
comboBox7.setEditable(true);
add(comboBox7, "cell 2 12,growx");
errorHintsComboBox.setEditable(true);
add(errorHintsComboBox, "cell 2 12,growx");
//---- spinner3 ----
spinner3.putClientProperty("JComponent.outline", "error");
add(spinner3, "cell 3 12,growx");
//---- errorHintsSpinner ----
errorHintsSpinner.putClientProperty("JComponent.outline", "error");
add(errorHintsSpinner, "cell 3 12,growx");
//---- label4 ----
label4.setText("Warning hints:");
add(label4, "cell 0 13");
//---- warningHintsLabel ----
warningHintsLabel.setText("Warning hints:");
add(warningHintsLabel, "cell 0 13");
//---- textField7 ----
textField7.putClientProperty("JComponent.outline", "warning");
add(textField7, "cell 1 13,growx");
//---- warningHintsTextField ----
warningHintsTextField.putClientProperty("JComponent.outline", "warning");
add(warningHintsTextField, "cell 1 13,growx");
//---- comboBox8 ----
comboBox8.putClientProperty("JComponent.outline", "warning");
comboBox8.setModel(new DefaultComboBoxModel<>(new String[] {
//---- warningHintsComboBox ----
warningHintsComboBox.putClientProperty("JComponent.outline", "warning");
warningHintsComboBox.setModel(new DefaultComboBoxModel<>(new String[] {
"Not editable"
}));
add(comboBox8, "cell 2 13,growx");
add(warningHintsComboBox, "cell 2 13,growx");
//---- spinner4 ----
spinner4.putClientProperty("JComponent.outline", "warning");
add(spinner4, "cell 3 13,growx");
//---- warningHintsSpinner ----
warningHintsSpinner.putClientProperty("JComponent.outline", "warning");
add(warningHintsSpinner, "cell 3 13,growx");
//======== popupMenu1 ========
{
@@ -668,6 +669,33 @@ class BasicComponentsPanel
cutMenuItem.addActionListener( new DefaultEditorKit.CutAction() );
copyMenuItem.addActionListener( new DefaultEditorKit.CopyAction() );
pasteMenuItem.addActionListener( new DefaultEditorKit.PasteAction() );
if( FlatLafDemo.screenshotsMode ) {
Component[] components = {
button13, button14, button15, button16, comboBox5, comboBox6,
textField6, passwordField5,
formattedTextFieldLabel, formattedTextField1, formattedTextField2, formattedTextField3, formattedTextField4, formattedTextField5,
textAreaLabel, scrollPane1, scrollPane2, scrollPane3, scrollPane4, textArea5,
editorPaneLabel, scrollPane5, scrollPane6, scrollPane7, scrollPane8, editorPane5,
textPaneLabel, scrollPane9, scrollPane10, scrollPane11, scrollPane12, textPane5,
errorHintsLabel, errorHintsTextField, errorHintsComboBox, errorHintsSpinner,
warningHintsLabel, warningHintsTextField, warningHintsComboBox, warningHintsSpinner,
};
for( Component c : components )
c.setVisible( false );
// move password fields one row up
Component[] formattedTextFields = { formattedTextFieldLabel, formattedTextField1, formattedTextField2, formattedTextField3, formattedTextField4 };
Component[] passwordFields = { passwordFieldLabel, passwordField1, passwordField2, passwordField3, passwordField4 };
MigLayout layout = (MigLayout) getLayout();
for( int i = 0; i < passwordFields.length; i++ ) {
Object cons = layout.getComponentConstraints( formattedTextFields[i] );
layout.setComponentConstraints( passwordFields[i], cons );
}
}
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables

View File

@@ -7,8 +7,8 @@ new FormModel {
"JavaCodeGenerator.defaultVariableLocal": true
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3"
"$columnConstraints": "[][][][][][]"
"$layoutConstraints": "insets dialog,hidemode 3"
"$columnConstraints": "[sizegroup 1][sizegroup 1][sizegroup 1][sizegroup 1][][]"
"$rowConstraints": "[][][][][][][][][][][][]para[][]"
} ) {
name: "this"
@@ -592,19 +592,19 @@ new FormModel {
"value": "cell 5 11,growx"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label3"
name: "errorHintsLabel"
"text": "Error hints:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 12"
} )
add( new FormComponent( "javax.swing.JTextField" ) {
name: "textField5"
name: "errorHintsTextField"
"$client.JComponent.outline": "error"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 12,growx"
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox7"
name: "errorHintsComboBox"
"$client.JComponent.outline": "error"
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "Editable"
@@ -615,25 +615,25 @@ new FormModel {
"value": "cell 2 12,growx"
} )
add( new FormComponent( "javax.swing.JSpinner" ) {
name: "spinner3"
name: "errorHintsSpinner"
"$client.JComponent.outline": "error"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 3 12,growx"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label4"
name: "warningHintsLabel"
"text": "Warning hints:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 13"
} )
add( new FormComponent( "javax.swing.JTextField" ) {
name: "textField7"
name: "warningHintsTextField"
"$client.JComponent.outline": "warning"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 13,growx"
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox8"
name: "warningHintsComboBox"
"$client.JComponent.outline": "warning"
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "Not editable"
@@ -643,7 +643,7 @@ new FormModel {
"value": "cell 2 13,growx"
} )
add( new FormComponent( "javax.swing.JSpinner" ) {
name: "spinner4"
name: "warningHintsSpinner"
"$client.JComponent.outline": "warning"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 3 13,growx"

View File

@@ -30,6 +30,9 @@ import com.formdev.flatlaf.*;
import com.formdev.flatlaf.extras.FlatAnimatedLafChange;
import com.formdev.flatlaf.util.SystemInfo;
import com.formdev.flatlaf.util.UIScale;
import net.miginfocom.layout.ConstraintParser;
import net.miginfocom.layout.LC;
import net.miginfocom.layout.UnitValue;
import net.miginfocom.swing.*;
/**
@@ -44,6 +47,18 @@ class ControlBar
ControlBar() {
initComponents();
// remove top insets
MigLayout layout = (MigLayout) getLayout();
LC lc = ConstraintParser.parseLayoutConstraint( (String) layout.getLayoutConstraints() );
UnitValue[] insets = lc.getInsets();
lc.setInsets( new UnitValue[] {
new UnitValue( 0, UnitValue.PIXEL, null ),
insets[1],
insets[2],
insets[3]
} );
layout.setLayoutConstraints( lc );
// initialize look and feels combo box
DefaultComboBoxModel<LookAndFeelInfo> lafModel = new DefaultComboBoxModel<>();
lafModel.addElement( new LookAndFeelInfo( "Flat Light (F1)", FlatLightLaf.class.getName() ) );

View File

@@ -16,6 +16,9 @@
package com.formdev.flatlaf.demo;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
@@ -64,6 +67,41 @@ class DataComponentsPanel
}
}
private void rowSelectionChanged() {
table1.setRowSelectionAllowed( rowSelectionCheckBox.isSelected() );
}
private void columnSelectionChanged() {
table1.setColumnSelectionAllowed( columnSelectionCheckBox.isSelected() );
}
private void showHorizontalLinesChanged() {
table1.setShowHorizontalLines( showHorizontalLinesCheckBox.isSelected() );
}
private void showVerticalLinesChanged() {
table1.setShowVerticalLines( showVerticalLinesCheckBox.isSelected() );
}
private void intercellSpacingChanged() {
table1.setIntercellSpacing( intercellSpacingCheckBox.isSelected() ? new Dimension( 1, 1 ) : new Dimension() );
}
private void redGridColorChanged() {
table1.setGridColor( redGridColorCheckBox.isSelected() ? Color.red : UIManager.getColor( "Table.gridColor" ) );
}
@Override
public void updateUI() {
super.updateUI();
EventQueue.invokeLater( () -> {
showHorizontalLinesChanged();
showVerticalLinesChanged();
intercellSpacingChanged();
} );
}
@SuppressWarnings( { "unchecked", "rawtypes" } )
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
@@ -80,6 +118,13 @@ class DataComponentsPanel
JLabel tableLabel = new JLabel();
JScrollPane scrollPane5 = new JScrollPane();
table1 = new JTable();
JPanel tableOptionsPanel = new JPanel();
showHorizontalLinesCheckBox = new JCheckBox();
showVerticalLinesCheckBox = new JCheckBox();
intercellSpacingCheckBox = new JCheckBox();
redGridColorCheckBox = new JCheckBox();
rowSelectionCheckBox = new JCheckBox();
columnSelectionCheckBox = new JCheckBox();
dndCheckBox = new JCheckBox();
JPopupMenu popupMenu2 = new JPopupMenu();
JMenuItem menuItem3 = new JMenuItem();
@@ -89,20 +134,20 @@ class DataComponentsPanel
//======== this ========
setLayout(new MigLayout(
"hidemode 3",
"insets dialog,hidemode 3",
// columns
"[]" +
"[200]" +
"[200]",
"[200,fill]" +
"[200,fill]" +
"[fill]",
// rows
"[]" +
"[::200]" +
"[::150]" +
"[]"));
"[150,grow,sizegroup 1,fill]" +
"[150,grow,sizegroup 1,fill]" +
"[150,grow,sizegroup 1,fill]"));
//---- listLabel ----
listLabel.setText("JList:");
add(listLabel, "cell 0 0");
add(listLabel, "cell 0 0,aligny top,growy 0");
//======== scrollPane1 ========
{
@@ -134,7 +179,7 @@ class DataComponentsPanel
list1.setComponentPopupMenu(popupMenu2);
scrollPane1.setViewportView(list1);
}
add(scrollPane1, "cell 1 0,growx");
add(scrollPane1, "cell 1 0");
//======== scrollPane2 ========
{
@@ -166,11 +211,11 @@ class DataComponentsPanel
list2.setEnabled(false);
scrollPane2.setViewportView(list2);
}
add(scrollPane2, "cell 2 0,growx");
add(scrollPane2, "cell 2 0");
//---- treeLabel ----
treeLabel.setText("JTree:");
add(treeLabel, "cell 0 1");
add(treeLabel, "cell 0 1,aligny top,growy 0");
//======== scrollPane3 ========
{
@@ -207,7 +252,7 @@ class DataComponentsPanel
tree1.setComponentPopupMenu(popupMenu2);
scrollPane3.setViewportView(tree1);
}
add(scrollPane3, "cell 1 1,growx");
add(scrollPane3, "cell 1 1");
//======== scrollPane4 ========
{
@@ -216,11 +261,11 @@ class DataComponentsPanel
tree2.setEnabled(false);
scrollPane4.setViewportView(tree2);
}
add(scrollPane4, "cell 2 1,growx");
add(scrollPane4, "cell 2 1");
//---- tableLabel ----
tableLabel.setText("JTable:");
add(tableLabel, "cell 0 2");
add(tableLabel, "cell 0 2,aligny top,growy 0");
//======== scrollPane5 ========
{
@@ -297,13 +342,61 @@ class DataComponentsPanel
table1.setComponentPopupMenu(popupMenu2);
scrollPane5.setViewportView(table1);
}
add(scrollPane5, "cell 1 2 2 1,growx,width 300");
add(scrollPane5, "cell 1 2 2 1,width 300");
//---- dndCheckBox ----
dndCheckBox.setText("enable drag and drop");
dndCheckBox.setMnemonic('D');
dndCheckBox.addActionListener(e -> dndChanged());
add(dndCheckBox, "cell 0 3 3 1");
//======== tableOptionsPanel ========
{
tableOptionsPanel.setLayout(new MigLayout(
"insets 0,hidemode 3",
// columns
"[]",
// rows
"[]0" +
"[]0" +
"[]0" +
"[]0" +
"[]0" +
"[]0" +
"[]0"));
//---- showHorizontalLinesCheckBox ----
showHorizontalLinesCheckBox.setText("show horizontal lines");
showHorizontalLinesCheckBox.addActionListener(e -> showHorizontalLinesChanged());
tableOptionsPanel.add(showHorizontalLinesCheckBox, "cell 0 0");
//---- showVerticalLinesCheckBox ----
showVerticalLinesCheckBox.setText("show vertical lines");
showVerticalLinesCheckBox.addActionListener(e -> showVerticalLinesChanged());
tableOptionsPanel.add(showVerticalLinesCheckBox, "cell 0 1");
//---- intercellSpacingCheckBox ----
intercellSpacingCheckBox.setText("intercell spacing");
intercellSpacingCheckBox.addActionListener(e -> intercellSpacingChanged());
tableOptionsPanel.add(intercellSpacingCheckBox, "cell 0 2");
//---- redGridColorCheckBox ----
redGridColorCheckBox.setText("red grid color");
redGridColorCheckBox.addActionListener(e -> redGridColorChanged());
tableOptionsPanel.add(redGridColorCheckBox, "cell 0 3");
//---- rowSelectionCheckBox ----
rowSelectionCheckBox.setText("row selection");
rowSelectionCheckBox.setSelected(true);
rowSelectionCheckBox.addActionListener(e -> rowSelectionChanged());
tableOptionsPanel.add(rowSelectionCheckBox, "cell 0 4");
//---- columnSelectionCheckBox ----
columnSelectionCheckBox.setText("column selection");
columnSelectionCheckBox.addActionListener(e -> columnSelectionChanged());
tableOptionsPanel.add(columnSelectionCheckBox, "cell 0 5");
//---- dndCheckBox ----
dndCheckBox.setText("enable drag and drop");
dndCheckBox.setMnemonic('D');
dndCheckBox.addActionListener(e -> dndChanged());
tableOptionsPanel.add(dndCheckBox, "cell 0 6");
}
add(tableOptionsPanel, "cell 3 2");
//======== popupMenu2 ========
{
@@ -336,6 +429,12 @@ class DataComponentsPanel
private JTree tree1;
private JTree tree2;
private JTable table1;
private JCheckBox showHorizontalLinesCheckBox;
private JCheckBox showVerticalLinesCheckBox;
private JCheckBox intercellSpacingCheckBox;
private JCheckBox redGridColorCheckBox;
private JCheckBox rowSelectionCheckBox;
private JCheckBox columnSelectionCheckBox;
private JCheckBox dndCheckBox;
// JFormDesigner - End of variables declaration //GEN-END:variables

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.1.0.272" Java: "13.0.2" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -7,16 +7,16 @@ new FormModel {
"JavaCodeGenerator.defaultVariableLocal": true
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3"
"$columnConstraints": "[][200][200]"
"$rowConstraints": "[][::200][::150][]"
"$layoutConstraints": "insets dialog,hidemode 3"
"$columnConstraints": "[][200,fill][200,fill][fill]"
"$rowConstraints": "[150,grow,sizegroup 1,fill][150,grow,sizegroup 1,fill][150,grow,sizegroup 1,fill]"
} ) {
name: "this"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "listLabel"
"text": "JList:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
"value": "cell 0 0,aligny top,growy 0"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane1"
@@ -46,7 +46,7 @@ new FormModel {
}
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0,growx"
"value": "cell 1 0"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane2"
@@ -76,13 +76,13 @@ new FormModel {
}
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 0,growx"
"value": "cell 2 0"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "treeLabel"
"text": "JTree:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 1"
"value": "cell 0 1,aligny top,growy 0"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane3"
@@ -150,7 +150,7 @@ new FormModel {
}
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 1,growx"
"value": "cell 1 1"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane4"
@@ -162,13 +162,13 @@ new FormModel {
}
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 1,growx"
"value": "cell 2 1"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "tableLabel"
"text": "JTable:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2"
"value": "cell 0 2,aligny top,growy 0"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane5"
@@ -307,22 +307,92 @@ new FormModel {
}
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 2 2 1,growx,width 300"
"value": "cell 1 2 2 1,width 300"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "dndCheckBox"
"text": "enable drag and drop"
"mnemonic": 68
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "dndChanged", false ) )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "insets 0,hidemode 3"
"$columnConstraints": "[]"
"$rowConstraints": "[]0[]0[]0[]0[]0[]0[]0"
} ) {
name: "tableOptionsPanel"
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "showHorizontalLinesCheckBox"
"text": "show horizontal lines"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "showHorizontalLinesChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "showVerticalLinesCheckBox"
"text": "show vertical lines"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "showVerticalLinesChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "intercellSpacingCheckBox"
"text": "intercell spacing"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "intercellSpacingChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "redGridColorCheckBox"
"text": "red grid color"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "redGridColorChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 3"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "rowSelectionCheckBox"
"text": "row selection"
"selected": true
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "rowSelectionChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 4"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "columnSelectionCheckBox"
"text": "column selection"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "columnSelectionChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 5"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "dndCheckBox"
"text": "enable drag and drop"
"mnemonic": 68
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "dndChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 6"
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 3 3 1"
"value": "cell 3 2"
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 790, 715 )
"size": new java.awt.Dimension( 790, 745 )
} )
add( new FormContainer( "javax.swing.JPopupMenu", new FormLayoutManager( class javax.swing.JPopupMenu ) ) {
name: "popupMenu2"
@@ -346,7 +416,7 @@ new FormModel {
"text": "Noop Action"
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 740 )
"location": new java.awt.Point( 0, 800 )
} )
}
}

View File

@@ -20,17 +20,23 @@ import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.prefs.Preferences;
import javax.swing.*;
import javax.swing.text.DefaultEditorKit;
import javax.swing.text.StyleContext;
import com.formdev.flatlaf.FlatClientProperties;
import com.formdev.flatlaf.FlatLaf;
import com.formdev.flatlaf.demo.HintManager.Hint;
import com.formdev.flatlaf.demo.extras.*;
import com.formdev.flatlaf.demo.intellijthemes.*;
import com.formdev.flatlaf.extras.FlatAnimatedLafChange;
import com.formdev.flatlaf.extras.FlatSVGIcon;
import com.formdev.flatlaf.extras.FlatUIDefaultsInspector;
import com.formdev.flatlaf.extras.SVGUtils;
import com.formdev.flatlaf.ui.JBRCustomDecorations;
import net.miginfocom.layout.ConstraintParser;
import net.miginfocom.layout.LC;
import net.miginfocom.layout.UnitValue;
import net.miginfocom.swing.*;
/**
@@ -57,6 +63,61 @@ class DemoFrame
if( tabIndex >= 0 && tabIndex < tabbedPane.getTabCount() && tabIndex != tabbedPane.getSelectedIndex() )
tabbedPane.setSelectedIndex( tabIndex );
SwingUtilities.invokeLater( () -> {
showHints();
} );
}
@Override
public void dispose() {
super.dispose();
FlatUIDefaultsInspector.hide();
}
private void showHints() {
Hint fontMenuHint = new Hint(
"Use 'Font' menu to increase/decrease font size or try different fonts.",
fontMenu, SwingConstants.BOTTOM, "hint.fontMenu", null );
Hint optionsMenuHint = new Hint(
"Use 'Options' menu to try out various FlatLaf options.",
optionsMenu, SwingConstants.BOTTOM, "hint.optionsMenu", fontMenuHint );
Hint themesHint = new Hint(
"Use 'Themes' list to try out various themes.",
themesPanel, SwingConstants.LEFT, "hint.themesPanel", optionsMenuHint );
HintManager.showHint( themesHint );
}
private void clearHints() {
HintManager.hideAllHints();
Preferences state = DemoPrefs.getState();
state.remove( "hint.fontMenu" );
state.remove( "hint.optionsMenu" );
state.remove( "hint.themesPanel" );
}
private void showUIDefaultsInspector() {
FlatUIDefaultsInspector.show();
}
private void newActionPerformed() {
NewDialog newDialog = new NewDialog( this );
newDialog.setVisible( true );
}
private void openActionPerformed() {
JFileChooser chooser = new JFileChooser();
chooser.showOpenDialog( this );
}
private void saveAsActionPerformed() {
JFileChooser chooser = new JFileChooser();
chooser.showSaveDialog( this );
}
private void exitActionPerformed() {
@@ -110,6 +171,11 @@ class DemoFrame
System.setProperty( "flatlaf.animatedLafChange", String.valueOf( animatedLafChangeMenuItem.isSelected() ) );
}
private void showHintsChanged() {
clearHints();
showHints();
}
private void fontFamilyChanged( ActionEvent e ) {
String fontFamily = e.getActionCommand();
@@ -224,6 +290,7 @@ class DemoFrame
JMenu fileMenu = new JMenu();
JMenuItem newMenuItem = new JMenuItem();
JMenuItem openMenuItem = new JMenuItem();
JMenuItem saveAsMenuItem = new JMenuItem();
JMenuItem closeMenuItem = new JMenuItem();
JMenuItem exitMenuItem = new JMenuItem();
JMenu editMenu = new JMenu();
@@ -243,6 +310,7 @@ class DemoFrame
JMenuItem projectViewMenuItem = new JMenuItem();
JMenuItem structureViewMenuItem = new JMenuItem();
JMenuItem propertiesViewMenuItem = new JMenuItem();
JMenuItem menuItem2 = new JMenuItem();
JMenuItem menuItem1 = new JMenuItem();
JRadioButtonMenuItem radioButtonMenuItem1 = new JRadioButtonMenuItem();
JRadioButtonMenuItem radioButtonMenuItem2 = new JRadioButtonMenuItem();
@@ -251,12 +319,14 @@ class DemoFrame
JMenuItem restoreFontMenuItem = new JMenuItem();
JMenuItem incrFontMenuItem = new JMenuItem();
JMenuItem decrFontMenuItem = new JMenuItem();
JMenu optionsMenu = new JMenu();
optionsMenu = new JMenu();
windowDecorationsCheckBoxMenuItem = new JCheckBoxMenuItem();
menuBarEmbeddedCheckBoxMenuItem = new JCheckBoxMenuItem();
underlineMenuSelectionMenuItem = new JCheckBoxMenuItem();
alwaysShowMnemonicsMenuItem = new JCheckBoxMenuItem();
animatedLafChangeMenuItem = new JCheckBoxMenuItem();
JMenuItem showHintsMenuItem = new JMenuItem();
JMenuItem showUIDefaultsInspectorMenuItem = new JMenuItem();
JMenu helpMenu = new JMenu();
JMenuItem aboutMenuItem = new JMenuItem();
JToolBar toolBar1 = new JToolBar();
@@ -276,7 +346,7 @@ class DemoFrame
OptionPanePanel optionPanePanel = new OptionPanePanel();
ExtrasPanel extrasPanel1 = new ExtrasPanel();
controlBar = new ControlBar();
IJThemesPanel themesPanel = new IJThemesPanel();
themesPanel = new IJThemesPanel();
//======== this ========
setTitle("FlatLaf Demo");
@@ -296,15 +366,22 @@ class DemoFrame
newMenuItem.setText("New");
newMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
newMenuItem.setMnemonic('N');
newMenuItem.addActionListener(e -> menuItemActionPerformed(e));
newMenuItem.addActionListener(e -> newActionPerformed());
fileMenu.add(newMenuItem);
//---- openMenuItem ----
openMenuItem.setText("Open");
openMenuItem.setText("Open...");
openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
openMenuItem.setMnemonic('O');
openMenuItem.addActionListener(e -> menuItemActionPerformed(e));
openMenuItem.addActionListener(e -> openActionPerformed());
fileMenu.add(openMenuItem);
//---- saveAsMenuItem ----
saveAsMenuItem.setText("Save As...");
saveAsMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
saveAsMenuItem.setMnemonic('S');
saveAsMenuItem.addActionListener(e -> saveAsActionPerformed());
fileMenu.add(saveAsMenuItem);
fileMenu.addSeparator();
//---- closeMenuItem ----
@@ -435,6 +512,11 @@ class DemoFrame
}
viewMenu.add(menu1);
//---- menuItem2 ----
menuItem2.setText("Disabled Item");
menuItem2.setEnabled(false);
viewMenu.add(menuItem2);
//---- menuItem1 ----
menuItem1.setText("<html>some <b color=\"red\">HTML</b> <i color=\"blue\">text</i></html>");
viewMenu.add(menuItem1);
@@ -516,6 +598,16 @@ class DemoFrame
animatedLafChangeMenuItem.setSelected(true);
animatedLafChangeMenuItem.addActionListener(e -> animatedLafChangeChanged());
optionsMenu.add(animatedLafChangeMenuItem);
//---- showHintsMenuItem ----
showHintsMenuItem.setText("Show hints");
showHintsMenuItem.addActionListener(e -> showHintsChanged());
optionsMenu.add(showHintsMenuItem);
//---- showUIDefaultsInspectorMenuItem ----
showUIDefaultsInspectorMenuItem.setText("Show UI Defaults Inspector");
showUIDefaultsInspectorMenuItem.addActionListener(e -> showUIDefaultsInspector());
optionsMenu.add(showUIDefaultsInspectorMenuItem);
}
menuBar1.add(optionsMenu);
@@ -627,10 +719,23 @@ class DemoFrame
.getSupportsWindowDecorations() || JBRCustomDecorations.isSupported();
windowDecorationsCheckBoxMenuItem.setEnabled( supportsWindowDecorations && !JBRCustomDecorations.isSupported() );
menuBarEmbeddedCheckBoxMenuItem.setEnabled( supportsWindowDecorations );
// remove contentPanel bottom insets
MigLayout layout = (MigLayout) contentPanel.getLayout();
LC lc = ConstraintParser.parseLayoutConstraint( (String) layout.getLayoutConstraints() );
UnitValue[] insets = lc.getInsets();
lc.setInsets( new UnitValue[] {
insets[0],
insets[1],
new UnitValue( 0, UnitValue.PIXEL, null ),
insets[3]
} );
layout.setLayoutConstraints( lc );
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JMenu fontMenu;
private JMenu optionsMenu;
private JCheckBoxMenuItem windowDecorationsCheckBoxMenuItem;
private JCheckBoxMenuItem menuBarEmbeddedCheckBoxMenuItem;
private JCheckBoxMenuItem underlineMenuSelectionMenuItem;
@@ -638,5 +743,6 @@ class DemoFrame
private JCheckBoxMenuItem animatedLafChangeMenuItem;
private JTabbedPane tabbedPane;
private ControlBar controlBar;
private IJThemesPanel themesPanel;
// JFormDesigner - End of variables declaration //GEN-END:variables
}

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.2.0.298" Java: "14.0.2" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -114,6 +114,9 @@ new FormModel {
} )
add( new FormComponent( "com.formdev.flatlaf.demo.intellijthemes.IJThemesPanel" ) {
name: "themesPanel"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "East"
} )
@@ -128,14 +131,21 @@ new FormModel {
"text": "New"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 78, 4226, false )
"mnemonic": 78
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "newActionPerformed", false ) )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "openMenuItem"
"text": "Open"
"text": "Open..."
"accelerator": static javax.swing.KeyStroke getKeyStroke( 79, 4226, false )
"mnemonic": 79
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "openActionPerformed", false ) )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "saveAsMenuItem"
"text": "Save As..."
"accelerator": static javax.swing.KeyStroke getKeyStroke( 83, 4226, false )
"mnemonic": 83
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "saveAsActionPerformed", false ) )
} )
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
name: "separator2"
@@ -264,6 +274,11 @@ new FormModel {
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "menuItemActionPerformed", true ) )
} )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem2"
"text": "Disabled Item"
"enabled": false
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem1"
"text": "<html>some <b color=\"red\">HTML</b> <i color=\"blue\">text</i></html>"
@@ -322,6 +337,9 @@ new FormModel {
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "optionsMenu"
"text": "Options"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
add( new FormComponent( "javax.swing.JCheckBoxMenuItem" ) {
name: "windowDecorationsCheckBoxMenuItem"
"text": "Window decorations"
@@ -365,6 +383,16 @@ new FormModel {
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "animatedLafChangeChanged", false ) )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "showHintsMenuItem"
"text": "Show hints"
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "showHintsChanged", false ) )
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "showUIDefaultsInspectorMenuItem"
"text": "Show UI Defaults Inspector"
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "showUIDefaultsInspector", false ) )
} )
} )
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "helpMenu"

View File

@@ -16,10 +16,13 @@
package com.formdev.flatlaf.demo;
import java.awt.Dimension;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import com.formdev.flatlaf.FlatLaf;
import com.formdev.flatlaf.extras.FlatInspector;
import com.formdev.flatlaf.extras.FlatUIDefaultsInspector;
import com.formdev.flatlaf.util.SystemInfo;
/**
@@ -30,6 +33,8 @@ public class FlatLafDemo
static final String PREFS_ROOT_PATH = "/flatlaf-demo";
static final String KEY_TAB = "tab";
static boolean screenshotsMode = Boolean.parseBoolean( System.getProperty( "flatlaf.demo.screenshotsMode" ) );
public static void main( String[] args ) {
// on macOS enable screen menu bar
if( SystemInfo.isMacOS && System.getProperty( "apple.laf.useScreenMenuBar" ) == null )
@@ -42,15 +47,22 @@ public class FlatLafDemo
JFrame.setDefaultLookAndFeelDecorated( true );
JDialog.setDefaultLookAndFeelDecorated( true );
// application specific UI defaults
FlatLaf.registerCustomDefaultsSource( "com.formdev.flatlaf.demo" );
// set look and feel
DemoPrefs.initLaf( args );
// install inspector
// install inspectors
FlatInspector.install( "ctrl shift alt X" );
FlatUIDefaultsInspector.install( "ctrl shift alt Y" );
// create frame
DemoFrame frame = new DemoFrame();
if( FlatLafDemo.screenshotsMode )
frame.setPreferredSize( new Dimension( 1280, 620 ) );
// show frame
frame.pack();
frame.setLocationRelativeTo( null );

View File

@@ -0,0 +1,219 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.demo;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import com.formdev.flatlaf.ui.FlatDropShadowBorder;
import com.formdev.flatlaf.ui.FlatPopupMenuBorder;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.formdev.flatlaf.util.UIScale;
import net.miginfocom.swing.*;
/**
* @author Karl Tauber
*/
class HintManager
{
private static final List<HintPanel> hintPanels = new ArrayList<>();
static void showHint( Hint hint ) {
// check whether user already closed the hint
if( DemoPrefs.getState().getBoolean( hint.prefsKey, false ) ) {
if( hint.nextHint != null )
showHint( hint.nextHint );
return;
}
HintPanel hintPanel = new HintPanel( hint );
hintPanel.showHint();
hintPanels.add( hintPanel );
}
static void hideAllHints() {
HintPanel[] hintPanels2 = hintPanels.toArray( new HintPanel[hintPanels.size()] );
for( HintPanel hintPanel : hintPanels2 )
hintPanel.hideHint();
}
//---- class HintPanel ----------------------------------------------------
static class Hint
{
private final String message;
private final Component owner;
private final int position;
private final String prefsKey;
private final Hint nextHint;
Hint( String message, Component owner, int position, String prefsKey, Hint nextHint ) {
this.message = message;
this.owner = owner;
this.position = position;
this.prefsKey = prefsKey;
this.nextHint = nextHint;
}
}
//---- class HintPanel ----------------------------------------------------
private static class HintPanel
extends JPanel
{
private final Hint hint;
private JPanel popup;
private HintPanel( Hint hint ) {
this.hint = hint;
initComponents();
hintLabel.setText( "<html>" + hint.message + "</html>" );
// grab all mouse events to avoid that components overlapped
// by the hint panel receive them
addMouseListener( new MouseAdapter() {} );
}
@Override
public void updateUI() {
super.updateUI();
setBackground( UIManager.getColor( "HintPanel.backgroundColor" ) );
setBorder( new FlatPopupMenuBorder() );
}
void showHint() {
JRootPane rootPane = SwingUtilities.getRootPane( hint.owner );
if( rootPane == null )
return;
JLayeredPane layeredPane = rootPane.getLayeredPane();
// create a popup panel that has a drop shadow
popup = new JPanel( new BorderLayout() ) {
@Override
public void updateUI() {
super.updateUI();
setBorder( new FlatDropShadowBorder(
UIManager.getColor( "Popup.dropShadowColor" ),
UIManager.getInsets( "Popup.dropShadowInsets" ),
FlatUIUtils.getUIFloat( "Popup.dropShadowOpacity", 0.5f ) ) );
// use invokeLater because at this time the UI delegates
// of child components are not yet updated
EventQueue.invokeLater( () -> {
validate();
setSize( getPreferredSize() );
} );
}
};
popup.setOpaque( false );
popup.add( this );
// calculate x/y location for hint popup
Point pt = SwingUtilities.convertPoint( hint.owner, 0, 0, layeredPane );
int x = pt.x;
int y = pt.y;
Dimension size = popup.getPreferredSize();
int gap = UIScale.scale( 6 );
switch( hint.position ) {
case SwingConstants.LEFT:
x -= size.width + gap;
break;
case SwingConstants.TOP:
y -= size.height + gap;
break;
case SwingConstants.RIGHT:
x += hint.owner.getWidth() + gap;
break;
case SwingConstants.BOTTOM:
y += hint.owner.getHeight() + gap;
break;
}
// set hint popup size and show it
popup.setBounds( x, y, size.width, size.height );
layeredPane.add( popup, JLayeredPane.POPUP_LAYER );
}
void hideHint() {
if( popup != null ) {
Container parent = popup.getParent();
if( parent != null ) {
parent.remove( popup );
parent.repaint( popup.getX(), popup.getY(), popup.getWidth(), popup.getHeight() );
}
}
hintPanels.remove( this );
}
private void gotIt() {
// hide hint
hideHint();
// remember that user closed the hint
DemoPrefs.getState().putBoolean( hint.prefsKey, true );
// show next hint (if any)
if( hint.nextHint != null )
HintManager.showHint( hint.nextHint );
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
hintLabel = new JLabel();
gotItButton = new JButton();
//======== this ========
setLayout(new MigLayout(
"insets dialog,hidemode 3",
// columns
"[::200,fill]",
// rows
"[]para" +
"[]"));
//---- hintLabel ----
hintLabel.setText("hint");
add(hintLabel, "cell 0 0");
//---- gotItButton ----
gotItButton.setText("Got it!");
gotItButton.setFocusable(false);
gotItButton.addActionListener(e -> gotIt());
add(gotItButton, "cell 0 1,alignx right,growx 0");
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JLabel hintLabel;
private JButton gotItButton;
// JFormDesigner - End of variables declaration //GEN-END:variables
}
}

View File

@@ -0,0 +1,34 @@
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
root: new FormRoot {
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "insets dialog,hidemode 3"
"$columnConstraints": "[::200,fill]"
"$rowConstraints": "[]para[]"
} ) {
name: "panel"
auxiliary() {
"JavaCodeGenerator.className": "HintPanel"
}
add( new FormComponent( "javax.swing.JLabel" ) {
name: "hintLabel"
"text": "hint"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "gotItButton"
"text": "Got it!"
"focusable": false
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "gotIt", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 1,alignx right,growx 0"
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 400, 300 )
} )
}
}

View File

@@ -59,7 +59,6 @@ class MoreComponentsPanel
JSeparator separator2 = new JSeparator();
JSlider slider2 = new JSlider();
JSlider slider4 = new JSlider();
JScrollPane scrollPane14 = new JScrollPane();
progressBar3 = new JProgressBar();
progressBar4 = new JProgressBar();
JToolBar toolBar2 = new JToolBar();
@@ -67,11 +66,12 @@ class MoreComponentsPanel
JButton button10 = new JButton();
JButton button11 = new JButton();
JToggleButton toggleButton7 = new JToggleButton();
JPanel panel2 = new JPanel();
JLabel scrollBarLabel = new JLabel();
JScrollBar scrollBar1 = new JScrollBar();
JLabel label4 = new JLabel();
JScrollBar scrollBar4 = new JScrollBar();
JPanel panel3 = new JPanel();
JLabel label4 = new JLabel();
JLabel label3 = new JLabel();
JScrollPane scrollPane15 = new JScrollPane();
JEditorPane editorPane6 = new JEditorPane();
@@ -81,7 +81,6 @@ class MoreComponentsPanel
JScrollBar scrollBar6 = new JScrollBar();
JLabel separatorLabel = new JLabel();
JSeparator separator1 = new JSeparator();
JPanel panel2 = new JPanel();
JLabel sliderLabel = new JLabel();
JSlider slider1 = new JSlider();
JSlider slider6 = new JSlider();
@@ -105,13 +104,12 @@ class MoreComponentsPanel
//======== this ========
setLayout(new MigLayout(
"hidemode 3",
"insets dialog,hidemode 3",
// columns
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]",
// rows
"[]" +
@@ -142,7 +140,7 @@ class MoreComponentsPanel
}
scrollPane13.setViewportView(panel1);
}
add(scrollPane13, "cell 1 0,grow,width 70,height 70");
add(scrollPane13, "cell 1 0,grow,width 70,height 40");
add(scrollBar2, "cell 2 0 1 6,growy");
//---- scrollBar3 ----
@@ -165,7 +163,7 @@ class MoreComponentsPanel
//---- slider2 ----
slider2.setOrientation(SwingConstants.VERTICAL);
slider2.setValue(30);
add(slider2, "cell 2 0 1 6,growy");
add(slider2, "cell 2 0 1 6,growy,height 100");
//---- slider4 ----
slider4.setMinorTickSpacing(10);
@@ -174,19 +172,18 @@ class MoreComponentsPanel
slider4.setPaintLabels(true);
slider4.setOrientation(SwingConstants.VERTICAL);
slider4.setValue(30);
add(slider4, "cell 2 0 1 6,growy");
add(scrollPane14, "cell 3 0,grow");
add(slider4, "cell 2 0 1 6,growy,height 100");
//---- progressBar3 ----
progressBar3.setOrientation(SwingConstants.VERTICAL);
progressBar3.setValue(60);
add(progressBar3, "cell 4 0 1 6,growy");
add(progressBar3, "cell 2 0 1 6,growy");
//---- progressBar4 ----
progressBar4.setOrientation(SwingConstants.VERTICAL);
progressBar4.setValue(60);
progressBar4.setStringPainted(true);
add(progressBar4, "cell 4 0 1 6,growy");
add(progressBar4, "cell 2 0 1 6,growy");
//======== toolBar2 ========
{
@@ -209,7 +206,14 @@ class MoreComponentsPanel
toggleButton7.setIcon(UIManager.getIcon("Tree.closedIcon"));
toolBar2.add(toggleButton7);
}
add(toolBar2, "cell 4 0 1 6,growy");
add(toolBar2, "cell 2 0 1 6,growy");
//======== panel2 ========
{
panel2.setBorder(new TitledBorder("TitledBorder"));
panel2.setLayout(new FlowLayout());
}
add(panel2, "cell 3 0 1 6,grow");
//---- scrollBarLabel ----
scrollBarLabel.setText("JScrollBar:");
@@ -219,10 +223,6 @@ class MoreComponentsPanel
scrollBar1.setOrientation(Adjustable.HORIZONTAL);
add(scrollBar1, "cell 1 1,growx");
//---- label4 ----
label4.setText("HTML:");
add(label4, "cell 5 1");
//---- scrollBar4 ----
scrollBar4.setOrientation(Adjustable.HORIZONTAL);
scrollBar4.setEnabled(false);
@@ -238,11 +238,16 @@ class MoreComponentsPanel
// rows
"[]" +
"[]" +
"[]" +
"[]"));
//---- label4 ----
label4.setText("HTML:");
panel3.add(label4, "cell 0 0");
//---- label3 ----
label3.setText("<html>JLabel HTML<br>Sample <b>content</b><br> <u>text</u> with <a href=\"#\">link</a></html>");
panel3.add(label3, "cell 0 0");
panel3.add(label3, "cell 0 1");
//======== scrollPane15 ========
{
@@ -252,7 +257,7 @@ class MoreComponentsPanel
editorPane6.setText("JEditorPane HTML<br>Sample <b>content</b><br> <u>text</u> with <a href=\"#\">link</a>");
scrollPane15.setViewportView(editorPane6);
}
panel3.add(scrollPane15, "cell 0 1,grow");
panel3.add(scrollPane15, "cell 0 2,grow");
//======== scrollPane16 ========
{
@@ -262,9 +267,9 @@ class MoreComponentsPanel
textPane6.setText("JTextPane HTML<br>Sample <b>content</b><br> <u>text</u> with <a href=\"#\">link</a>");
scrollPane16.setViewportView(textPane6);
}
panel3.add(scrollPane16, "cell 0 2,grow");
panel3.add(scrollPane16, "cell 0 3,grow");
}
add(panel3, "cell 5 2 1 9,aligny top,growy 0");
add(panel3, "cell 4 0 1 8,aligny top,growy 0");
//---- scrollBar5 ----
scrollBar5.setOrientation(Adjustable.HORIZONTAL);
@@ -282,13 +287,6 @@ class MoreComponentsPanel
add(separatorLabel, "cell 0 5");
add(separator1, "cell 1 5,growx");
//======== panel2 ========
{
panel2.setBorder(new TitledBorder("TitledBorder"));
panel2.setLayout(new FlowLayout());
}
add(panel2, "cell 3 5,grow");
//---- sliderLabel ----
sliderLabel.setText("JSlider:");
add(sliderLabel, "cell 0 6");
@@ -389,6 +387,17 @@ class MoreComponentsPanel
}
add(toolBar1, "cell 1 10 3 1,growx");
// JFormDesigner - End of component initialization //GEN-END:initComponents
if( FlatLafDemo.screenshotsMode ) {
Component[] components = new Component[] {
indeterminateCheckBox,
toolTipLabel, toolTip1, toolTip2,
toolBarLabel, toolBar1, toolBar2,
};
for( Component c : components )
c.setVisible( false );
}
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.1.0.272" Java: "13.0.2" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -7,8 +7,8 @@ new FormModel {
"JavaCodeGenerator.defaultVariableLocal": true
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3"
"$columnConstraints": "[][][][][][]"
"$layoutConstraints": "insets dialog,hidemode 3"
"$columnConstraints": "[][][][][]"
"$rowConstraints": "[][][][][][][][][][][]"
} ) {
name: "this"
@@ -27,7 +27,7 @@ new FormModel {
"preferredSize": new java.awt.Dimension( 200, 200 )
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0,grow,width 70,height 70"
"value": "cell 1 0,grow,width 70,height 40"
} )
add( new FormComponent( "javax.swing.JScrollBar" ) {
name: "scrollBar2"
@@ -64,7 +64,7 @@ new FormModel {
"orientation": 1
"value": 30
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 0 1 6,growy"
"value": "cell 2 0 1 6,growy,height 100"
} )
add( new FormComponent( "javax.swing.JSlider" ) {
name: "slider4"
@@ -75,12 +75,7 @@ new FormModel {
"orientation": 1
"value": 30
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 0 1 6,growy"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane14"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 3 0,grow"
"value": "cell 2 0 1 6,growy,height 100"
} )
add( new FormComponent( "javax.swing.JProgressBar" ) {
name: "progressBar3"
@@ -90,7 +85,7 @@ new FormModel {
"JavaCodeGenerator.variableLocal": false
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 0 1 6,growy"
"value": "cell 2 0 1 6,growy"
} )
add( new FormComponent( "javax.swing.JProgressBar" ) {
name: "progressBar4"
@@ -101,7 +96,7 @@ new FormModel {
"JavaCodeGenerator.variableLocal": false
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 0 1 6,growy"
"value": "cell 2 0 1 6,growy"
} )
add( new FormContainer( "javax.swing.JToolBar", new FormLayoutManager( class javax.swing.JToolBar ) ) {
name: "toolBar2"
@@ -126,7 +121,13 @@ new FormModel {
"icon": new com.jformdesigner.model.SwingIcon( 2, "Tree.closedIcon" )
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 0 1 6,growy"
"value": "cell 2 0 1 6,growy"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel2"
"border": new javax.swing.border.TitledBorder( "TitledBorder" )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 3 0 1 6,grow"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "scrollBarLabel"
@@ -140,12 +141,6 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 1,growx"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label4"
"text": "HTML:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 1"
} )
add( new FormComponent( "javax.swing.JScrollBar" ) {
name: "scrollBar4"
"orientation": 0
@@ -155,16 +150,22 @@ new FormModel {
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$columnConstraints": "[]"
"$rowConstraints": "[][][]"
"$rowConstraints": "[][][][]"
"$layoutConstraints": "ltr,insets 0,hidemode 3"
} ) {
name: "panel3"
"opaque": false
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label4"
"text": "HTML:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label3"
"text": "<html>JLabel HTML<br>Sample <b>content</b><br> <u>text</u> with <a href=\"#\">link</a></html>"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
"value": "cell 0 1"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane15"
@@ -174,7 +175,7 @@ new FormModel {
"text": "JEditorPane HTML<br>Sample <b>content</b><br> <u>text</u> with <a href=\"#\">link</a>"
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 1,grow"
"value": "cell 0 2,grow"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane16"
@@ -184,10 +185,10 @@ new FormModel {
"text": "JTextPane HTML<br>Sample <b>content</b><br> <u>text</u> with <a href=\"#\">link</a>"
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2,grow"
"value": "cell 0 3,grow"
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 5 2 1 9,aligny top,growy 0"
"value": "cell 4 0 1 8,aligny top,growy 0"
} )
add( new FormComponent( "javax.swing.JScrollBar" ) {
name: "scrollBar5"
@@ -215,12 +216,6 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 5,growx"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel2"
"border": new javax.swing.border.TitledBorder( "TitledBorder" )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 3 5,grow"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "sliderLabel"
"text": "JSlider:"
@@ -365,7 +360,7 @@ new FormModel {
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 790, 715 )
"size": new java.awt.Dimension( 700, 420 )
} )
}
}

View File

@@ -0,0 +1,393 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.demo;
import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.*;
import net.miginfocom.swing.*;
/**
* @author Karl Tauber
*/
class NewDialog
extends JDialog
{
NewDialog( Window owner ) {
super( owner );
initComponents();
// hide menubar, which is here for testing
menuBar1.setVisible( false );
getRootPane().setDefaultButton( okButton );
// register ESC key to close frame
((JComponent)getContentPane()).registerKeyboardAction(
e -> dispose(),
KeyStroke.getKeyStroke( KeyEvent.VK_ESCAPE, 0, false ),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
}
private void okActionPerformed() {
dispose();
}
private void cancelActionPerformed() {
dispose();
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
dialogPane = new JPanel();
contentPanel = new JPanel();
label1 = new JLabel();
textField1 = new JTextField();
label3 = new JLabel();
comboBox2 = new JComboBox<>();
label2 = new JLabel();
comboBox1 = new JComboBox<>();
buttonBar = new JPanel();
okButton = new JButton();
cancelButton = new JButton();
menuBar1 = new JMenuBar();
menu1 = new JMenu();
menuItem8 = new JMenuItem();
menuItem7 = new JMenuItem();
menuItem6 = new JMenuItem();
menuItem5 = new JMenuItem();
menuItem4 = new JMenuItem();
menuItem3 = new JMenuItem();
menuItem2 = new JMenuItem();
menuItem1 = new JMenuItem();
menu2 = new JMenu();
menuItem18 = new JMenuItem();
menuItem17 = new JMenuItem();
menuItem16 = new JMenuItem();
menuItem15 = new JMenuItem();
menuItem14 = new JMenuItem();
menuItem13 = new JMenuItem();
menuItem12 = new JMenuItem();
menuItem11 = new JMenuItem();
menuItem10 = new JMenuItem();
menuItem9 = new JMenuItem();
menu3 = new JMenu();
menuItem25 = new JMenuItem();
menuItem26 = new JMenuItem();
menuItem24 = new JMenuItem();
menuItem23 = new JMenuItem();
menuItem22 = new JMenuItem();
menuItem21 = new JMenuItem();
menuItem20 = new JMenuItem();
menuItem19 = new JMenuItem();
popupMenu1 = new JPopupMenu();
cutMenuItem = new JMenuItem();
copyMenuItem = new JMenuItem();
pasteMenuItem = new JMenuItem();
//======== this ========
setTitle("New");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setModal(true);
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
//======== dialogPane ========
{
dialogPane.setLayout(new BorderLayout());
//======== contentPanel ========
{
contentPanel.setLayout(new MigLayout(
"insets dialog,hidemode 3",
// columns
"[fill]" +
"[grow,fill]",
// rows
"[]" +
"[]" +
"[]"));
//---- label1 ----
label1.setText("Name:");
contentPanel.add(label1, "cell 0 0");
//---- textField1 ----
textField1.setComponentPopupMenu(popupMenu1);
contentPanel.add(textField1, "cell 1 0");
//---- label3 ----
label3.setText("Package:");
contentPanel.add(label3, "cell 0 1");
//---- comboBox2 ----
comboBox2.setEditable(true);
comboBox2.setModel(new DefaultComboBoxModel<>(new String[] {
"com.myapp",
"com.myapp.core",
"com.myapp.ui",
"com.myapp.util",
"com.myapp.extras",
"com.myapp.components",
"com.myapp.dialogs",
"com.myapp.windows"
}));
contentPanel.add(comboBox2, "cell 1 1");
//---- label2 ----
label2.setText("Type:");
contentPanel.add(label2, "cell 0 2");
//---- comboBox1 ----
comboBox1.setModel(new DefaultComboBoxModel<>(new String[] {
"Class",
"Interface",
"Package",
"Annotation",
"Enum",
"Record",
"Java Project",
"Project",
"Folder",
"File"
}));
contentPanel.add(comboBox1, "cell 1 2");
}
dialogPane.add(contentPanel, BorderLayout.CENTER);
//======== buttonBar ========
{
buttonBar.setLayout(new MigLayout(
"insets dialog,alignx right",
// columns
"[button,fill]" +
"[button,fill]",
// rows
null));
//---- okButton ----
okButton.setText("OK");
okButton.addActionListener(e -> okActionPerformed());
buttonBar.add(okButton, "cell 0 0");
//---- cancelButton ----
cancelButton.setText("Cancel");
cancelButton.addActionListener(e -> cancelActionPerformed());
buttonBar.add(cancelButton, "cell 1 0");
}
dialogPane.add(buttonBar, BorderLayout.SOUTH);
//======== menuBar1 ========
{
//======== menu1 ========
{
menu1.setText("text");
//---- menuItem8 ----
menuItem8.setText("text");
menu1.add(menuItem8);
//---- menuItem7 ----
menuItem7.setText("text");
menu1.add(menuItem7);
//---- menuItem6 ----
menuItem6.setText("text");
menu1.add(menuItem6);
//---- menuItem5 ----
menuItem5.setText("text");
menu1.add(menuItem5);
//---- menuItem4 ----
menuItem4.setText("text");
menu1.add(menuItem4);
//---- menuItem3 ----
menuItem3.setText("text");
menu1.add(menuItem3);
//---- menuItem2 ----
menuItem2.setText("text");
menu1.add(menuItem2);
//---- menuItem1 ----
menuItem1.setText("text");
menu1.add(menuItem1);
}
menuBar1.add(menu1);
//======== menu2 ========
{
menu2.setText("text");
//---- menuItem18 ----
menuItem18.setText("text");
menu2.add(menuItem18);
//---- menuItem17 ----
menuItem17.setText("text");
menu2.add(menuItem17);
//---- menuItem16 ----
menuItem16.setText("text");
menu2.add(menuItem16);
//---- menuItem15 ----
menuItem15.setText("text");
menu2.add(menuItem15);
//---- menuItem14 ----
menuItem14.setText("text");
menu2.add(menuItem14);
//---- menuItem13 ----
menuItem13.setText("text");
menu2.add(menuItem13);
//---- menuItem12 ----
menuItem12.setText("text");
menu2.add(menuItem12);
//---- menuItem11 ----
menuItem11.setText("text");
menu2.add(menuItem11);
//---- menuItem10 ----
menuItem10.setText("text");
menu2.add(menuItem10);
//---- menuItem9 ----
menuItem9.setText("text");
menu2.add(menuItem9);
}
menuBar1.add(menu2);
//======== menu3 ========
{
menu3.setText("text");
//---- menuItem25 ----
menuItem25.setText("text");
menu3.add(menuItem25);
//---- menuItem26 ----
menuItem26.setText("text");
menu3.add(menuItem26);
//---- menuItem24 ----
menuItem24.setText("text");
menu3.add(menuItem24);
//---- menuItem23 ----
menuItem23.setText("text");
menu3.add(menuItem23);
//---- menuItem22 ----
menuItem22.setText("text");
menu3.add(menuItem22);
//---- menuItem21 ----
menuItem21.setText("text");
menu3.add(menuItem21);
//---- menuItem20 ----
menuItem20.setText("text");
menu3.add(menuItem20);
//---- menuItem19 ----
menuItem19.setText("text");
menu3.add(menuItem19);
}
menuBar1.add(menu3);
}
dialogPane.add(menuBar1, BorderLayout.NORTH);
}
contentPane.add(dialogPane, BorderLayout.CENTER);
pack();
setLocationRelativeTo(getOwner());
//======== popupMenu1 ========
{
//---- cutMenuItem ----
cutMenuItem.setText("Cut");
cutMenuItem.setMnemonic('C');
popupMenu1.add(cutMenuItem);
//---- copyMenuItem ----
copyMenuItem.setText("Copy");
copyMenuItem.setMnemonic('O');
popupMenu1.add(copyMenuItem);
//---- pasteMenuItem ----
pasteMenuItem.setText("Paste");
pasteMenuItem.setMnemonic('P');
popupMenu1.add(pasteMenuItem);
}
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JPanel dialogPane;
private JPanel contentPanel;
private JLabel label1;
private JTextField textField1;
private JLabel label3;
private JComboBox<String> comboBox2;
private JLabel label2;
private JComboBox<String> comboBox1;
private JPanel buttonBar;
private JButton okButton;
private JButton cancelButton;
private JMenuBar menuBar1;
private JMenu menu1;
private JMenuItem menuItem8;
private JMenuItem menuItem7;
private JMenuItem menuItem6;
private JMenuItem menuItem5;
private JMenuItem menuItem4;
private JMenuItem menuItem3;
private JMenuItem menuItem2;
private JMenuItem menuItem1;
private JMenu menu2;
private JMenuItem menuItem18;
private JMenuItem menuItem17;
private JMenuItem menuItem16;
private JMenuItem menuItem15;
private JMenuItem menuItem14;
private JMenuItem menuItem13;
private JMenuItem menuItem12;
private JMenuItem menuItem11;
private JMenuItem menuItem10;
private JMenuItem menuItem9;
private JMenu menu3;
private JMenuItem menuItem25;
private JMenuItem menuItem26;
private JMenuItem menuItem24;
private JMenuItem menuItem23;
private JMenuItem menuItem22;
private JMenuItem menuItem21;
private JMenuItem menuItem20;
private JMenuItem menuItem19;
private JPopupMenu popupMenu1;
private JMenuItem cutMenuItem;
private JMenuItem copyMenuItem;
private JMenuItem pasteMenuItem;
// JFormDesigner - End of variables declaration //GEN-END:variables
}

View File

@@ -0,0 +1,254 @@
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
root: new FormRoot {
add( new FormWindow( "javax.swing.JDialog", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "this"
"title": "New"
"defaultCloseOperation": 2
"modal": true
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "dialogPane"
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "insets dialog,hidemode 3"
"$columnConstraints": "[fill][grow,fill]"
"$rowConstraints": "[][][]"
} ) {
name: "contentPanel"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label1"
"text": "Name:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
} )
add( new FormComponent( "javax.swing.JTextField" ) {
name: "textField1"
"componentPopupMenu": new FormReference( "popupMenu1" )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label3"
"text": "Package:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 1"
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox2"
"editable": true
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "com.myapp"
addElement( "com.myapp" )
addElement( "com.myapp.core" )
addElement( "com.myapp.ui" )
addElement( "com.myapp.util" )
addElement( "com.myapp.extras" )
addElement( "com.myapp.components" )
addElement( "com.myapp.dialogs" )
addElement( "com.myapp.windows" )
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 1"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label2"
"text": "Type:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2"
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox1"
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "Class"
addElement( "Class" )
addElement( "Interface" )
addElement( "Package" )
addElement( "Annotation" )
addElement( "Enum" )
addElement( "Record" )
addElement( "Java Project" )
addElement( "Project" )
addElement( "Folder" )
addElement( "File" )
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 2"
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "insets dialog,alignx right"
"$columnConstraints": "[button,fill][button,fill]"
"$rowSpecs": "[fill]"
} ) {
name: "buttonBar"
add( new FormComponent( "javax.swing.JButton" ) {
name: "okButton"
"text": "OK"
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "okActionPerformed", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "cancelButton"
"text": "Cancel"
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "cancelActionPerformed", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0"
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "South"
} )
add( new FormContainer( "javax.swing.JMenuBar", new FormLayoutManager( class javax.swing.JMenuBar ) ) {
name: "menuBar1"
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "menu1"
"text": "text"
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem8"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem7"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem6"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem5"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem4"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem3"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem2"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem1"
"text": "text"
} )
} )
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "menu2"
"text": "text"
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem18"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem17"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem16"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem15"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem14"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem13"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem12"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem11"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem10"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem9"
"text": "text"
} )
} )
add( new FormContainer( "javax.swing.JMenu", new FormLayoutManager( class javax.swing.JMenu ) ) {
name: "menu3"
"text": "text"
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem25"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem26"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem24"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem23"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem22"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem21"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem20"
"text": "text"
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "menuItem19"
"text": "text"
} )
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "North"
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 330, 210 )
} )
add( new FormContainer( "javax.swing.JPopupMenu", new FormLayoutManager( class javax.swing.JPopupMenu ) ) {
name: "popupMenu1"
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "cutMenuItem"
"text": "Cut"
"mnemonic": 67
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "copyMenuItem"
"text": "Copy"
"mnemonic": 79
} )
add( new FormComponent( "javax.swing.JMenuItem" ) {
name: "pasteMenuItem"
"text": "Paste"
"mnemonic": 80
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 220 )
"size": new java.awt.Dimension( 91, 87 )
} )
}
}

View File

@@ -93,7 +93,7 @@ class OptionPanePanel
//======== panel9 ========
{
panel9.setLayout(new MigLayout(
"flowy,hidemode 3",
"flowy,insets dialog,hidemode 3",
// columns
"[]" +
"[]" +

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.1.0.272" Java: "13.0.2" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -12,7 +12,7 @@ new FormModel {
name: "scrollPane1"
"border": new javax.swing.border.EmptyBorder( 0, 0, 0, 0 )
add( new FormContainer( "com.formdev.flatlaf.demo.ScrollablePanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "flowy,hidemode 3"
"$layoutConstraints": "flowy,insets dialog,hidemode 3"
"$columnConstraints": "[][][fill]"
"$rowConstraints": "[top][top][top][top][top][top][top][top]"
} ) {

View File

@@ -1,5 +1,17 @@
/*
* Created by JFormDesigner on Tue Aug 27 21:47:02 CEST 2019
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.demo;
@@ -20,6 +32,8 @@ class TabsPanel
{
TabsPanel() {
initComponents();
addInitialTabs( tabbedPane1, tabbedPane2, tabbedPane3, tabbedPane4 );
}
private void tabScrollChanged() {
@@ -28,8 +42,20 @@ class TabsPanel
tabbedPane2.setTabLayoutPolicy( tabLayoutPolicy );
tabbedPane3.setTabLayoutPolicy( tabLayoutPolicy );
tabbedPane4.setTabLayoutPolicy( tabLayoutPolicy );
if( !autoMoreTabs && tabScrollCheckBox.isSelected() && !moreTabsCheckBox.isSelected() ) {
moreTabsCheckBox.setSelected( true );
moreTabsChanged();
autoMoreTabs = true;
} else if( autoMoreTabs && !tabScrollCheckBox.isSelected() && moreTabsCheckBox.isSelected() ) {
moreTabsCheckBox.setSelected( false );
moreTabsChanged();
autoMoreTabs = false;
}
}
private boolean autoMoreTabs;
private void showTabSeparatorsChanged() {
Boolean showTabSeparators = showTabSeparatorsCheckBox.isSelected() ? true : null;
tabbedPane1.putClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators );
@@ -52,15 +78,17 @@ class TabsPanel
addRemoveMoreTabs( tabbedPane2, moreTabs );
addRemoveMoreTabs( tabbedPane3, moreTabs );
addRemoveMoreTabs( tabbedPane4, moreTabs );
autoMoreTabs = false;
}
private void addRemoveMoreTabs( JTabbedPane tabbedPane, boolean add ) {
if( add ) {
tabbedPane.addTab( "Tab 4", new JLabel( "tab 4" ) );
tabbedPane.addTab( "Tab 5", new JLabel( "tab 5" ) );
tabbedPane.addTab( "Tab 6", new JLabel( "tab 6" ) );
tabbedPane.addTab( "Tab 7", new JLabel( "tab 7" ) );
tabbedPane.addTab( "Tab 8", new JLabel( "tab 8" ) );
addTab( tabbedPane, "Tab 4", "tab content 4" );
addTab( tabbedPane, "Tab 5", "tab content 5" );
addTab( tabbedPane, "Tab 6", "tab content 6" );
addTab( tabbedPane, "Tab 7", "tab content 7" );
addTab( tabbedPane, "Tab 8", "tab content 8" );
} else {
int tabCount = tabbedPane.getTabCount();
if( tabCount > 3 ) {
@@ -70,6 +98,39 @@ class TabsPanel
}
}
private void addInitialTabs( JTabbedPane... tabbedPanes ) {
for( JTabbedPane tabbedPane : tabbedPanes ) {
String placement = "unknown";
switch( tabbedPane.getTabPlacement() ) {
case JTabbedPane.TOP: placement = "TOP"; break;
case JTabbedPane.BOTTOM: placement = "BOTTOM"; break;
case JTabbedPane.LEFT: placement = "LEFT"; break;
case JTabbedPane.RIGHT: placement = "RIGHT"; break;
}
addTab( tabbedPane, "Tab 1", "<html><center>" + placement + "<br>tab placement</center></html>" );
JComponent tab2 = createTab( "tab content 2" );
tab2.setBorder( new LineBorder( Color.magenta ) );
tabbedPane.addTab( "Second Tab", tab2 );
addTab( tabbedPane, "Disabled", "tab content 3" );
tabbedPane.setEnabledAt( 2, false );
}
}
private void addTab( JTabbedPane tabbedPane, String title, String text ) {
tabbedPane.addTab( title, createTab( text ) );
}
private JComponent createTab( String text ) {
JLabel label = new JLabel( text );
label.setHorizontalAlignment( SwingConstants.CENTER );
JPanel tab = new JPanel( new BorderLayout() );
tab.add( label, BorderLayout.CENTER );
return tab;
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
JPanel panel9 = new JPanel();
@@ -77,31 +138,19 @@ class TabsPanel
JSplitPane splitPane3 = new JSplitPane();
JSplitPane splitPane1 = new JSplitPane();
JPanel panel10 = new JPanel();
JLabel label1 = new JLabel();
JPanel panel11 = new JPanel();
JLabel label2 = new JLabel();
JSplitPane splitPane2 = new JSplitPane();
JPanel panel12 = new JPanel();
JLabel label3 = new JLabel();
JPanel panel13 = new JPanel();
JLabel label4 = new JLabel();
JLabel tabbedPaneLabel = new JLabel();
tabbedPane1 = new JTabbedPane();
JPanel panel1 = new JPanel();
JLabel label1 = new JLabel();
JPanel panel2 = new JPanel();
JLabel label2 = new JLabel();
tabbedPane3 = new JTabbedPane();
JPanel panel5 = new JPanel();
JLabel label5 = new JLabel();
JPanel panel6 = new JPanel();
JLabel label6 = new JLabel();
tabbedPane2 = new JTabbedPane();
JPanel panel3 = new JPanel();
JLabel label3 = new JLabel();
JPanel panel4 = new JPanel();
JLabel label4 = new JLabel();
tabbedPane4 = new JTabbedPane();
JPanel panel7 = new JPanel();
JLabel label7 = new JLabel();
JPanel panel8 = new JPanel();
JLabel label8 = new JLabel();
JPanel panel14 = new JPanel();
moreTabsCheckBox = new JCheckBox();
tabScrollCheckBox = new JCheckBox();
@@ -111,7 +160,7 @@ class TabsPanel
//======== this ========
setLayout(new MigLayout(
"hidemode 3",
"insets dialog,hidemode 3",
// columns
"[grow,fill]",
// rows
@@ -120,8 +169,8 @@ class TabsPanel
//======== panel9 ========
{
panel9.setLayout(new FormLayout(
"70dlu:grow, $lcgap, 70dlu:grow",
"default, $lgap, fill:70dlu, $lgap, pref, 2*($lgap, fill:70dlu:grow), $lgap, pref"));
"70dlu:grow, $ugap, 70dlu:grow",
"default, $lgap, fill:70dlu, $pgap, pref, $lgap, 2*(fill:80dlu:grow, $ugap), pref"));
//---- splitPaneLabel ----
splitPaneLabel.setText("JSplitPane:");
@@ -134,19 +183,30 @@ class TabsPanel
//======== splitPane1 ========
{
splitPane1.setResizeWeight(0.5);
splitPane1.setOneTouchExpandable(true);
//======== panel10 ========
{
panel10.setBackground(Color.orange);
panel10.setLayout(new FlowLayout());
panel10.setBackground(new Color(217, 163, 67));
panel10.setLayout(new BorderLayout());
//---- label1 ----
label1.setText("LEFT");
label1.setHorizontalAlignment(SwingConstants.CENTER);
label1.setForeground(Color.white);
panel10.add(label1, BorderLayout.CENTER);
}
splitPane1.setLeftComponent(panel10);
//======== panel11 ========
{
panel11.setBackground(Color.magenta);
panel11.setLayout(new FlowLayout());
panel11.setBackground(new Color(98, 181, 67));
panel11.setLayout(new BorderLayout());
//---- label2 ----
label2.setText("RIGHT");
label2.setHorizontalAlignment(SwingConstants.CENTER);
label2.setForeground(Color.white);
panel11.add(label2, BorderLayout.CENTER);
}
splitPane1.setRightComponent(panel11);
}
@@ -156,19 +216,30 @@ class TabsPanel
{
splitPane2.setOrientation(JSplitPane.VERTICAL_SPLIT);
splitPane2.setResizeWeight(0.5);
splitPane2.setOneTouchExpandable(true);
//======== panel12 ========
{
panel12.setBackground(Color.orange);
panel12.setLayout(new FlowLayout());
panel12.setBackground(new Color(242, 101, 34));
panel12.setLayout(new BorderLayout());
//---- label3 ----
label3.setText("TOP");
label3.setHorizontalAlignment(SwingConstants.CENTER);
label3.setForeground(Color.white);
panel12.add(label3, BorderLayout.CENTER);
}
splitPane2.setTopComponent(panel12);
//======== panel13 ========
{
panel13.setBackground(Color.magenta);
panel13.setLayout(new FlowLayout());
panel13.setBackground(new Color(64, 182, 224));
panel13.setLayout(new BorderLayout());
//---- label4 ----
label4.setText("BOTTOM");
label4.setHorizontalAlignment(SwingConstants.CENTER);
label4.setForeground(Color.white);
panel13.add(label4, BorderLayout.CENTER);
}
splitPane2.setBottomComponent(panel13);
}
@@ -179,112 +250,23 @@ class TabsPanel
//---- tabbedPaneLabel ----
tabbedPaneLabel.setText("JTabbedPane:");
panel9.add(tabbedPaneLabel, cc.xy(1, 5));
//======== tabbedPane1 ========
{
//======== panel1 ========
{
panel1.setLayout(new FlowLayout());
//---- label1 ----
label1.setText("TOP");
panel1.add(label1);
}
tabbedPane1.addTab("Tab 1", panel1);
//======== panel2 ========
{
panel2.setBorder(new LineBorder(Color.magenta));
panel2.setLayout(new FlowLayout());
}
tabbedPane1.addTab("Tab 2", panel2);
//---- label2 ----
label2.setText("text");
tabbedPane1.addTab("Tab 3", label2);
}
panel9.add(tabbedPane1, cc.xy(1, 7));
//======== tabbedPane3 ========
{
tabbedPane3.setTabPlacement(SwingConstants.LEFT);
//======== panel5 ========
{
panel5.setLayout(new FlowLayout());
//---- label5 ----
label5.setText("LEFT");
panel5.add(label5);
}
tabbedPane3.addTab("Tab 1", panel5);
//======== panel6 ========
{
panel6.setBorder(new LineBorder(Color.magenta));
panel6.setLayout(new FlowLayout());
}
tabbedPane3.addTab("Tab 2", panel6);
//---- label6 ----
label6.setText("text");
tabbedPane3.addTab("Tab 3", label6);
}
panel9.add(tabbedPane3, cc.xy(3, 7));
//======== tabbedPane2 ========
{
tabbedPane2.setTabPlacement(SwingConstants.BOTTOM);
//======== panel3 ========
{
panel3.setLayout(new FlowLayout());
//---- label3 ----
label3.setText("BOTTOM");
panel3.add(label3);
}
tabbedPane2.addTab("Tab 1", panel3);
//======== panel4 ========
{
panel4.setBorder(new LineBorder(Color.magenta));
panel4.setLayout(new FlowLayout());
}
tabbedPane2.addTab("Tab 2", panel4);
tabbedPane2.setEnabledAt(1, false);
//---- label4 ----
label4.setText("text");
tabbedPane2.addTab("Tab 3", label4);
}
panel9.add(tabbedPane2, cc.xy(1, 9));
//======== tabbedPane4 ========
{
tabbedPane4.setTabPlacement(SwingConstants.RIGHT);
//======== panel7 ========
{
panel7.setLayout(new FlowLayout());
//---- label7 ----
label7.setText("RIGHT");
panel7.add(label7);
}
tabbedPane4.addTab("Tab 1", panel7);
//======== panel8 ========
{
panel8.setBorder(new LineBorder(Color.magenta));
panel8.setLayout(new FlowLayout());
}
tabbedPane4.addTab("Tab 2", panel8);
//---- label8 ----
label8.setText("text");
tabbedPane4.addTab("Tab 3", label8);
}
panel9.add(tabbedPane4, cc.xy(3, 9));
@@ -301,25 +283,24 @@ class TabsPanel
"[center]"));
//---- moreTabsCheckBox ----
moreTabsCheckBox.setText("more tabs");
moreTabsCheckBox.setText("More tabs");
moreTabsCheckBox.setMnemonic('M');
moreTabsCheckBox.addActionListener(e -> moreTabsChanged());
panel14.add(moreTabsCheckBox, "cell 0 0");
//---- tabScrollCheckBox ----
tabScrollCheckBox.setText("tabLayoutPolicy = SCROLL");
tabScrollCheckBox.setText("Use scroll layout");
tabScrollCheckBox.setMnemonic('S');
tabScrollCheckBox.addActionListener(e -> tabScrollChanged());
panel14.add(tabScrollCheckBox, "cell 1 0,alignx left,growx 0");
//---- showTabSeparatorsCheckBox ----
showTabSeparatorsCheckBox.setText("JTabbedPane.showTabSeparators");
showTabSeparatorsCheckBox.setText("Show tab separators");
showTabSeparatorsCheckBox.addActionListener(e -> showTabSeparatorsChanged());
panel14.add(showTabSeparatorsCheckBox, "cell 2 0");
//---- hasFullBorderCheckBox ----
hasFullBorderCheckBox.setText("JTabbedPane.hasFullBorder");
hasFullBorderCheckBox.setMnemonic('F');
hasFullBorderCheckBox.setText("Show content border");
hasFullBorderCheckBox.addActionListener(e -> hasFullBorderChanged());
panel14.add(hasFullBorderCheckBox, "cell 3 0,alignx left,growx 0");
}

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.0.0.194" Java: "11.0.2" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -7,14 +7,14 @@ new FormModel {
"JavaCodeGenerator.defaultVariableLocal": true
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3"
"$layoutConstraints": "insets dialog,hidemode 3"
"$columnConstraints": "[grow,fill]"
"$rowConstraints": "[grow,fill]"
} ) {
name: "this"
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class com.jgoodies.forms.layout.FormLayout ) {
"$columnSpecs": "70dlu:grow, labelcompgap, 70dlu:grow"
"$rowSpecs": "default, linegap, fill:70dlu, linegap, pref, linegap, fill:70dlu:grow, linegap, fill:70dlu:grow, linegap, pref"
"$columnSpecs": "70dlu:grow, unrelgap, 70dlu:grow"
"$rowSpecs": "default, linegap, fill:70dlu, pargap, pref, linegap, fill:80dlu:grow, unrelgap, fill:80dlu:grow, unrelgap, pref"
} ) {
name: "panel9"
add( new FormComponent( "javax.swing.JLabel" ) {
@@ -27,16 +27,31 @@ new FormModel {
add( new FormContainer( "javax.swing.JSplitPane", new FormLayoutManager( class javax.swing.JSplitPane ) ) {
name: "splitPane1"
"resizeWeight": 0.5
"oneTouchExpandable": true
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "panel10"
"background": sfield java.awt.Color orange
"background": new java.awt.Color( 217, 163, 67, 255 )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label1"
"text": "LEFT"
"horizontalAlignment": 0
"foreground": sfield java.awt.Color white
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "left"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "panel11"
"background": sfield java.awt.Color magenta
"background": new java.awt.Color( 98, 181, 67, 255 )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label2"
"text": "RIGHT"
"horizontalAlignment": 0
"foreground": sfield java.awt.Color white
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "right"
} )
@@ -47,16 +62,31 @@ new FormModel {
name: "splitPane2"
"orientation": 0
"resizeWeight": 0.5
"oneTouchExpandable": true
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "panel12"
"background": sfield java.awt.Color orange
"background": new java.awt.Color( 242, 101, 34, 255 )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label3"
"text": "TOP"
"horizontalAlignment": 0
"foreground": sfield java.awt.Color white
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "left"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "panel13"
"background": sfield java.awt.Color magenta
"background": new java.awt.Color( 64, 182, 224, 255 )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label4"
"text": "BOTTOM"
"horizontalAlignment": 0
"foreground": sfield java.awt.Color white
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "right"
} )
@@ -79,27 +109,6 @@ new FormModel {
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel1"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label1"
"text": "TOP"
} )
}, new FormLayoutConstraints( null ) {
"title": "Tab 1"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel2"
"border": &LineBorder0 new javax.swing.border.LineBorder( sfield java.awt.Color magenta, 1, false )
}, new FormLayoutConstraints( null ) {
"title": "Tab 2"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label2"
"text": "text"
}, new FormLayoutConstraints( null ) {
"title": "Tab 3"
} )
}, new FormLayoutConstraints( class com.jgoodies.forms.layout.CellConstraints ) {
"gridX": 1
"gridY": 7
@@ -110,27 +119,6 @@ new FormModel {
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel5"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label5"
"text": "LEFT"
} )
}, new FormLayoutConstraints( null ) {
"title": "Tab 1"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel6"
"border": #LineBorder0
}, new FormLayoutConstraints( null ) {
"title": "Tab 2"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label6"
"text": "text"
}, new FormLayoutConstraints( null ) {
"title": "Tab 3"
} )
}, new FormLayoutConstraints( class com.jgoodies.forms.layout.CellConstraints ) {
"gridX": 3
"gridY": 7
@@ -141,28 +129,6 @@ new FormModel {
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel3"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label3"
"text": "BOTTOM"
} )
}, new FormLayoutConstraints( null ) {
"title": "Tab 1"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel4"
"border": #LineBorder0
}, new FormLayoutConstraints( null ) {
"title": "Tab 2"
"enabled": false
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label4"
"text": "text"
}, new FormLayoutConstraints( null ) {
"title": "Tab 3"
} )
}, new FormLayoutConstraints( class com.jgoodies.forms.layout.CellConstraints ) {
"gridY": 9
} )
@@ -172,27 +138,6 @@ new FormModel {
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel7"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label7"
"text": "RIGHT"
} )
}, new FormLayoutConstraints( null ) {
"title": "Tab 1"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel8"
"border": #LineBorder0
}, new FormLayoutConstraints( null ) {
"title": "Tab 2"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label8"
"text": "text"
}, new FormLayoutConstraints( null ) {
"title": "Tab 3"
} )
}, new FormLayoutConstraints( class com.jgoodies.forms.layout.CellConstraints ) {
"gridX": 3
"gridY": 9
@@ -205,7 +150,7 @@ new FormModel {
name: "panel14"
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "moreTabsCheckBox"
"text": "more tabs"
"text": "More tabs"
"mnemonic": 77
auxiliary() {
"JavaCodeGenerator.variableLocal": false
@@ -216,7 +161,7 @@ new FormModel {
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "tabScrollCheckBox"
"text": "tabLayoutPolicy = SCROLL"
"text": "Use scroll layout"
"mnemonic": 83
auxiliary() {
"JavaCodeGenerator.variableLocal": false
@@ -227,7 +172,7 @@ new FormModel {
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "showTabSeparatorsCheckBox"
"text": "JTabbedPane.showTabSeparators"
"text": "Show tab separators"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
@@ -237,8 +182,7 @@ new FormModel {
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "hasFullBorderCheckBox"
"text": "JTabbedPane.hasFullBorder"
"mnemonic": 70
"text": "Show content border"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
@@ -255,7 +199,7 @@ new FormModel {
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 610, 515 )
"size": new java.awt.Dimension( 625, 515 )
} )
}
}

View File

@@ -71,7 +71,7 @@ public class ExtrasPanel
//======== this ========
setLayout(new MigLayout(
"hidemode 3",
"insets dialog,hidemode 3",
// columns
"[]" +
"[]" +
@@ -98,7 +98,7 @@ public class ExtrasPanel
//---- triStateLabel1 ----
triStateLabel1.setText("text");
triStateLabel1.setEnabled(false);
add(triStateLabel1, "cell 2 1");
add(triStateLabel1, "cell 2 1,gapx 30");
//---- label2 ----
label2.setText("SVG Icons:");

View File

@@ -4,7 +4,7 @@ new FormModel {
contentType: "form/swing"
root: new FormRoot {
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3"
"$layoutConstraints": "insets dialog,hidemode 3"
"$columnConstraints": "[][][left]"
"$rowConstraints": "[]para[][][]"
} ) {
@@ -33,7 +33,7 @@ new FormModel {
"text": "text"
"enabled": false
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 1"
"value": "cell 2 1,gapx 30"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label2"

View File

@@ -205,11 +205,11 @@ public class IJThemesPanel
break;
}
}
}
// select first theme if none selected
if( themesList.getSelectedIndex() < 0 )
themesList.setSelectedIndex( 0 );
// select first theme if none selected
if( themesList.getSelectedIndex() < 0 )
themesList.setSelectedIndex( 0 );
}
// scroll selection into visible area
int sel = themesList.getSelectedIndex();

View File

@@ -0,0 +1,17 @@
#
# Copyright 2020 FormDev Software GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
HintPanel.backgroundColor=darken(#ffffe1,80%)

View File

@@ -0,0 +1,17 @@
#
# Copyright 2020 FormDev Software GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
HintPanel.backgroundColor=#ffffe1

View File

@@ -3,16 +3,20 @@ FlatLaf Extras
This sub-project provides some additional components and classes:
- [FlatAnimatedLafChange](src/main/java/com/formdev/flatlaf/extras/FlatAnimatedLafChange.java):
Animated Laf changing.
- [FlatInspector](src/main/java/com/formdev/flatlaf/extras/FlatInspector.java):
A simple UI inspector that shows information about UI component at mouse
location in a tooltip.
- [FlatSVGIcon](src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java): An
icon that displays SVG using
[svgSalamander](https://github.com/JFormDesigner/svgSalamander).
- [TriStateCheckBox](src/main/java/com/formdev/flatlaf/extras/TriStateCheckBox.java):
A tri-state check box.
- [FlatSVGIcon](https://www.javadoc.io/doc/com.formdev/flatlaf-extras/latest/com/formdev/flatlaf/extras/FlatSVGIcon.html):
An icon that displays SVG using
[svgSalamander](https://github.com/JFormDesigner/svgSalamander).\
![FlatSVGIcon.png](../images/extras-FlatSVGIcon.png)
- [TriStateCheckBox](https://www.javadoc.io/doc/com.formdev/flatlaf-extras/latest/com/formdev/flatlaf/extras/TriStateCheckBox.html):
A tri-state check box.\
![TriStateCheckBox.png](../images/extras-TriStateCheckBox.png)
- [FlatAnimatedLafChange](https://www.javadoc.io/doc/com.formdev/flatlaf-extras/latest/com/formdev/flatlaf/extras/FlatAnimatedLafChange.html):
Animated Laf (theme) changing.
- [FlatInspector](#ui-inspector): A simple UI inspector that shows information
about UI component at mouse location in a tooltip.
- [FlatUIDefaultsInspector](#ui-defaults-inspector): A simple UI defaults
inspector that shows a window with all UI defaults used in current theme (look
and feel).
Download
@@ -36,3 +40,45 @@ you can download here:
[![Download](https://api.bintray.com/packages/jformdesigner/flatlaf/flatlaf/images/download.svg)](https://bintray.com/jformdesigner/flatlaf/flatlaf/_latestVersion)
[![Download](https://api.bintray.com/packages/jformdesigner/svgSalamander/svgSalamander/images/download.svg)](https://bintray.com/jformdesigner/svgSalamander/svgSalamander/_latestVersion)
Tools
-----
### UI Inspector
A simple UI inspector that shows information about UI component at mouse
location in a tooltip, which may be useful while developing an application.
Should be not installed in released applications.
Once installed with following code (e.g. in method `main`), it can be activated
for the active window with the given keystroke:
~~~java
FlatInspector.install( "ctrl shift alt X" );
~~~
![UI inspector](../images/extras-FlatInspector.png)
When the UI inspector is active some additional keys are available:
- press <kbd>Esc</kbd> key to disable UI inspector
- press <kbd>Ctrl</kbd> key to increase inspection level, which shows
information about parent of UI component at mouse location
- press <kbd>Shift</kbd> key to decrease inspection level
### UI Defaults Inspector
A simple UI defaults inspector that shows a window with all UI defaults used in
current theme (look and feel), which may be useful while developing an
application. Should be not installed in released applications.
Once installed with following code (e.g. in method `main`), it can be activated
with the given keystroke:
~~~java
FlatUIDefaultsInspector.install( "ctrl shift alt Y" );
~~~
![UI Defaults Inspector](../images/extras-FlatUIDefaultsInspector.png)

View File

@@ -22,7 +22,7 @@ plugins {
dependencies {
implementation( project( ":flatlaf-core" ) )
implementation( "com.formdev:svgSalamander:1.1.2.1" )
implementation( "com.formdev:svgSalamander:1.1.2.3" )
}
flatlafModuleInfo {

View File

@@ -19,10 +19,10 @@ package com.formdev.flatlaf.extras;
import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Window;
import java.util.HashMap;
import java.awt.image.VolatileImage;
import java.util.Map;
import java.util.WeakHashMap;
import javax.swing.JComponent;
import javax.swing.JLayeredPane;
import javax.swing.RootPaneContainer;
@@ -56,8 +56,10 @@ public class FlatAnimatedLafChange
public static int resolution = 40;
private static Animator animator;
private static final Map<JLayeredPane, JComponent> map = new HashMap<>();
private static final Map<JLayeredPane, JComponent> oldUIsnapshots = new WeakHashMap<>();
private static final Map<JLayeredPane, JComponent> newUIsnapshots = new WeakHashMap<>();
private static float alpha;
private static boolean inShowSnapshot;
/**
* Create a snapshot of the old UI and shows it on top of the UI.
@@ -73,16 +75,27 @@ public class FlatAnimatedLafChange
alpha = 1;
// show snapshot of old UI
showSnapshot( true, oldUIsnapshots );
}
private static void showSnapshot( boolean useAlpha, Map<JLayeredPane, JComponent> map ) {
inShowSnapshot = true;
// create snapshots for all shown windows
Window[] windows = Window.getWindows();
for( Window window : windows ) {
if( !(window instanceof RootPaneContainer) || !window.isShowing() )
continue;
JLayeredPane layeredPane = ((RootPaneContainer)window).getLayeredPane();
// create snapshot image
// (using volatile image to have correct sub-pixel text rendering on Java 9+)
VolatileImage snapshot = window.createVolatileImage( window.getWidth(), window.getHeight() );
if( snapshot == null )
continue;
// create snapshot image of layered pane
Image snapshot = window.createImage( window.getWidth(), window.getHeight() );
// paint window to snapshot image
JLayeredPane layeredPane = ((RootPaneContainer)window).getLayeredPane();
layeredPane.paint( snapshot.getGraphics() );
// create snapshot layer, which is added to layered pane and paints
@@ -90,16 +103,32 @@ public class FlatAnimatedLafChange
JComponent snapshotLayer = new JComponent() {
@Override
public void paint( Graphics g ) {
((Graphics2D)g).setComposite( AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha ) );
if( inShowSnapshot || snapshot.contentsLost() )
return;
if( useAlpha )
((Graphics2D)g).setComposite( AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha ) );
g.drawImage( snapshot, 0, 0, null );
}
@Override
public void removeNotify() {
super.removeNotify();
// release system resources used by volatile image
snapshot.flush();
}
};
if( !useAlpha )
snapshotLayer.setOpaque( true );
snapshotLayer.setSize( layeredPane.getSize() );
// add image layer to layered pane
layeredPane.add( snapshotLayer, JLayeredPane.DRAG_LAYER );
layeredPane.add( snapshotLayer, Integer.valueOf( JLayeredPane.DRAG_LAYER + (useAlpha ? 2 : 1) ) );
map.put( layeredPane, snapshotLayer );
}
inShowSnapshot = false;
}
/**
@@ -111,9 +140,12 @@ public class FlatAnimatedLafChange
if( !FlatSystemProperties.getBoolean( "flatlaf.animatedLafChange", true ) )
return;
if( map.isEmpty() )
if( oldUIsnapshots.isEmpty() )
return;
// show snapshot of new UI
showSnapshot( false, newUIsnapshots );
// create animator
animator = new Animator( duration, fraction -> {
if( fraction < 0.1 || fraction > 0.9 )
@@ -122,7 +154,7 @@ public class FlatAnimatedLafChange
alpha = 1f - fraction;
// repaint snapshots
for( Map.Entry<JLayeredPane, JComponent> e : map.entrySet() ) {
for( Map.Entry<JLayeredPane, JComponent> e : oldUIsnapshots.entrySet() ) {
if( e.getKey().isShowing() )
e.getValue().repaint();
}
@@ -136,6 +168,11 @@ public class FlatAnimatedLafChange
}
private static void hideSnapshot() {
hideSnapshot( oldUIsnapshots );
hideSnapshot( newUIsnapshots );
}
private static void hideSnapshot( Map<JLayeredPane, JComponent> map ) {
// remove snapshots
for( Map.Entry<JLayeredPane, JComponent> e : map.entrySet() ) {
e.getKey().remove( e.getValue() );

View File

@@ -158,10 +158,20 @@ public class FlatInspector
} else if( id == KeyEvent.KEY_RELEASED && wasCtrlOrShiftKeyPressed ) {
if( keyCode == KeyEvent.VK_CONTROL ) {
inspectParentLevel++;
inspect( lastX, lastY );
int parentLevel = inspect( lastX, lastY );
// limit level
if( inspectParentLevel > parentLevel )
inspectParentLevel = parentLevel;
} else if( keyCode == KeyEvent.VK_SHIFT && inspectParentLevel > 0 ) {
inspectParentLevel--;
inspect( lastX, lastY );
int parentLevel = inspect( lastX, lastY );
// decrease level
if( inspectParentLevel > parentLevel ) {
inspectParentLevel = Math.max( parentLevel - 1, 0 );
inspect( lastX, lastY );
}
}
}
@@ -248,24 +258,28 @@ public class FlatInspector
} );
}
private void inspect( int x, int y ) {
private int inspect( int x, int y ) {
Point pt = SwingUtilities.convertPoint( rootPane.getGlassPane(), x, y, rootPane );
Component c = getDeepestComponentAt( rootPane, pt.x, pt.y );
int parentLevel = 0;
for( int i = 0; i < inspectParentLevel && c != null; i++ ) {
Container parent = c.getParent();
if( parent == null )
break;
c = parent;
parentLevel++;
}
if( c == lastComponent )
return;
return parentLevel;
lastComponent = c;
highlight( c );
showToolTip( c, x, y );
showToolTip( c, x, y, parentLevel );
return parentLevel;
}
private Component getDeepestComponentAt( Component parent, int x, int y ) {
@@ -338,7 +352,7 @@ public class FlatInspector
return c;
}
private void showToolTip( Component c, int x, int y ) {
private void showToolTip( Component c, int x, int y, int parentLevel ) {
if( c == null ) {
if( tip != null )
tip.setVisible( false );
@@ -356,7 +370,7 @@ public class FlatInspector
} else
tip.setVisible( true );
tip.setTipText( buildToolTipText( c ) );
tip.setTipText( buildToolTipText( c, parentLevel ) );
int tx = x + UIScale.scale( 8 );
int ty = y + UIScale.scale( 16 );
@@ -377,7 +391,7 @@ public class FlatInspector
tip.repaint();
}
private String buildToolTipText( Component c ) {
private static String buildToolTipText( Component c, int parentLevel ) {
String name = c.getClass().getName();
name = name.substring( name.lastIndexOf( '.' ) + 1 );
@@ -441,10 +455,10 @@ public class FlatInspector
text += "Left-to-right: " + c.getComponentOrientation().isLeftToRight() + '\n';
text += "Parent: " + (c.getParent() != null ? c.getParent().getClass().getName() : "null");
if( inspectParentLevel > 0 )
text += "\n\nParent level: " + inspectParentLevel;
if( parentLevel > 0 )
text += "\n\nParent level: " + parentLevel;
if( inspectParentLevel > 0 )
if( parentLevel > 0 )
text += "\n(press Ctrl/Shift to increase/decrease level)";
else
text += "\n\n(press Ctrl key to inspect parent)";

View File

@@ -50,11 +50,18 @@ public class FlatSVGIcon
private static final SVGUniverse svgUniverse = new SVGUniverse();
private final String name;
private final ClassLoader classLoader;
private SVGDiagram diagram;
private boolean dark;
public FlatSVGIcon( String name ) {
this( name, null );
}
public FlatSVGIcon( String name, ClassLoader classLoader ) {
this.name = name;
this.classLoader = classLoader;
}
private void update() {
@@ -79,7 +86,14 @@ public class FlatSVGIcon
int dotIndex = name.lastIndexOf( '.' );
name = name.substring( 0, dotIndex ) + "_dark" + name.substring( dotIndex );
}
return FlatSVGIcon.class.getClassLoader().getResource( name );
ClassLoader cl = (classLoader != null) ? classLoader : FlatSVGIcon.class.getClassLoader();
return cl.getResource( name );
}
public boolean hasFound() {
update();
return diagram != null;
}
@Override

View File

@@ -0,0 +1,911 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.extras;
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map.Entry;
import java.util.Set;
import java.util.function.Predicate;
import java.util.prefs.Preferences;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumnModel;
import com.formdev.flatlaf.FlatLaf;
import com.formdev.flatlaf.icons.FlatAbstractIcon;
import com.formdev.flatlaf.ui.FlatBorder;
import com.formdev.flatlaf.ui.FlatEmptyBorder;
import com.formdev.flatlaf.ui.FlatLineBorder;
import com.formdev.flatlaf.ui.FlatMarginBorder;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.formdev.flatlaf.util.GrayFilter;
import com.formdev.flatlaf.util.HSLColor;
import com.formdev.flatlaf.util.ScaledEmptyBorder;
import com.formdev.flatlaf.util.UIScale;
/**
* A simple UI defaults inspector that shows a window with all UI defaults used
* in current look and feel.
* <p>
* To use it in an application install it with:
* <pre>
* FlatUIDefaultsInspector.install( "ctrl shift alt Y" );
* </pre>
* This can be done e.g. in the main() method and allows enabling (and disabling)
* the UI defaults inspector with the given keystroke.
*
* @author Karl Tauber
*/
public class FlatUIDefaultsInspector
{
private static final int KEY_MODIFIERS_MASK = InputEvent.CTRL_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK | InputEvent.ALT_DOWN_MASK | InputEvent.META_DOWN_MASK;
private static FlatUIDefaultsInspector inspector;
private final String title;
private final PropertyChangeListener lafListener = this::lafChanged;
private final PropertyChangeListener lafDefaultsListener = this::lafDefaultsChanged;
private boolean refreshPending;
/**
* Installs a key listener into the application that allows enabling and disabling
* the UI inspector with the given keystroke (e.g. "ctrl shift alt Y").
*/
public static void install( String activationKeys ) {
KeyStroke keyStroke = KeyStroke.getKeyStroke( activationKeys );
Toolkit.getDefaultToolkit().addAWTEventListener( e -> {
if( e.getID() == KeyEvent.KEY_RELEASED &&
((KeyEvent)e).getKeyCode() == keyStroke.getKeyCode() &&
(((KeyEvent)e).getModifiersEx() & KEY_MODIFIERS_MASK) == (keyStroke.getModifiers() & KEY_MODIFIERS_MASK) )
{
show();
}
}, AWTEvent.KEY_EVENT_MASK );
}
public static void show() {
if( inspector != null ) {
inspector.ensureOnScreen();
inspector.frame.toFront();
return;
}
inspector = new FlatUIDefaultsInspector();
inspector.frame.setVisible( true );
}
public static void hide() {
if( inspector != null )
inspector.frame.dispose();
}
private FlatUIDefaultsInspector() {
initComponents();
title = frame.getTitle();
updateWindowTitle();
panel.setBorder( new ScaledEmptyBorder( 10, 10, 10, 10 ) );
filterPanel.setBorder( new ScaledEmptyBorder( 0, 0, 10, 0 ) );
// initialize filter
filterField.getDocument().addDocumentListener( new DocumentListener() {
@Override
public void removeUpdate( DocumentEvent e ) {
filterChanged();
}
@Override
public void insertUpdate( DocumentEvent e ) {
filterChanged();
}
@Override
public void changedUpdate( DocumentEvent e ) {
filterChanged();
}
} );
delegateKey( KeyEvent.VK_UP, "unitScrollUp" );
delegateKey( KeyEvent.VK_DOWN, "unitScrollDown" );
delegateKey( KeyEvent.VK_PAGE_UP, "scrollUp" );
delegateKey( KeyEvent.VK_PAGE_DOWN, "scrollDown" );
// initialize table
table.setModel( new ItemsTableModel( getUIDefaultsItems() ) );
table.setDefaultRenderer( String.class, new KeyRenderer() );
table.setDefaultRenderer( Item.class, new ValueRenderer() );
table.getRowSorter().setSortKeys( Collections.singletonList(
new RowSorter.SortKey( 0, SortOrder.ASCENDING ) ) );
// restore window bounds
Preferences prefs = getPrefs();
int x = prefs.getInt( "x", -1 );
int y = prefs.getInt( "y", -1 );
int width = prefs.getInt( "width", UIScale.scale( 600 ) );
int height = prefs.getInt( "height", UIScale.scale( 800 ) );
frame.setSize( width, height );
if( x != -1 && y != -1 ) {
frame.setLocation( x, y );
ensureOnScreen();
} else
frame.setLocationRelativeTo( null );
// restore column widths
TableColumnModel columnModel = table.getColumnModel();
columnModel.getColumn( 0 ).setPreferredWidth( prefs.getInt( "column1width", 100 ) );
columnModel.getColumn( 1 ).setPreferredWidth( prefs.getInt( "column2width", 100 ) );
// restore filter
String filter = prefs.get( "filter", "" );
String valueType = prefs.get( "valueType", null );
if( filter != null && !filter.isEmpty() )
filterField.setText( filter );
if( valueType != null )
valueTypeField.setSelectedItem( valueType );
UIManager.addPropertyChangeListener( lafListener );
UIManager.getDefaults().addPropertyChangeListener( lafDefaultsListener );
// register F5 key to refresh
((JComponent)frame.getContentPane()).registerKeyboardAction(
e -> refresh(),
KeyStroke.getKeyStroke( KeyEvent.VK_F5, 0, false ),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
// register ESC key to close frame
((JComponent)frame.getContentPane()).registerKeyboardAction(
e -> frame.dispose(),
KeyStroke.getKeyStroke( KeyEvent.VK_ESCAPE, 0, false ),
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
}
private void delegateKey( int keyCode, String actionKey ) {
KeyStroke keyStroke = KeyStroke.getKeyStroke( keyCode, 0 );
String actionMapKey = "delegate-" + actionKey;
filterField.getInputMap().put( keyStroke, actionMapKey );
filterField.getActionMap().put( actionMapKey, new AbstractAction() {
@Override
public void actionPerformed( ActionEvent e ) {
Action action = scrollPane.getActionMap().get( actionKey );
if( action != null ) {
action.actionPerformed( new ActionEvent( scrollPane,
e.getID(), actionKey, e.getWhen(), e.getModifiers() ) );
}
}
} );
}
private void ensureOnScreen() {
Rectangle frameBounds = frame.getBounds();
boolean onScreen = false;
for( GraphicsDevice screen : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices() ) {
GraphicsConfiguration gc = screen.getDefaultConfiguration();
Rectangle screenBounds = FlatUIUtils.subtractInsets( gc.getBounds(),
Toolkit.getDefaultToolkit().getScreenInsets( gc ) );
if( frameBounds.intersects( screenBounds ) ) {
onScreen = true;
break;
}
}
if( !onScreen )
frame.setLocationRelativeTo( null );
}
void lafChanged( PropertyChangeEvent e ) {
if( "lookAndFeel".equals( e.getPropertyName() ) )
refresh();
}
void lafDefaultsChanged( PropertyChangeEvent e ) {
if( refreshPending )
return;
refreshPending = true;
EventQueue.invokeLater( () -> {
refresh();
refreshPending = false;
} );
}
void refresh() {
ItemsTableModel model = (ItemsTableModel) table.getModel();
model.setItems( getUIDefaultsItems() );
updateWindowTitle();
}
private Item[] getUIDefaultsItems() {
UIDefaults defaults = UIManager.getDefaults();
UIDefaults lafDefaults = UIManager.getLookAndFeelDefaults();
Set<Entry<Object, Object>> defaultsSet = defaults.entrySet();
ArrayList<Item> items = new ArrayList<>( defaultsSet.size() );
HashSet<Object> keys = new HashSet<>( defaultsSet.size() );
for( Entry<Object,Object> e : defaultsSet ) {
Object key = e.getKey();
// ignore non-string keys
if( !(key instanceof String) )
continue;
// ignore values of type Class
Object value = defaults.get( key );
if( value instanceof Class )
continue;
// avoid duplicate keys if UIManager.put(key,value) was used to override a LaF value
if( !keys.add( key ) )
continue;
// check whether key was overridden using UIManager.put(key,value)
Object lafValue = null;
if( defaults.containsKey( key ) )
lafValue = lafDefaults.get( key );
// add item
items.add( new Item( String.valueOf( key ), value, lafValue ) );
}
return items.toArray( new Item[items.size()] );
}
private void updateWindowTitle() {
frame.setTitle( title + " - " + UIManager.getLookAndFeel().getName() );
}
private void saveWindowBounds() {
Preferences prefs = getPrefs();
prefs.putInt( "x", frame.getX() );
prefs.putInt( "y", frame.getY() );
prefs.putInt( "width", frame.getWidth() );
prefs.putInt( "height", frame.getHeight() );
TableColumnModel columnModel = table.getColumnModel();
prefs.putInt( "column1width", columnModel.getColumn( 0 ).getWidth() );
prefs.putInt( "column2width", columnModel.getColumn( 1 ).getWidth() );
}
private Preferences getPrefs() {
return Preferences.userRoot().node( "flatlaf-uidefaults-inspector" );
}
private void windowClosed() {
UIManager.removePropertyChangeListener( lafListener );
UIManager.getDefaults().removePropertyChangeListener( lafDefaultsListener );
inspector = null;
}
private void filterChanged() {
String filter = filterField.getText().trim();
String valueType = (String) valueTypeField.getSelectedItem();
// split filter string on space characters
String[] filters = filter.split( " +" );
for( int i = 0; i < filters.length; i++ )
filters[i] = filters[i].toLowerCase( Locale.ENGLISH );
ItemsTableModel model = (ItemsTableModel) table.getModel();
model.setFilter( item -> {
if( valueType != null &&
!valueType.equals( "(any)" ) &&
!valueType.equals( typeOfValue( item.value ) ) )
return false;
String lkey = item.key.toLowerCase( Locale.ENGLISH );
String lvalue = item.getValueAsString().toLowerCase( Locale.ENGLISH );
for( String f : filters ) {
if( lkey.contains( f ) || lvalue.contains( f ) )
return true;
}
return false;
} );
Preferences prefs = getPrefs();
prefs.put( "filter", filter );
prefs.put( "valueType", valueType );
}
private String typeOfValue( Object value ) {
if( value instanceof Boolean )
return "Boolean";
if( value instanceof Border )
return "Border";
if( value instanceof Color )
return "Color";
if( value instanceof Dimension )
return "Dimension";
if( value instanceof Float )
return "Float";
if( value instanceof Font )
return "Font";
if( value instanceof Icon )
return "Icon";
if( value instanceof Insets )
return "Insets";
if( value instanceof Integer )
return "Integer";
if( value instanceof String )
return "String";
return "(other)";
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
frame = new JFrame();
panel = new JPanel();
filterPanel = new JPanel();
flterLabel = new JLabel();
filterField = new JTextField();
valueTypeLabel = new JLabel();
valueTypeField = new JComboBox<>();
scrollPane = new JScrollPane();
table = new JTable();
//======== frame ========
{
frame.setTitle("UI Defaults Inspector");
frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
FlatUIDefaultsInspector.this.windowClosed();
}
@Override
public void windowClosing(WindowEvent e) {
saveWindowBounds();
}
@Override
public void windowDeactivated(WindowEvent e) {
saveWindowBounds();
}
});
Container frameContentPane = frame.getContentPane();
frameContentPane.setLayout(new BorderLayout());
//======== panel ========
{
panel.setLayout(new BorderLayout());
//======== filterPanel ========
{
filterPanel.setLayout(new GridBagLayout());
((GridBagLayout)filterPanel.getLayout()).columnWidths = new int[] {0, 0, 0, 0, 0};
((GridBagLayout)filterPanel.getLayout()).rowHeights = new int[] {0, 0};
((GridBagLayout)filterPanel.getLayout()).columnWeights = new double[] {0.0, 1.0, 0.0, 0.0, 1.0E-4};
((GridBagLayout)filterPanel.getLayout()).rowWeights = new double[] {0.0, 1.0E-4};
//---- flterLabel ----
flterLabel.setText("Filter:");
flterLabel.setLabelFor(filterField);
flterLabel.setDisplayedMnemonic('F');
filterPanel.add(flterLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 10), 0, 0));
//---- filterField ----
filterField.putClientProperty("JTextField.placeholderText", "enter one or more filter strings, separated by space characters");
filterPanel.add(filterField, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 10), 0, 0));
//---- valueTypeLabel ----
valueTypeLabel.setText("Value Type:");
valueTypeLabel.setLabelFor(valueTypeField);
valueTypeLabel.setDisplayedMnemonic('T');
filterPanel.add(valueTypeLabel, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 10), 0, 0));
//---- valueTypeField ----
valueTypeField.setModel(new DefaultComboBoxModel<>(new String[] {
"(any)",
"Boolean",
"Border",
"Color",
"Dimension",
"Float",
"Font",
"Icon",
"Insets",
"Integer",
"String",
"(other)"
}));
valueTypeField.addActionListener(e -> filterChanged());
filterPanel.add(valueTypeField, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
}
panel.add(filterPanel, BorderLayout.NORTH);
//======== scrollPane ========
{
//---- table ----
table.setAutoCreateRowSorter(true);
scrollPane.setViewportView(table);
}
panel.add(scrollPane, BorderLayout.CENTER);
}
frameContentPane.add(panel, BorderLayout.CENTER);
}
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JFrame frame;
private JPanel panel;
private JPanel filterPanel;
private JLabel flterLabel;
private JTextField filterField;
private JLabel valueTypeLabel;
private JComboBox<String> valueTypeField;
private JScrollPane scrollPane;
private JTable table;
// JFormDesigner - End of variables declaration //GEN-END:variables
//---- class Item ---------------------------------------------------------
private static class Item {
final String key;
final Object value;
final Object lafValue;
private String valueStr;
Item( String key, Object value, Object lafValue ) {
this.key = key;
this.value = value;
this.lafValue = lafValue;
}
String getValueAsString() {
if( valueStr == null )
valueStr = valueAsString( value );
return valueStr;
}
static String valueAsString( Object value ) {
if( value instanceof Color ) {
Color color = (Color) value;
HSLColor hslColor = new HSLColor( color );
if( color.getAlpha() == 255 ) {
return String.format( "%s rgb(%d, %d, %d) hsl(%d, %d, %d)",
color2hex( color ),
color.getRed(), color.getGreen(), color.getBlue(),
(int) hslColor.getHue(), (int) hslColor.getSaturation(),
(int) hslColor.getLuminance() );
} else {
return String.format( "%s rgba(%d, %d, %d, %d) hsla(%d, %d, %d, %d)",
color2hex( color ),
color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha(),
(int) hslColor.getHue(), (int) hslColor.getSaturation(),
(int) hslColor.getLuminance(), (int) (hslColor.getAlpha() * 100) );
}
} else if( value instanceof Insets ) {
Insets insets = (Insets) value;
return insets.top + "," + insets.left + "," + insets.bottom + "," + insets.right;
} else if( value instanceof Dimension ) {
Dimension dim = (Dimension) value;
return dim.width + "," + dim.height;
} else if( value instanceof Font ) {
Font font = (Font) value;
String s = font.getFamily() + " " + font.getSize();
if( font.isBold() )
s += " bold";
if( font.isItalic() )
s += " italic";
return s;
} else if( value instanceof Icon ) {
Icon icon = (Icon) value;
return icon.getIconWidth() + "x" + icon.getIconHeight() + " " + icon.getClass().getName();
} else if( value instanceof Border ) {
Border border = (Border) value;
if( border instanceof FlatLineBorder ) {
FlatLineBorder lineBorder = (FlatLineBorder) border;
return valueAsString( lineBorder.getUnscaledBorderInsets() )
+ " " + Item.color2hex( lineBorder.getLineColor() )
+ " " + lineBorder.getLineThickness()
+ " " + border.getClass().getName();
} else if( border instanceof EmptyBorder ) {
Insets insets = (border instanceof FlatEmptyBorder)
? ((FlatEmptyBorder)border).getUnscaledBorderInsets()
: ((EmptyBorder)border).getBorderInsets();
return valueAsString( insets ) + " " + border.getClass().getName();
} else if( border instanceof FlatBorder || border instanceof FlatMarginBorder )
return border.getClass().getName();
else
return String.valueOf( value );
} else if( value instanceof GrayFilter ) {
GrayFilter grayFilter = (GrayFilter) value;
return grayFilter.getBrightness() + "," + grayFilter.getContrast()
+ " " + grayFilter.getAlpha() + " " + grayFilter.getClass().getName();
} else if( value instanceof ActionMap ) {
ActionMap actionMap = (ActionMap) value;
return "ActionMap (" + actionMap.size() + ")";
} else if( value instanceof InputMap ) {
InputMap inputMap = (InputMap) value;
return "InputMap (" + inputMap.size() + ")";
} else if( value instanceof Object[] )
return Arrays.toString( (Object[]) value );
else if( value instanceof int[] )
return Arrays.toString( (int[]) value );
else
return String.valueOf( value );
}
private static String color2hex( Color color ) {
int rgb = color.getRGB();
boolean hasAlpha = color.getAlpha() != 255;
boolean useShortFormat =
(rgb & 0xf0000000) == (rgb & 0xf000000) << 4 &&
(rgb & 0xf00000) == (rgb & 0xf0000) << 4 &&
(rgb & 0xf000) == (rgb & 0xf00) << 4 &&
(rgb & 0xf0) == (rgb & 0xf) << 4;
if( useShortFormat ) {
int srgb = ((rgb & 0xf0000) >> 8) | ((rgb & 0xf00) >> 4) | (rgb & 0xf);
return String.format( hasAlpha ? "#%03X%X" : "#%03X", srgb, (rgb >> 24) & 0xf );
} else
return String.format( hasAlpha ? "#%06X%02X" : "#%06X", rgb & 0xffffff, (rgb >> 24) & 0xff );
}
// used for sorting by value
@Override
public String toString() {
return getValueAsString();
}
}
//---- class ItemsTableModel ----------------------------------------------
private static class ItemsTableModel
extends AbstractTableModel
{
private Item[] allItems;
private Item[] items;
private Predicate<Item> filter;
ItemsTableModel( Item[] items ) {
this.allItems = this.items = items;
}
void setItems( Item[] items ) {
this.allItems = this.items = items;
setFilter( filter );
}
void setFilter( Predicate<Item> filter ) {
this.filter = filter;
if( filter != null ) {
ArrayList<Item> list = new ArrayList<>( allItems.length );
for( Item item : allItems ) {
if( filter.test( item ) )
list.add( item );
}
items = list.toArray( new Item[list.size()] );
} else
items = allItems;
fireTableDataChanged();
}
@Override
public int getRowCount() {
return items.length;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public String getColumnName( int columnIndex ) {
switch( columnIndex ) {
case 0: return "Name";
case 1: return "Value";
}
return super.getColumnName( columnIndex );
}
@Override
public Class<?> getColumnClass( int columnIndex ) {
switch( columnIndex ) {
case 0: return String.class;
case 1: return Item.class;
}
return super.getColumnClass( columnIndex );
}
@Override
public Object getValueAt( int rowIndex, int columnIndex ) {
Item item = items[rowIndex];
switch( columnIndex ) {
case 0: return item.key;
case 1: return item;
}
return null;
}
}
//---- class Renderer -----------------------------------------------------
private static class Renderer
extends DefaultTableCellRenderer
{
protected boolean selected;
protected boolean first;
protected void init( JTable table, String key, boolean selected, int row ) {
this.selected = selected;
first = false;
if( row > 0 ) {
String previousKey = (String) table.getValueAt( row - 1, 0 );
int dot = key.indexOf( '.' );
if( dot > 0 ) {
String prefix = key.substring( 0, dot + 1 );
first = !previousKey.startsWith( prefix );
} else
first = previousKey.indexOf( '.' ) > 0;
}
}
protected void paintSeparator( Graphics g ) {
if( first && !selected ) {
g.setColor( FlatLaf.isLafDark() ? Color.gray : Color.lightGray );
g.fillRect( 0, 0, getWidth() - 1, 1 );
}
}
protected String layoutLabel( FontMetrics fm, String text, Rectangle textR ) {
int width = getWidth();
int height = getHeight();
Insets insets = getInsets();
Rectangle viewR = new Rectangle( insets.left, insets.top,
width - (insets.left + insets.right),
height - (insets.top + insets.bottom) );
Rectangle iconR = new Rectangle();
return SwingUtilities.layoutCompoundLabel( this, fm, text, null,
getVerticalAlignment(), getHorizontalAlignment(),
getVerticalTextPosition(), getHorizontalTextPosition(),
viewR, iconR, textR, getIconTextGap() );
}
}
//---- class KeyRenderer --------------------------------------------------
private static class KeyRenderer
extends Renderer
{
private String key;
private boolean isOverridden;
private Icon overriddenIcon;
@Override
public Component getTableCellRendererComponent( JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column )
{
key = (String) value;
init( table, key, isSelected, row );
Item item = (Item) table.getValueAt( row, 1 );
isOverridden = (item.lafValue != null);
// set tooltip
String toolTipText = key;
if( isOverridden )
toolTipText += " \n\nLaF UI default value was overridden with UIManager.put(key,value).";
setToolTipText( toolTipText );
return super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
}
@Override
protected void paintComponent( Graphics g ) {
g.setColor( getBackground() );
g.fillRect( 0, 0, getWidth(), getHeight() );
FontMetrics fm = getFontMetrics( getFont() );
Rectangle textR = new Rectangle();
String clippedText = layoutLabel( fm, key, textR );
int x = textR.x;
int y = textR.y + fm.getAscent();
int dot = key.indexOf( '.' );
if( dot > 0 && !selected ) {
g.setColor( UIManager.getColor( "Label.disabledForeground" ) );
if( dot >= clippedText.length() )
FlatUIUtils.drawString( this, g, clippedText, x, y );
else {
String prefix = clippedText.substring( 0, dot + 1 );
String subkey = clippedText.substring( dot + 1 );
FlatUIUtils.drawString( this, g, prefix, x, y );
g.setColor( getForeground() );
FlatUIUtils.drawString( this, g, subkey, x + fm.stringWidth( prefix ), y );
}
} else {
g.setColor( getForeground() );
FlatUIUtils.drawString( this, g, clippedText, x, y );
}
if( isOverridden ) {
if( overriddenIcon == null ) {
overriddenIcon = new FlatAbstractIcon( 16, 16, null ) {
@Override
protected void paintIcon( Component c, Graphics2D g2 ) {
g2.setColor( FlatUIUtils.getUIColor( "Actions.Red", Color.red ) );
g2.setStroke( new BasicStroke( 2f ) );
g2.draw( FlatUIUtils.createPath( false, 3,10, 8,5, 13,10 ) );
}
};
}
overriddenIcon.paintIcon( this, g,
getWidth() - overriddenIcon.getIconWidth(),
(getHeight() - overriddenIcon.getIconHeight()) / 2 );
}
paintSeparator( g );
}
}
//---- class ValueRenderer ------------------------------------------------
private static class ValueRenderer
extends Renderer
{
private Item item;
@Override
public Component getTableCellRendererComponent( JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column )
{
item = (Item) value;
init( table, item.key, isSelected, row );
// reset background, foreground and icon
if( !(item.value instanceof Color) ) {
setBackground( null );
setForeground( null );
}
if( !(item.value instanceof Icon) )
setIcon( null );
// value to string
value = item.getValueAsString();
super.getTableCellRendererComponent( table, value, isSelected, hasFocus, row, column );
if( item.value instanceof Color ) {
Color color = (Color) item.value;
boolean isDark = new HSLColor( color ).getLuminance() < 70;
setBackground( color );
setForeground( isDark ? Color.white : Color.black );
} else if( item.value instanceof Icon ) {
Icon icon = (Icon) item.value;
setIcon( new SafeIcon( icon ) );
}
// set tooltip
String toolTipText = String.valueOf( item.value );
if( item.lafValue != null ) {
toolTipText += " \n\nLaF UI default value was overridden with UIManager.put(key,value):\n "
+ Item.valueAsString( item.lafValue ) + "\n " + String.valueOf( item.lafValue );
}
setToolTipText( toolTipText );
return this;
}
@Override
protected void paintComponent( Graphics g ) {
if( item.value instanceof Color ) {
// fill background
g.setColor( getBackground() );
g.fillRect( 0, 0, getWidth(), getHeight() );
// layout text
FontMetrics fm = getFontMetrics( getFont() );
String text = getText();
Rectangle textR = new Rectangle();
layoutLabel( fm, text, textR );
int x = textR.x;
int y = textR.y + fm.getAscent();
g.setColor( getForeground() );
// paint rgb() and hsl() horizontally aligned
int rgbIndex = text.indexOf( "rgb" );
int hslIndex = text.indexOf( "hsl" );
if( rgbIndex > 0 && hslIndex > rgbIndex ) {
String hexText = text.substring( 0, rgbIndex );
String rgbText = text.substring( rgbIndex, hslIndex );
String hslText = text.substring( hslIndex );
int hexWidth = Math.max( fm.stringWidth( hexText ), fm.stringWidth( "#DDDDDD " ) );
int rgbWidth = Math.max( fm.stringWidth( rgbText ), fm.stringWidth( "rgb(444, 444, 444) " ) );
FlatUIUtils.drawString( this, g, hexText, x, y );
FlatUIUtils.drawString( this, g, rgbText, x + hexWidth, y );
FlatUIUtils.drawString( this, g, hslText, x + hexWidth + rgbWidth, y );
} else
FlatUIUtils.drawString( this, g, text, x, y );
} else
super.paintComponent( g );
paintSeparator( g );
}
}
//---- class SafeIcon -----------------------------------------------------
private static class SafeIcon
implements Icon
{
private final Icon icon;
SafeIcon( Icon icon ) {
this.icon = icon;
}
@Override
public void paintIcon( Component c, Graphics g, int x, int y ) {
int width = getIconWidth();
int height = getIconHeight();
try {
g.setColor( UIManager.getColor( "Panel.background" ) );
g.fillRect( x, y, width, height );
icon.paintIcon( c, g, x, y );
} catch( Exception ex ) {
g.setColor( Color.red );
g.drawRect( x, y, width - 1, height - 1 );
}
}
@Override
public int getIconWidth() {
return icon.getIconWidth();
}
@Override
public int getIconHeight() {
return icon.getIconHeight();
}
}
}

View File

@@ -0,0 +1,90 @@
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
root: new FormRoot {
add( new FormWindow( "javax.swing.JFrame", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "frame"
"title": "UI Defaults Inspector"
"defaultCloseOperation": 2
"$sizePolicy": 2
"$locationPolicy": 2
addEvent( new FormEvent( "java.awt.event.WindowListener", "windowClosed", "windowClosed", false ) )
addEvent( new FormEvent( "java.awt.event.WindowListener", "windowClosing", "saveWindowBounds", false ) )
addEvent( new FormEvent( "java.awt.event.WindowListener", "windowDeactivated", "saveWindowBounds", false ) )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "panel"
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.GridBagLayout ) {
"$columnSpecs": "0, 0:1.0, 0, 0"
"$rowSpecs": "0"
"$hGap": 10
"$vGap": 5
"$alignLeft": true
"$alignTop": true
} ) {
name: "filterPanel"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "flterLabel"
"text": "Filter:"
"labelFor": new FormReference( "filterField" )
"displayedMnemonic": 70
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) )
add( new FormComponent( "javax.swing.JTextField" ) {
name: "filterField"
"$client.JTextField.placeholderText": "enter one or more filter strings, separated by space characters"
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) {
"gridx": 1
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "valueTypeLabel"
"text": "Value Type:"
"labelFor": new FormReference( "valueTypeField" )
"displayedMnemonic": 84
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) {
"gridx": 2
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "valueTypeField"
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "(any)"
addElement( "(any)" )
addElement( "Boolean" )
addElement( "Border" )
addElement( "Color" )
addElement( "Dimension" )
addElement( "Float" )
addElement( "Font" )
addElement( "Icon" )
addElement( "Insets" )
addElement( "Integer" )
addElement( "String" )
addElement( "(other)" )
}
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "filterChanged", false ) )
}, new FormLayoutConstraints( class com.jformdesigner.runtime.GridBagConstraintsEx ) {
"gridx": 3
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "North"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane"
add( new FormComponent( "javax.swing.JTable" ) {
name: "table"
"autoCreateRowSorter": true
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 400, 300 )
} )
}
}

View File

@@ -19,6 +19,7 @@
*/
module com.formdev.flatlaf.extras {
requires java.desktop;
requires java.prefs;
requires static com.kitfox.svg; // optional at runtime
requires com.formdev.flatlaf;

View File

@@ -23,6 +23,8 @@
},
"ui": {
"*": {
"acceleratorForeground": "colorAcceleratorForeground",
"acceleratorSelectionForeground": "colorAcceleratorSelectionForeground",
"background": "colorBackground",
"caretForeground": "colorForeground",
"disabledForeground": "colorDisabledForeground",
@@ -68,10 +70,7 @@
"startBorderColor": "#476069"
},
"CheckBox": {},
"CheckBoxMenuItem": {
"acceleratorForeground": "colorAcceleratorForeground",
"acceleratorSelectionForeground": "colorAcceleratorSelectionForeground"
},
"CheckBoxMenuItem": {},
"ColorChooser": {
"swatchesDefaultRecentColor": "colorBackground"
},
@@ -257,8 +256,6 @@
"usedBackground": "#566C73"
},
"Menu": {
"acceleratorForeground": "colorAcceleratorForeground",
"acceleratorSelectionForeground": "colorAcceleratorSelectionForeground",
"borderColor": "colorSeparator",
"separatorColor": "colorSeparator"
},
@@ -372,10 +369,7 @@
"trackColor": "#36525B"
},
"RadioButton": {},
"RadioButtonMenuItem": {
"acceleratorForeground": "colorAcceleratorForeground",
"acceleratorSelectionForeground": "colorAcceleratorSelectionForeground"
},
"RadioButtonMenuItem": {},
"ScrollBar": {
"background": "#14414F",
"hoverThumbBorderColor": "#0A384459",
@@ -441,6 +435,11 @@
"Separator": {
"separatorColor": "colorSeparator"
},
"Settings": {
"Spotlight": {
"borderColor": "#9A670064"
}
},
"SidePanel": {
"background": "#0E4155"
},

View File

@@ -23,6 +23,8 @@
},
"ui": {
"*": {
"acceleratorForeground": "colorAcceleratorForeground",
"acceleratorSelectionForeground": "colorAcceleratorSelectionForeground",
"background": "colorBackground",
"caretForeground": "colorForeground",
"disabledForeground": "colorDisabledForeground",
@@ -68,10 +70,7 @@
"startBorderColor": "#B4BAB5"
},
"CheckBox": {},
"CheckBoxMenuItem": {
"acceleratorForeground": "colorAcceleratorForeground",
"acceleratorSelectionForeground": "colorAcceleratorSelectionForeground"
},
"CheckBoxMenuItem": {},
"ColorChooser": {
"swatchesDefaultRecentColor": "#CFD0C3"
},
@@ -263,8 +262,6 @@
"usedBackground": "#ADB5AF"
},
"Menu": {
"acceleratorForeground": "colorAcceleratorForeground",
"acceleratorSelectionForeground": "colorAcceleratorSelectionForeground",
"borderColor": "#D3D2C6",
"disabledBackground": "colorBackground",
"separatorColor": "colorSeparator"
@@ -378,10 +375,7 @@
"trackColor": "#BAC0B8"
},
"RadioButton": {},
"RadioButtonMenuItem": {
"acceleratorForeground": "colorAcceleratorForeground",
"acceleratorSelectionForeground": "colorAcceleratorSelectionForeground"
},
"RadioButtonMenuItem": {},
"ScrollBar": {
"background": "#F5F0E3",
"hoverThumbBorderColor": "#4B5A5F47",
@@ -445,6 +439,11 @@
"Separator": {
"separatorColor": "colorSeparator"
},
"Settings": {
"Spotlight": {
"borderColor": "#F6C00064"
}
},
"SidePanel": {
"background": "#E2E2D4"
},

View File

@@ -16,7 +16,7 @@
#---- BusyLabel ----
JXBusyLabel.baseColor=#777777
JXBusyLabel.baseColor=#777
JXBusyLabel.highlightColor=#e0e0e0
@@ -38,8 +38,8 @@ Hyperlink.disabledText=@disabledText
JXMonthView.background=@textComponentBackground
JXMonthView.monthStringBackground=#4c5052
JXMonthView.monthStringForeground=@foreground
JXMonthView.daysOfTheWeekForeground=#aaaaaa
JXMonthView.weekOfTheYearForeground=#888888
JXMonthView.daysOfTheWeekForeground=#aaa
JXMonthView.weekOfTheYearForeground=#888
JXMonthView.unselectableDayForeground=#E05555
JXMonthView.selectedBackground=@selectionBackground
JXMonthView.flaggedDayForeground=#E05555
@@ -63,7 +63,7 @@ TaskPane.contentInsets=10,10,10,10
TaskPane.titleBackgroundGradientStart=#4c5052
TaskPane.titleForeground=@foreground
TaskPane.titleOver=#888888
TaskPane.titleOver=#888
TaskPane.specialTitleBackground=#afafaf
TaskPane.specialTitleForeground=#222222
TaskPane.specialTitleOver=#666666
TaskPane.specialTitleForeground=#222
TaskPane.specialTitleOver=#666

View File

@@ -23,7 +23,7 @@ JXBusyLabel.highlightColor=#808080
#---- Header ----
JXHeader.background=@background
JXHeader.startBackground=#ffffff
JXHeader.startBackground=#fff
#---- Hyperlink ----
@@ -38,8 +38,8 @@ Hyperlink.disabledText=@disabledText
JXMonthView.background=@textComponentBackground
JXMonthView.monthStringBackground=#dfdfdf
JXMonthView.monthStringForeground=@foreground
JXMonthView.daysOfTheWeekForeground=#444444
JXMonthView.weekOfTheYearForeground=#666666
JXMonthView.daysOfTheWeekForeground=#444
JXMonthView.weekOfTheYearForeground=#666
JXMonthView.unselectableDayForeground=#E02222
JXMonthView.selectedBackground=#B9CEF8
JXMonthView.flaggedDayForeground=#E02222
@@ -62,8 +62,8 @@ TaskPane.borderColor=$Button.borderColor
TaskPane.contentInsets=10,10,10,10
TaskPane.titleBackgroundGradientStart=#dfdfdf
TaskPane.titleForeground=#222222
TaskPane.titleOver=#666666
TaskPane.titleForeground=#222
TaskPane.titleOver=#666
TaskPane.specialTitleBackground=#afafaf
TaskPane.specialTitleForeground=#222222
TaskPane.specialTitleOver=#666666
TaskPane.specialTitleForeground=#222
TaskPane.specialTitleOver=#666

View File

@@ -22,8 +22,15 @@ import java.awt.EventQueue;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import com.formdev.flatlaf.icons.FlatMenuArrowIcon;
import net.miginfocom.swing.*;
@@ -40,8 +47,78 @@ public class FlatComponents2Test
} );
}
private final TestListModel listModel;
private final TestTreeModel treeModel;
private final TestTableModel tableModel;
FlatComponents2Test() {
initComponents();
// list model
listModel = new TestListModel( (Integer) listRowCountSpinner.getValue() );
list1.setModel( listModel );
list2.setModel( listModel );
// tree model
treeModel = new TestTreeModel( (Integer) treeRowCountSpinner.getValue() );
tree1.setModel( treeModel );
tree2.setModel( treeModel );
// table model
tableModel = new TestTableModel( (Integer) tableRowCountSpinner.getValue() );
table1.setModel( tableModel );
// table column editors
TableColumnModel cm = table1.getColumnModel();
String[] months = new String[] {
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
};
cm.getColumn(2).setCellEditor( new DefaultCellEditor( new JComboBox<>( months ) ) );
JComboBox<String> editableComboBox = new JComboBox<>( months );
editableComboBox.setEditable( true );
cm.getColumn(3).setCellEditor( new DefaultCellEditor( editableComboBox ) );
expandTree( tree1 );
expandTree( tree2 );
}
private void expandTree( JTree tree ) {
int count = tree.getRowCount();
for( int i = count - 1; i >= 0; i-- )
tree.expandRow( i );
}
private void listRowCountChanged() {
listModel.setSize( (Integer) listRowCountSpinner.getValue() );
}
private void treeRowCountChanged() {
int rowCount = (Integer) treeRowCountSpinner.getValue();
// round to 20
if( rowCount % 20 != 0 ) {
rowCount += 20 - (rowCount % 20);
treeRowCountSpinner.setValue( rowCount );
}
int oldCount1 = tree1.getRowCount();
int oldCount2 = tree2.getRowCount();
treeModel.setRowCount( rowCount );
int newCount1 = tree1.getRowCount();
int newCount2 = tree2.getRowCount();
// expand added rows
for( int i = newCount1 - 1; i >= oldCount1; i-- )
tree1.expandRow( i );
for( int i = newCount2 - 1; i >= oldCount2; i-- )
tree2.expandRow( i );
}
private void tableRowCountChanged() {
tableModel.setRowCount( (Integer) tableRowCountSpinner.getValue() );
}
private void dndChanged() {
@@ -121,7 +198,6 @@ public class FlatComponents2Test
} );
}
@SuppressWarnings( { "unchecked", "rawtypes" } )
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
JLabel textFieldLabel = new JLabel();
@@ -132,37 +208,45 @@ public class FlatComponents2Test
list1 = new JList<>();
JScrollPane scrollPane2 = new JScrollPane();
list2 = new JList<>();
JPanel listOptionsPanel = new JPanel();
JLabel listRowCountLabel = new JLabel();
listRowCountSpinner = new JSpinner();
JLabel treeLabel = new JLabel();
JScrollPane scrollPane3 = new JScrollPane();
tree1 = new JTree();
JScrollPane scrollPane4 = new JScrollPane();
tree2 = new JTree();
JPanel treeOptionsPanel = new JPanel();
JLabel treeRowCountLabel = new JLabel();
treeRowCountSpinner = new JSpinner();
JLabel tableLabel = new JLabel();
scrollPane5 = new JScrollPane();
table1 = new JTable();
dndCheckBox = new JCheckBox();
tableHeaderButtonCheckBox = new JCheckBox();
rowSelectionCheckBox = new JCheckBox();
columnSelectionCheckBox = new JCheckBox();
JPanel tableOptionsPanel = new JPanel();
JLabel tableRowCountLabel = new JLabel();
tableRowCountSpinner = new JSpinner();
showHorizontalLinesCheckBox = new JCheckBox();
showVerticalLinesCheckBox = new JCheckBox();
intercellSpacingCheckBox = new JCheckBox();
redGridColorCheckBox = new JCheckBox();
rowSelectionCheckBox = new JCheckBox();
columnSelectionCheckBox = new JCheckBox();
dndCheckBox = new JCheckBox();
tableHeaderButtonCheckBox = new JCheckBox();
//======== this ========
setLayout(new MigLayout(
"ltr,insets dialog,hidemode 3",
// columns
"[]" +
"[200]" +
"[200]",
"[200,fill]" +
"[200,fill]" +
"[fill]",
// rows
"[]" +
"[]" +
"[::200]" +
"[150,grow]" +
"[]" +
"[]"));
"[150,grow,sizegroup 1,fill]" +
"[150,grow,sizegroup 1,fill]" +
"[150,grow,sizegroup 1,fill]"));
//---- textFieldLabel ----
textFieldLabel.setText("JTextField:");
@@ -179,74 +263,47 @@ public class FlatComponents2Test
//---- listLabel ----
listLabel.setText("JList:");
add(listLabel, "cell 0 1");
add(listLabel, "cell 0 1,aligny top,growy 0");
//======== scrollPane1 ========
{
//---- list1 ----
list1.setModel(new AbstractListModel<String>() {
String[] values = {
"item 1",
"item 2",
"item 3",
"item 4",
"item 5",
"item 6",
"item 7",
"item 8",
"item 9",
"item 10",
"item 11",
"item 12",
"item 13",
"item 14",
"item 15"
};
@Override
public int getSize() { return values.length; }
@Override
public String getElementAt(int i) { return values[i]; }
});
scrollPane1.setViewportView(list1);
}
add(scrollPane1, "cell 1 1,growx");
add(scrollPane1, "cell 1 1");
//======== scrollPane2 ========
{
//---- list2 ----
list2.setModel(new AbstractListModel<String>() {
String[] values = {
"item 1",
"item 2",
"item 3",
"item 4",
"item 5",
"item 6",
"item 7",
"item 8",
"item 9",
"item 10",
"item 11",
"item 12",
"item 13",
"item 14",
"item 15"
};
@Override
public int getSize() { return values.length; }
@Override
public String getElementAt(int i) { return values[i]; }
});
list2.setEnabled(false);
scrollPane2.setViewportView(list2);
}
add(scrollPane2, "cell 2 1,growx");
add(scrollPane2, "cell 2 1");
//======== listOptionsPanel ========
{
listOptionsPanel.setLayout(new MigLayout(
"hidemode 3",
// columns
"[fill]" +
"[90,fill]",
// rows
"[]"));
//---- listRowCountLabel ----
listRowCountLabel.setText("Row count:");
listOptionsPanel.add(listRowCountLabel, "cell 0 0");
//---- listRowCountSpinner ----
listRowCountSpinner.setModel(new SpinnerNumberModel(20, 0, null, 10));
listRowCountSpinner.addChangeListener(e -> listRowCountChanged());
listOptionsPanel.add(listRowCountSpinner, "cell 1 0");
}
add(listOptionsPanel, "cell 3 1");
//---- treeLabel ----
treeLabel.setText("JTree:");
add(treeLabel, "cell 0 2");
add(treeLabel, "cell 0 2,aligny top,growy 0");
//======== scrollPane3 ========
{
@@ -256,7 +313,7 @@ public class FlatComponents2Test
tree1.setEditable(true);
scrollPane3.setViewportView(tree1);
}
add(scrollPane3, "cell 1 2,growx");
add(scrollPane3, "cell 1 2");
//======== scrollPane4 ========
{
@@ -265,151 +322,156 @@ public class FlatComponents2Test
tree2.setEnabled(false);
scrollPane4.setViewportView(tree2);
}
add(scrollPane4, "cell 2 2,growx");
add(scrollPane4, "cell 2 2");
//======== treeOptionsPanel ========
{
treeOptionsPanel.setLayout(new MigLayout(
"hidemode 3",
// columns
"[fill]" +
"[90,fill]",
// rows
"[]"));
//---- treeRowCountLabel ----
treeRowCountLabel.setText("Row count:");
treeOptionsPanel.add(treeRowCountLabel, "cell 0 0");
//---- treeRowCountSpinner ----
treeRowCountSpinner.setModel(new SpinnerNumberModel(20, 20, null, 20));
treeRowCountSpinner.addChangeListener(e -> treeRowCountChanged());
treeOptionsPanel.add(treeRowCountSpinner, "cell 1 0");
}
add(treeOptionsPanel, "cell 3 2");
//---- tableLabel ----
tableLabel.setText("JTable:");
add(tableLabel, "cell 0 3");
add(tableLabel, "cell 0 3,aligny top,growy 0");
//======== scrollPane5 ========
{
//---- table1 ----
table1.setModel(new DefaultTableModel(
new Object[][] {
{"item 1", "item 1b", "January", "July", 123, null},
{"item 2", "item 2b", "February", "August", 456, true},
{"item 3", null, "March", null, null, null},
{"item 4", null, "April", null, null, null},
{"item 5", null, "May", null, null, null},
{"item 6", null, "June", null, null, null},
{"item 7", null, "July", null, null, null},
{"item 8", null, "August", null, null, null},
{"item 9", null, "September", null, null, null},
{"item 10", null, "October", null, null, null},
{"item 11", null, "November", null, null, null},
{"item 12", null, "December", null, null, null},
},
new String[] {
"Not editable", "Text", "Combo", "Combo Editable", "Integer", "Boolean"
}
) {
Class<?>[] columnTypes = new Class<?>[] {
Object.class, Object.class, String.class, String.class, Integer.class, Boolean.class
};
boolean[] columnEditable = new boolean[] {
false, true, true, true, true, true
};
@Override
public Class<?> getColumnClass(int columnIndex) {
return columnTypes[columnIndex];
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnEditable[columnIndex];
}
});
{
TableColumnModel cm = table1.getColumnModel();
cm.getColumn(2).setCellEditor(new DefaultCellEditor(
new JComboBox(new DefaultComboBoxModel(new String[] {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
}))));
cm.getColumn(3).setCellEditor(new DefaultCellEditor(
new JComboBox(new DefaultComboBoxModel(new String[] {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
}))));
}
table1.setAutoCreateRowSorter(true);
scrollPane5.setViewportView(table1);
}
add(scrollPane5, "cell 1 3 2 1,growx,width 300");
add(scrollPane5, "cell 1 3 2 1,width 300");
//---- dndCheckBox ----
dndCheckBox.setText("enable drag and drop");
dndCheckBox.setMnemonic('D');
dndCheckBox.addActionListener(e -> dndChanged());
add(dndCheckBox, "cell 0 4 3 1");
//======== tableOptionsPanel ========
{
tableOptionsPanel.setLayout(new MigLayout(
"hidemode 3",
// columns
"[]" +
"[90,fill]",
// rows
"[]" +
"[]0" +
"[]0" +
"[]0" +
"[]0" +
"[]0" +
"[]0" +
"[]0" +
"[]"));
//---- tableHeaderButtonCheckBox ----
tableHeaderButtonCheckBox.setText("show button in table header");
tableHeaderButtonCheckBox.addActionListener(e -> tableHeaderButtonChanged());
add(tableHeaderButtonCheckBox, "cell 0 4 3 1");
//---- tableRowCountLabel ----
tableRowCountLabel.setText("Row count:");
tableOptionsPanel.add(tableRowCountLabel, "cell 0 0");
//---- rowSelectionCheckBox ----
rowSelectionCheckBox.setText("row selection");
rowSelectionCheckBox.setSelected(true);
rowSelectionCheckBox.addActionListener(e -> rowSelectionChanged());
add(rowSelectionCheckBox, "cell 0 4 3 1");
//---- tableRowCountSpinner ----
tableRowCountSpinner.setModel(new SpinnerNumberModel(20, 0, null, 10));
tableRowCountSpinner.addChangeListener(e -> tableRowCountChanged());
tableOptionsPanel.add(tableRowCountSpinner, "cell 1 0");
//---- columnSelectionCheckBox ----
columnSelectionCheckBox.setText("column selection");
columnSelectionCheckBox.addActionListener(e -> columnSelectionChanged());
add(columnSelectionCheckBox, "cell 0 4 3 1");
//---- showHorizontalLinesCheckBox ----
showHorizontalLinesCheckBox.setText("show horizontal lines");
showHorizontalLinesCheckBox.addActionListener(e -> showHorizontalLinesChanged());
tableOptionsPanel.add(showHorizontalLinesCheckBox, "cell 0 1 2 1");
//---- showHorizontalLinesCheckBox ----
showHorizontalLinesCheckBox.setText("show horizontal lines");
showHorizontalLinesCheckBox.addActionListener(e -> showHorizontalLinesChanged());
add(showHorizontalLinesCheckBox, "cell 0 5 3 1");
//---- showVerticalLinesCheckBox ----
showVerticalLinesCheckBox.setText("show vertical lines");
showVerticalLinesCheckBox.addActionListener(e -> showVerticalLinesChanged());
tableOptionsPanel.add(showVerticalLinesCheckBox, "cell 0 2 2 1");
//---- showVerticalLinesCheckBox ----
showVerticalLinesCheckBox.setText("show vertical lines");
showVerticalLinesCheckBox.addActionListener(e -> showVerticalLinesChanged());
add(showVerticalLinesCheckBox, "cell 0 5 3 1");
//---- intercellSpacingCheckBox ----
intercellSpacingCheckBox.setText("intercell spacing");
intercellSpacingCheckBox.addActionListener(e -> intercellSpacingChanged());
tableOptionsPanel.add(intercellSpacingCheckBox, "cell 0 3 2 1");
//---- intercellSpacingCheckBox ----
intercellSpacingCheckBox.setText("intercell spacing");
intercellSpacingCheckBox.addActionListener(e -> intercellSpacingChanged());
add(intercellSpacingCheckBox, "cell 0 5 3 1");
//---- redGridColorCheckBox ----
redGridColorCheckBox.setText("red grid color");
redGridColorCheckBox.addActionListener(e -> redGridColorChanged());
tableOptionsPanel.add(redGridColorCheckBox, "cell 0 4 2 1");
//---- redGridColorCheckBox ----
redGridColorCheckBox.setText("red grid color");
redGridColorCheckBox.addActionListener(e -> redGridColorChanged());
add(redGridColorCheckBox, "cell 0 5 3 1");
//---- rowSelectionCheckBox ----
rowSelectionCheckBox.setText("row selection");
rowSelectionCheckBox.setSelected(true);
rowSelectionCheckBox.addActionListener(e -> rowSelectionChanged());
tableOptionsPanel.add(rowSelectionCheckBox, "cell 0 5 2 1");
//---- columnSelectionCheckBox ----
columnSelectionCheckBox.setText("column selection");
columnSelectionCheckBox.addActionListener(e -> columnSelectionChanged());
tableOptionsPanel.add(columnSelectionCheckBox, "cell 0 6 2 1");
//---- dndCheckBox ----
dndCheckBox.setText("enable drag and drop");
dndCheckBox.setMnemonic('D');
dndCheckBox.addActionListener(e -> dndChanged());
tableOptionsPanel.add(dndCheckBox, "cell 0 7 2 1");
//---- tableHeaderButtonCheckBox ----
tableHeaderButtonCheckBox.setText("show button in table header");
tableHeaderButtonCheckBox.addActionListener(e -> tableHeaderButtonChanged());
tableOptionsPanel.add(tableHeaderButtonCheckBox, "cell 0 8 2 1");
}
add(tableOptionsPanel, "cell 3 3");
// JFormDesigner - End of component initialization //GEN-END:initComponents
((JComboBox)((DefaultCellEditor)table1.getColumnModel().getColumn( 3 ).getCellEditor()).getComponent()).setEditable( true );
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JList<String> list1;
private JList<String> list2;
private JSpinner listRowCountSpinner;
private JTree tree1;
private JTree tree2;
private JSpinner treeRowCountSpinner;
private JScrollPane scrollPane5;
private JTable table1;
private JCheckBox dndCheckBox;
private JCheckBox tableHeaderButtonCheckBox;
private JCheckBox rowSelectionCheckBox;
private JCheckBox columnSelectionCheckBox;
private JSpinner tableRowCountSpinner;
private JCheckBox showHorizontalLinesCheckBox;
private JCheckBox showVerticalLinesCheckBox;
private JCheckBox intercellSpacingCheckBox;
private JCheckBox redGridColorCheckBox;
private JCheckBox rowSelectionCheckBox;
private JCheckBox columnSelectionCheckBox;
private JCheckBox dndCheckBox;
private JCheckBox tableHeaderButtonCheckBox;
// JFormDesigner - End of variables declaration //GEN-END:variables
private final String[] randomRowStrings = new String[1000];
private final Random random = new Random();
private String randomRowString( int row ) {
int index = row % randomRowStrings.length;
String s = randomRowStrings[index];
if( s != null )
return s;
char[] chars = new char[3 + random.nextInt( 15 - 3 )];
for( int i = 0; i < chars.length; i++ )
chars[i] = (char) ((i == 0 ? 'A' : 'a') + random.nextInt( 26 ));
if( chars.length > 6 )
chars[chars.length / 2] = ' ';
s = new String( chars );
randomRowStrings[index] = s;
return s;
}
//---- class DummyTransferHandler -----------------------------------------
private static class DummyTransferHandler
@@ -443,4 +505,234 @@ public class FlatComponents2Test
return false;
}
}
//---- class TestListModel ------------------------------------------------
private class TestListModel
extends AbstractListModel<String>
{
private int size;
TestListModel( int size ) {
setSize( size );
}
void setSize( int size ) {
int oldSize = this.size;
this.size = size;
// fire event
if( size > oldSize )
fireIntervalAdded( this, oldSize, size - 1 );
else if( size < oldSize )
fireIntervalRemoved( this, size, oldSize - 1 );
}
@Override
public int getSize() {
return size;
}
@Override
public String getElementAt( int index ) {
return (index < 20)
? "item " + (index + 1)
: "item " + (index + 1) + " " + randomRowString( index );
}
}
//---- TestTreeModel ------------------------------------------------------
private class TestTreeModel
extends DefaultTreeModel
{
private int rowCount;
TestTreeModel( int rowCount ) {
super( new DefaultMutableTreeNode( "JTree" ) );
setRowCount( rowCount );
}
void setRowCount( int rowCount ) {
if( rowCount < 20 )
rowCount = 20;
if( rowCount > this.rowCount ) {
// add nodes
int oldRootChildCount = root.getChildCount();
while( rowCount > this.rowCount ) {
addTwentyNodes( (DefaultMutableTreeNode) root, this.rowCount );
this.rowCount += 20;
}
// fire event
int newRootChildCount = root.getChildCount();
if( newRootChildCount > oldRootChildCount ) {
int[] childIndices = new int[newRootChildCount - oldRootChildCount];
for( int i = 0; i < childIndices.length; i++ )
childIndices[i] = oldRootChildCount + i;
nodesWereInserted( root, childIndices );
}
} else if( rowCount < this.rowCount ) {
// remove nodes
int oldRootChildCount = root.getChildCount();
List<Object> removedChildren = new ArrayList<>();
while( this.rowCount > rowCount ) {
int index = root.getChildCount() - 1;
removedChildren.add( 0, root.getChildAt( index ) );
((DefaultMutableTreeNode)root).remove( index );
this.rowCount -= 20;
}
// fire event
int newRootChildCount = root.getChildCount();
if( newRootChildCount < oldRootChildCount ) {
int[] childIndices = new int[oldRootChildCount - newRootChildCount];
for( int i = 0; i < childIndices.length; i++ )
childIndices[i] = newRootChildCount + i;
nodesWereRemoved( root, childIndices, removedChildren.toArray() );
}
}
}
private void addTwentyNodes( DefaultMutableTreeNode root, int firstRowIndex ) {
if( firstRowIndex == 0 ) {
DefaultMutableTreeNode n = new DefaultMutableTreeNode( "colors" );
n.add( new DefaultMutableTreeNode( "blue" ) );
n.add( new DefaultMutableTreeNode( "violet" ) );
n.add( new DefaultMutableTreeNode( "red" ) );
n.add( new DefaultMutableTreeNode( "yellow" ) );
root.add( n );
n = new DefaultMutableTreeNode( "sports" );
n.add( new DefaultMutableTreeNode( "basketball" ) );
n.add( new DefaultMutableTreeNode( "soccer" ) );
n.add( new DefaultMutableTreeNode( "football" ) );
n.add( new DefaultMutableTreeNode( "hockey" ) );
root.add( n );
n = new DefaultMutableTreeNode( "food" );
n.add( new DefaultMutableTreeNode( "hot dogs" ) );
DefaultMutableTreeNode n2 = new DefaultMutableTreeNode( "pizza" );
n2.add( new DefaultMutableTreeNode( "pizza aglio e olio" ) );
n2.add( new DefaultMutableTreeNode( "pizza calabrese" ) );
n2.add( new DefaultMutableTreeNode( "pizza infernale" ) );
n2.add( new DefaultMutableTreeNode( "pizza margherita bianca" ) );
n2.add( new DefaultMutableTreeNode( "pizza quattro stagioni" ) );
n.add( n2 );
n.add( new DefaultMutableTreeNode( "ravioli" ) );
n.add( new DefaultMutableTreeNode( "bananas" ) );
root.add( n );
} else {
DefaultMutableTreeNode n = new DefaultMutableTreeNode( "item " + firstRowIndex + " " + randomRowString( firstRowIndex ) );
for( int i = 1; i < 20; i++ ) {
int index = firstRowIndex + i;
n.add( new DefaultMutableTreeNode( "item " + index + " " + randomRowString( index ) ) );
}
root.add( n );
}
}
}
//---- TestTableModel -----------------------------------------------------
private class TestTableModel
extends AbstractTableModel
{
private final String[] columnNames = new String[] {
"Not editable", "Text", "Combo", "Combo Editable", "Integer", "Boolean"
};
private final Class<?>[] columnTypes = new Class<?>[] {
Object.class, Object.class, String.class, String.class, Integer.class, Boolean.class
};
private final boolean[] columnEditable = new boolean[] {
false, true, true, true, true, true
};
private final Object[][] rows = new Object[][] {
{ "item 1", "item 1b", "January", "July", 123, null },
{ "item 2", "item 2b", "February", "August", 456, true },
{ "item 3", null, "March", null, null, null },
{ "item 4", null, "April", null, null, null },
{ "item 5", null, "May", null, null, null },
{ "item 6", null, "June", null, null, null },
{ "item 7", null, "July", null, null, null },
{ "item 8", null, "August", null, null, null },
{ "item 9", null, "September", null, null, null },
{ "item 10", null, "October", null, null, null },
{ "item 11", null, "November", null, null, null },
{ "item 12", null, "December", null, null, null },
};
private int rowCount = rows.length;
private final Map<Integer, Object[]> moreRowsMap = new HashMap<>();
TestTableModel( int rowCount ) {
setRowCount( rowCount );
}
void setRowCount( int rowCount ) {
int oldRowCount = this.rowCount;
this.rowCount = rowCount;
// fire event
if( rowCount > oldRowCount )
fireTableRowsInserted( oldRowCount, rowCount - 1 );
else if( rowCount < oldRowCount )
fireTableRowsDeleted( rowCount, oldRowCount - 1 );
}
@Override
public int getRowCount() {
return rowCount;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName( int columnIndex ) {
return columnNames[columnIndex];
}
@Override
public Class<?> getColumnClass( int columnIndex ) {
return columnTypes[columnIndex];
}
@Override
public boolean isCellEditable( int rowIndex, int columnIndex ) {
return columnEditable[columnIndex];
}
@Override
public Object getValueAt( int rowIndex, int columnIndex ) {
if( rowIndex < rows.length )
return rows[rowIndex][columnIndex];
Object[] row = moreRowsMap.get( rowIndex );
Object value = (row != null)
? row[columnIndex]
: (columnIndex == 1 ? randomRowString( rowIndex ) : null);
return (columnIndex == 0 && value == null) ? "item " + (rowIndex + 1) : value;
}
@Override
public void setValueAt( Object value, int rowIndex, int columnIndex ) {
if( rowIndex < rows.length )
rows[rowIndex][columnIndex] = value;
else {
Object[] row = moreRowsMap.computeIfAbsent( rowIndex, k -> new Object[getColumnCount()] );
row[columnIndex] = value;
}
fireTableCellUpdated( rowIndex, columnIndex );
}
}
}

View File

@@ -8,8 +8,8 @@ new FormModel {
}
add( new FormContainer( "com.formdev.flatlaf.testing.FlatTestPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "ltr,insets dialog,hidemode 3"
"$columnConstraints": "[][200][200]"
"$rowConstraints": "[][][::200][150,grow][][]"
"$columnConstraints": "[][200,fill][200,fill][fill]"
"$rowConstraints": "[][150,grow,sizegroup 1,fill][150,grow,sizegroup 1,fill][150,grow,sizegroup 1,fill]"
} ) {
name: "this"
add( new FormComponent( "javax.swing.JLabel" ) {
@@ -35,58 +35,24 @@ new FormModel {
name: "listLabel"
"text": "JList:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 1"
"value": "cell 0 1,aligny top,growy 0"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane1"
add( new FormComponent( "javax.swing.JList" ) {
name: "list1"
"model": new javax.swing.DefaultListModel {
addElement( "item 1" )
addElement( "item 2" )
addElement( "item 3" )
addElement( "item 4" )
addElement( "item 5" )
addElement( "item 6" )
addElement( "item 7" )
addElement( "item 8" )
addElement( "item 9" )
addElement( "item 10" )
addElement( "item 11" )
addElement( "item 12" )
addElement( "item 13" )
addElement( "item 14" )
addElement( "item 15" )
}
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
"JavaCodeGenerator.variableLocal": false
}
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 1,growx"
"value": "cell 1 1"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane2"
add( new FormComponent( "javax.swing.JList" ) {
name: "list2"
"model": new javax.swing.DefaultListModel {
addElement( "item 1" )
addElement( "item 2" )
addElement( "item 3" )
addElement( "item 4" )
addElement( "item 5" )
addElement( "item 6" )
addElement( "item 7" )
addElement( "item 8" )
addElement( "item 9" )
addElement( "item 10" )
addElement( "item 11" )
addElement( "item 12" )
addElement( "item 13" )
addElement( "item 14" )
addElement( "item 15" )
}
"enabled": false
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
@@ -94,13 +60,42 @@ new FormModel {
}
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 1,growx"
"value": "cell 2 1"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3"
"$columnConstraints": "[fill][90,fill]"
"$rowConstraints": "[]"
} ) {
name: "listOptionsPanel"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "listRowCountLabel"
"text": "Row count:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
} )
add( new FormComponent( "javax.swing.JSpinner" ) {
name: "listRowCountSpinner"
"model": &SpinnerNumberModel0 new javax.swing.SpinnerNumberModel {
minimum: 0
stepSize: 10
value: 20
}
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "javax.swing.event.ChangeListener", "stateChanged", "listRowCountChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0"
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 3 1"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "treeLabel"
"text": "JTree:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2"
"value": "cell 0 2,aligny top,growy 0"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane3"
@@ -113,7 +108,7 @@ new FormModel {
}
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 2,growx"
"value": "cell 1 2"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane4"
@@ -125,13 +120,42 @@ new FormModel {
}
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 2,growx"
"value": "cell 2 2"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3"
"$columnConstraints": "[fill][90,fill]"
"$rowConstraints": "[]"
} ) {
name: "treeOptionsPanel"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "treeRowCountLabel"
"text": "Row count:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
} )
add( new FormComponent( "javax.swing.JSpinner" ) {
name: "treeRowCountSpinner"
"model": new javax.swing.SpinnerNumberModel {
minimum: 20
stepSize: 20
value: 20
}
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "javax.swing.event.ChangeListener", "stateChanged", "treeRowCountChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0"
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 3 2"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "tableLabel"
"text": "JTable:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 3"
"value": "cell 0 3,aligny top,growy 0"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane5"
@@ -140,225 +164,124 @@ new FormModel {
}
add( new FormComponent( "javax.swing.JTable" ) {
name: "table1"
"model": new com.jformdesigner.model.SwingTableModel( new java.util.Vector {
add( new java.util.Vector {
add( "item 1" )
add( "item 1b" )
add( "January" )
add( "July" )
add( 123 )
add( null )
} )
add( new java.util.Vector {
add( "item 2" )
add( "item 2b" )
add( "February" )
add( "August" )
add( 456 )
add( true )
} )
add( new java.util.Vector {
add( "item 3" )
add( null )
add( "March" )
add( null )
add( null )
add( null )
} )
add( new java.util.Vector {
add( "item 4" )
add( null )
add( "April" )
add( null )
add( null )
add( null )
} )
add( new java.util.Vector {
add( "item 5" )
add( null )
add( "May" )
add( null )
add( null )
add( null )
} )
add( new java.util.Vector {
add( "item 6" )
add( null )
add( "June" )
add( null )
add( null )
add( null )
} )
add( new java.util.Vector {
add( "item 7" )
add( null )
add( "July" )
add( null )
add( null )
add( null )
} )
add( new java.util.Vector {
add( "item 8" )
add( null )
add( "August" )
add( null )
add( null )
add( null )
} )
add( new java.util.Vector {
add( "item 9" )
add( null )
add( "September" )
add( null )
add( null )
add( null )
} )
add( new java.util.Vector {
add( "item 10" )
add( null )
add( "October" )
add( null )
add( null )
add( null )
} )
add( new java.util.Vector {
add( "item 11" )
add( null )
add( "November" )
add( null )
add( null )
add( null )
} )
add( new java.util.Vector {
add( "item 12" )
add( null )
add( "December" )
add( null )
add( null )
add( null )
} )
}, new java.util.Vector {
add( "Not editable" )
add( "Text" )
add( "Combo" )
add( "Combo Editable" )
add( "Integer" )
add( "Boolean" )
}, new java.util.Vector {
add( null )
add( null )
add( class java.lang.String )
add( class java.lang.String )
add( class java.lang.Integer )
add( class java.lang.Boolean )
}, new java.util.Vector {
add( false )
add( null )
add( null )
add( null )
add( null )
add( null )
}, new java.util.Vector {
add( null )
add( null )
add( new com.jformdesigner.model.SwingTableColumn( new java.lang.Object[ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], 0, 0, 0, true ) )
add( new com.jformdesigner.model.SwingTableColumn( new java.lang.Object[ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ], 0, 0, 0, true ) )
add( null )
add( null )
} )
"autoCreateRowSorter": true
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 3 2 1,growx,width 300"
"value": "cell 1 3 2 1,width 300"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "dndCheckBox"
"text": "enable drag and drop"
"mnemonic": 68
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "dndChanged", false ) )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3"
"$columnConstraints": "[][90,fill]"
"$rowConstraints": "[][]0[]0[]0[]0[]0[]0[]0[]"
} ) {
name: "tableOptionsPanel"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "tableRowCountLabel"
"text": "Row count:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
} )
add( new FormComponent( "javax.swing.JSpinner" ) {
name: "tableRowCountSpinner"
"model": #SpinnerNumberModel0
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "javax.swing.event.ChangeListener", "stateChanged", "tableRowCountChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "showHorizontalLinesCheckBox"
"text": "show horizontal lines"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "showHorizontalLinesChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 1 2 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "showVerticalLinesCheckBox"
"text": "show vertical lines"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "showVerticalLinesChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2 2 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "intercellSpacingCheckBox"
"text": "intercell spacing"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "intercellSpacingChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 3 2 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "redGridColorCheckBox"
"text": "red grid color"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "redGridColorChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 4 2 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "rowSelectionCheckBox"
"text": "row selection"
"selected": true
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "rowSelectionChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 5 2 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "columnSelectionCheckBox"
"text": "column selection"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "columnSelectionChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 6 2 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "dndCheckBox"
"text": "enable drag and drop"
"mnemonic": 68
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "dndChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 7 2 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "tableHeaderButtonCheckBox"
"text": "show button in table header"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "tableHeaderButtonChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 8 2 1"
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 4 3 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "tableHeaderButtonCheckBox"
"text": "show button in table header"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "tableHeaderButtonChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 4 3 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "rowSelectionCheckBox"
"text": "row selection"
"selected": true
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "rowSelectionChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 4 3 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "columnSelectionCheckBox"
"text": "column selection"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "columnSelectionChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 4 3 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "showHorizontalLinesCheckBox"
"text": "show horizontal lines"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "showHorizontalLinesChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 5 3 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "showVerticalLinesCheckBox"
"text": "show vertical lines"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "showVerticalLinesChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 5 3 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "intercellSpacingCheckBox"
"text": "intercell spacing"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "intercellSpacingChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 5 3 1"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "redGridColorCheckBox"
"text": "red grid color"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "redGridColorChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 5 3 1"
"value": "cell 3 3"
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 790, 715 )
"size": new java.awt.Dimension( 790, 825 )
} )
}
}

View File

@@ -134,6 +134,7 @@ public class FlatComponentsTest
JLabel labelLabel = new JLabel();
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
FlatComponentsTest.TestMultiLineLabel testMultiLineLabel1 = new FlatComponentsTest.TestMultiLineLabel();
JLabel buttonLabel = new JLabel();
JButton button1 = new JButton();
JButton button17 = new JButton();
@@ -367,6 +368,10 @@ public class FlatComponentsTest
label2.setEnabled(false);
add(label2, "cell 2 0");
//---- testMultiLineLabel1 ----
testMultiLineLabel1.setText("Multi-line label based on JTextArea\n2nd line");
add(testMultiLineLabel1, "cell 3 0 2 1");
//---- buttonLabel ----
buttonLabel.setText("JButton:");
add(buttonLabel, "cell 0 1");
@@ -1402,4 +1407,24 @@ public class FlatComponentsTest
return true;
}
}
//---- class TestMultiLineLabel -------------------------------------------
private static class TestMultiLineLabel
extends JTextArea
{
public TestMultiLineLabel() {
setEditable( false );
setFocusable( false );
}
@Override
public void updateUI() {
super.updateUI();
setBackground( UIManager.getColor( "Label.background" ) );
setForeground( UIManager.getColor( "Label.foreground" ) );
setFont( UIManager.getFont( "Label.font" ) );
setBorder( null );
}
}
}

View File

@@ -33,6 +33,12 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 0"
} )
add( new FormComponent( "com.formdev.flatlaf.testing.FlatComponentsTest$TestMultiLineLabel" ) {
name: "testMultiLineLabel1"
"text": "Multi-line label based on JTextArea\n2nd line"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 3 0 2 1"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "buttonLabel"
"text": "JButton:"

View File

@@ -1,5 +1,17 @@
/*
* Created by JFormDesigner on Tue Aug 27 21:47:02 CEST 2019
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.testing;
@@ -27,6 +39,8 @@ public class FlatContainerTest
public FlatContainerTest() {
initComponents();
addInitialTabs( tabbedPane1, tabbedPane2, tabbedPane3, tabbedPane4 );
}
private void tabScrollChanged() {
@@ -35,8 +49,20 @@ public class FlatContainerTest
tabbedPane2.setTabLayoutPolicy( tabLayoutPolicy );
tabbedPane3.setTabLayoutPolicy( tabLayoutPolicy );
tabbedPane4.setTabLayoutPolicy( tabLayoutPolicy );
if( !autoMoreTabs && tabScrollCheckBox.isSelected() && !moreTabsCheckBox.isSelected() ) {
moreTabsCheckBox.setSelected( true );
moreTabsChanged();
autoMoreTabs = true;
} else if( autoMoreTabs && !tabScrollCheckBox.isSelected() && moreTabsCheckBox.isSelected() ) {
moreTabsCheckBox.setSelected( false );
moreTabsChanged();
autoMoreTabs = false;
}
}
private boolean autoMoreTabs;
private void showTabSeparatorsChanged() {
Boolean showTabSeparators = showTabSeparatorsCheckBox.isSelected() ? true : null;
tabbedPane1.putClientProperty( TABBED_PANE_SHOW_TAB_SEPARATORS, showTabSeparators );
@@ -59,61 +85,70 @@ public class FlatContainerTest
addRemoveMoreTabs( tabbedPane2, moreTabs );
addRemoveMoreTabs( tabbedPane3, moreTabs );
addRemoveMoreTabs( tabbedPane4, moreTabs );
autoMoreTabs = false;
}
private void addRemoveMoreTabs( JTabbedPane tabbedPane, boolean add ) {
if( add ) {
tabbedPane.addTab( "Tab 4", new JLabel( "tab 4" ) );
tabbedPane.addTab( "Tab 5", new JLabel( "tab 5" ) );
addTab( tabbedPane, "Tab 4", "tab content 4" );
addTab( tabbedPane, "Tab 5", "tab content 5" );
addTab( tabbedPane, "Tab 6", "tab content 6" );
addTab( tabbedPane, "Tab 7", "tab content 7" );
addTab( tabbedPane, "Tab 8", "tab content 8" );
} else {
int tabCount = tabbedPane.getTabCount();
if( tabCount > 3 ) {
for( int i = 0; i < 2; i++ )
for( int i = 0; i < 5; i++ )
tabbedPane.removeTabAt( tabbedPane.getTabCount() - 1 );
}
}
}
private void addInitialTabs( JTabbedPane... tabbedPanes ) {
for( JTabbedPane tabbedPane : tabbedPanes ) {
tabbedPane.addTab( "Tab 1", new Panel1() );
JComponent tab2 = new Panel2();
tab2.setBorder( new LineBorder( Color.magenta ) );
tabbedPane.addTab( "Second Tab", tab2 );
addTab( tabbedPane, "Disabled", "tab content 3" );
tabbedPane.setEnabledAt( 2, false );
}
}
private void addTab( JTabbedPane tabbedPane, String title, String text ) {
tabbedPane.addTab( title, createTab( text ) );
}
private JComponent createTab( String text ) {
JLabel label = new JLabel( text );
label.setHorizontalAlignment( SwingConstants.CENTER );
JPanel tab = new JPanel( new BorderLayout() );
tab.add( label, BorderLayout.CENTER );
return tab;
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
JPanel panel9 = new JPanel();
JLabel splitPaneLabel = new JLabel();
JSplitPane splitPane3 = new JSplitPane();
JSplitPane splitPane1 = new JSplitPane();
JPanel panel10 = new JPanel();
JTextField textField2 = new JTextField();
JButton button1 = new JButton();
JPanel panel11 = new JPanel();
JTextField textField3 = new JTextField();
JButton button2 = new JButton();
FlatContainerTest.Panel1 panel15 = new FlatContainerTest.Panel1();
FlatContainerTest.Panel2 panel21 = new FlatContainerTest.Panel2();
JSplitPane splitPane2 = new JSplitPane();
JPanel panel12 = new JPanel();
JLabel label3 = new JLabel();
JPanel panel13 = new JPanel();
JLabel label4 = new JLabel();
JLabel tabbedPaneLabel = new JLabel();
tabbedPane1 = new JTabbedPane();
JPanel panel1 = new JPanel();
JLabel label1 = new JLabel();
JTextField textField4 = new JTextField();
JButton button3 = new JButton();
JPanel panel2 = new JPanel();
JTextField textField5 = new JTextField();
JButton button4 = new JButton();
JLabel label2 = new JLabel();
tabbedPane3 = new JTabbedPane();
JPanel panel5 = new JPanel();
JLabel label5 = new JLabel();
JPanel panel6 = new JPanel();
JLabel label6 = new JLabel();
tabbedPane2 = new JTabbedPane();
JPanel panel3 = new JPanel();
JLabel label3 = new JLabel();
JPanel panel4 = new JPanel();
JLabel label4 = new JLabel();
tabbedPane4 = new JTabbedPane();
JPanel panel7 = new JPanel();
JLabel label7 = new JLabel();
JPanel panel8 = new JPanel();
JLabel label8 = new JLabel();
JPanel panel14 = new JPanel();
moreTabsCheckBox = new JCheckBox();
tabScrollCheckBox = new JCheckBox();
@@ -133,8 +168,8 @@ public class FlatContainerTest
{
panel9.setOpaque(false);
panel9.setLayout(new FormLayout(
"70dlu:grow, $lcgap, 70dlu:grow",
"default, $lgap, fill:70dlu, $lgap, pref, 2*($lgap, fill:70dlu:grow), $lgap, pref"));
"70dlu:grow, $ugap, 70dlu:grow",
"default, $lgap, fill:70dlu, $pgap, pref, $lgap, 2*(fill:80dlu:grow, $ugap), pref"));
//---- splitPaneLabel ----
splitPaneLabel.setText("JSplitPane:");
@@ -149,35 +184,13 @@ public class FlatContainerTest
splitPane1.setResizeWeight(0.5);
splitPane1.setOneTouchExpandable(true);
//======== panel10 ========
{
panel10.setBackground(Color.orange);
panel10.setLayout(new FlowLayout());
//---- panel15 ----
panel15.setBackground(new Color(217, 163, 67));
splitPane1.setLeftComponent(panel15);
//---- textField2 ----
textField2.setText("some text");
panel10.add(textField2);
//---- button1 ----
button1.setText("...");
panel10.add(button1);
}
splitPane1.setLeftComponent(panel10);
//======== panel11 ========
{
panel11.setBackground(Color.magenta);
panel11.setLayout(new FlowLayout());
//---- textField3 ----
textField3.setText("some text");
panel11.add(textField3);
//---- button2 ----
button2.setText("...");
panel11.add(button2);
}
splitPane1.setRightComponent(panel11);
//---- panel21 ----
panel21.setBackground(new Color(98, 181, 67));
splitPane1.setRightComponent(panel21);
}
splitPane3.setLeftComponent(splitPane1);
@@ -189,15 +202,27 @@ public class FlatContainerTest
//======== panel12 ========
{
panel12.setBackground(Color.orange);
panel12.setLayout(new FlowLayout());
panel12.setBackground(new Color(242, 101, 34));
panel12.setLayout(new BorderLayout());
//---- label3 ----
label3.setText("TOP");
label3.setHorizontalAlignment(SwingConstants.CENTER);
label3.setForeground(Color.white);
panel12.add(label3, BorderLayout.CENTER);
}
splitPane2.setTopComponent(panel12);
//======== panel13 ========
{
panel13.setBackground(Color.magenta);
panel13.setLayout(new FlowLayout());
panel13.setBackground(new Color(64, 182, 224));
panel13.setLayout(new BorderLayout());
//---- label4 ----
label4.setText("BOTTOM");
label4.setHorizontalAlignment(SwingConstants.CENTER);
label4.setForeground(Color.white);
panel13.add(label4, BorderLayout.CENTER);
}
splitPane2.setBottomComponent(panel13);
}
@@ -208,128 +233,23 @@ public class FlatContainerTest
//---- tabbedPaneLabel ----
tabbedPaneLabel.setText("JTabbedPane:");
panel9.add(tabbedPaneLabel, cc.xy(1, 5));
//======== tabbedPane1 ========
{
//======== panel1 ========
{
panel1.setLayout(new FlowLayout());
//---- label1 ----
label1.setText("TOP");
panel1.add(label1);
//---- textField4 ----
textField4.setText("some text");
panel1.add(textField4);
//---- button3 ----
button3.setText("...");
panel1.add(button3);
}
tabbedPane1.addTab("Tab 1", panel1);
//======== panel2 ========
{
panel2.setBorder(new LineBorder(Color.magenta));
panel2.setLayout(new FlowLayout());
//---- textField5 ----
textField5.setText("some text");
panel2.add(textField5);
//---- button4 ----
button4.setText("...");
panel2.add(button4);
}
tabbedPane1.addTab("Tab 2", panel2);
//---- label2 ----
label2.setText("text");
tabbedPane1.addTab("Tab 3", label2);
}
panel9.add(tabbedPane1, cc.xy(1, 7));
//======== tabbedPane3 ========
{
tabbedPane3.setTabPlacement(SwingConstants.LEFT);
//======== panel5 ========
{
panel5.setLayout(new FlowLayout());
//---- label5 ----
label5.setText("LEFT");
panel5.add(label5);
}
tabbedPane3.addTab("Tab 1", panel5);
//======== panel6 ========
{
panel6.setBorder(new LineBorder(Color.magenta));
panel6.setLayout(new FlowLayout());
}
tabbedPane3.addTab("Tab 2", panel6);
//---- label6 ----
label6.setText("text");
tabbedPane3.addTab("Tab 3", label6);
}
panel9.add(tabbedPane3, cc.xy(3, 7));
//======== tabbedPane2 ========
{
tabbedPane2.setTabPlacement(SwingConstants.BOTTOM);
//======== panel3 ========
{
panel3.setLayout(new FlowLayout());
//---- label3 ----
label3.setText("BOTTOM");
panel3.add(label3);
}
tabbedPane2.addTab("Tab 1", panel3);
//======== panel4 ========
{
panel4.setBorder(new LineBorder(Color.magenta));
panel4.setLayout(new FlowLayout());
}
tabbedPane2.addTab("Tab 2", panel4);
tabbedPane2.setEnabledAt(1, false);
//---- label4 ----
label4.setText("text");
tabbedPane2.addTab("Tab 3", label4);
}
panel9.add(tabbedPane2, cc.xy(1, 9));
//======== tabbedPane4 ========
{
tabbedPane4.setTabPlacement(SwingConstants.RIGHT);
//======== panel7 ========
{
panel7.setLayout(new FlowLayout());
//---- label7 ----
label7.setText("RIGHT");
panel7.add(label7);
}
tabbedPane4.addTab("Tab 1", panel7);
//======== panel8 ========
{
panel8.setBorder(new LineBorder(Color.magenta));
panel8.setLayout(new FlowLayout());
}
tabbedPane4.addTab("Tab 2", panel8);
//---- label8 ----
label8.setText("text");
tabbedPane4.addTab("Tab 3", label8);
}
panel9.add(tabbedPane4, cc.xy(3, 9));
@@ -347,25 +267,24 @@ public class FlatContainerTest
"[center]"));
//---- moreTabsCheckBox ----
moreTabsCheckBox.setText("more tabs");
moreTabsCheckBox.setText("More tabs");
moreTabsCheckBox.setMnemonic('M');
moreTabsCheckBox.addActionListener(e -> moreTabsChanged());
panel14.add(moreTabsCheckBox, "cell 0 0");
//---- tabScrollCheckBox ----
tabScrollCheckBox.setText("tabLayoutPolicy = SCROLL");
tabScrollCheckBox.setText("Use scroll layout");
tabScrollCheckBox.setMnemonic('S');
tabScrollCheckBox.addActionListener(e -> tabScrollChanged());
panel14.add(tabScrollCheckBox, "cell 1 0,alignx left,growx 0");
//---- showTabSeparatorsCheckBox ----
showTabSeparatorsCheckBox.setText("JTabbedPane.showTabSeparators");
showTabSeparatorsCheckBox.setText("Show tab separators");
showTabSeparatorsCheckBox.addActionListener(e -> showTabSeparatorsChanged());
panel14.add(showTabSeparatorsCheckBox, "cell 2 0");
//---- hasFullBorderCheckBox ----
hasFullBorderCheckBox.setText("JTabbedPane.hasFullBorder");
hasFullBorderCheckBox.setMnemonic('F');
hasFullBorderCheckBox.setText("Show content border");
hasFullBorderCheckBox.addActionListener(e -> hasFullBorderChanged());
panel14.add(hasFullBorderCheckBox, "cell 3 0,alignx left,growx 0");
}
@@ -385,4 +304,84 @@ public class FlatContainerTest
private JCheckBox showTabSeparatorsCheckBox;
private JCheckBox hasFullBorderCheckBox;
// JFormDesigner - End of variables declaration //GEN-END:variables
//---- class Tab1Panel ----------------------------------------------------
private static class Panel1
extends JPanel
{
private Panel1() {
initComponents();
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
JLabel label1 = new JLabel();
JTextField textField4 = new JTextField();
JButton button3 = new JButton();
//======== this ========
setLayout(new MigLayout(
"hidemode 3,align center center",
// columns
"[fill]" +
"[fill]" +
"[fill]",
// rows
"[fill]"));
//---- label1 ----
label1.setText("text");
add(label1, "cell 0 0");
//---- textField4 ----
textField4.setText("some text");
add(textField4, "cell 1 0");
//---- button3 ----
button3.setText("...");
add(button3, "cell 2 0");
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
// JFormDesigner - End of variables declaration //GEN-END:variables
}
//---- class Tab2Panel ----------------------------------------------------
private static class Panel2
extends JPanel
{
private Panel2() {
initComponents();
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
JTextField textField5 = new JTextField();
JButton button4 = new JButton();
//======== this ========
setLayout(new MigLayout(
"insets 0,hidemode 3,align center center",
// columns
"[fill]" +
"[fill]",
// rows
"[fill]"));
//---- textField5 ----
textField5.setText("more text");
add(textField5, "cell 0 0");
//---- button4 ----
button4.setText("...");
add(button4, "cell 1 0");
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
// JFormDesigner - End of variables declaration //GEN-END:variables
}
}

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.1.0.272" Java: "13.0.1" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -13,8 +13,8 @@ new FormModel {
} ) {
name: "this"
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class com.jgoodies.forms.layout.FormLayout ) {
"$columnSpecs": "70dlu:grow, labelcompgap, 70dlu:grow"
"$rowSpecs": "default, linegap, fill:70dlu, linegap, pref, linegap, fill:70dlu:grow, linegap, fill:70dlu:grow, linegap, pref"
"$columnSpecs": "70dlu:grow, unrelgap, 70dlu:grow"
"$rowSpecs": "default, linegap, fill:70dlu, pargap, pref, linegap, fill:80dlu:grow, unrelgap, fill:80dlu:grow, unrelgap, pref"
} ) {
name: "panel9"
"opaque": false
@@ -29,31 +29,15 @@ new FormModel {
name: "splitPane1"
"resizeWeight": 0.5
"oneTouchExpandable": true
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel10"
"background": sfield java.awt.Color orange
add( new FormComponent( "javax.swing.JTextField" ) {
name: "textField2"
"text": "some text"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button1"
"text": "..."
} )
add( new FormComponent( "com.formdev.flatlaf.testing.FlatContainerTest$Panel1" ) {
name: "panel15"
"background": new java.awt.Color( 217, 163, 67, 255 )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "left"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel11"
"background": sfield java.awt.Color magenta
add( new FormComponent( "javax.swing.JTextField" ) {
name: "textField3"
"text": "some text"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button2"
"text": "..."
} )
add( new FormComponent( "com.formdev.flatlaf.testing.FlatContainerTest$Panel2" ) {
name: "panel21"
"background": new java.awt.Color( 98, 181, 67, 255 )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "right"
} )
@@ -65,15 +49,31 @@ new FormModel {
"orientation": 0
"resizeWeight": 0.5
"oneTouchExpandable": true
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "panel12"
"background": sfield java.awt.Color orange
"background": new java.awt.Color( 242, 101, 34, 255 )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label3"
"text": "TOP"
"horizontalAlignment": 0
"foreground": sfield java.awt.Color white
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "left"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "panel13"
"background": sfield java.awt.Color magenta
"background": new java.awt.Color( 64, 182, 224, 255 )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label4"
"text": "BOTTOM"
"horizontalAlignment": 0
"foreground": sfield java.awt.Color white
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "Center"
} )
}, new FormLayoutConstraints( class java.lang.String ) {
"value": "right"
} )
@@ -96,43 +96,6 @@ new FormModel {
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel1"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label1"
"text": "TOP"
} )
add( new FormComponent( "javax.swing.JTextField" ) {
name: "textField4"
"text": "some text"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button3"
"text": "..."
} )
}, new FormLayoutConstraints( null ) {
"title": "Tab 1"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel2"
"border": &LineBorder0 new javax.swing.border.LineBorder( sfield java.awt.Color magenta, 1, false )
add( new FormComponent( "javax.swing.JTextField" ) {
name: "textField5"
"text": "some text"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button4"
"text": "..."
} )
}, new FormLayoutConstraints( null ) {
"title": "Tab 2"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label2"
"text": "text"
}, new FormLayoutConstraints( null ) {
"title": "Tab 3"
} )
}, new FormLayoutConstraints( class com.jgoodies.forms.layout.CellConstraints ) {
"gridX": 1
"gridY": 7
@@ -143,27 +106,6 @@ new FormModel {
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel5"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label5"
"text": "LEFT"
} )
}, new FormLayoutConstraints( null ) {
"title": "Tab 1"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel6"
"border": #LineBorder0
}, new FormLayoutConstraints( null ) {
"title": "Tab 2"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label6"
"text": "text"
}, new FormLayoutConstraints( null ) {
"title": "Tab 3"
} )
}, new FormLayoutConstraints( class com.jgoodies.forms.layout.CellConstraints ) {
"gridX": 3
"gridY": 7
@@ -174,28 +116,6 @@ new FormModel {
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel3"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label3"
"text": "BOTTOM"
} )
}, new FormLayoutConstraints( null ) {
"title": "Tab 1"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel4"
"border": #LineBorder0
}, new FormLayoutConstraints( null ) {
"title": "Tab 2"
"enabled": false
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label4"
"text": "text"
}, new FormLayoutConstraints( null ) {
"title": "Tab 3"
} )
}, new FormLayoutConstraints( class com.jgoodies.forms.layout.CellConstraints ) {
"gridY": 9
} )
@@ -205,27 +125,6 @@ new FormModel {
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel7"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label7"
"text": "RIGHT"
} )
}, new FormLayoutConstraints( null ) {
"title": "Tab 1"
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.FlowLayout ) ) {
name: "panel8"
"border": #LineBorder0
}, new FormLayoutConstraints( null ) {
"title": "Tab 2"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label8"
"text": "text"
}, new FormLayoutConstraints( null ) {
"title": "Tab 3"
} )
}, new FormLayoutConstraints( class com.jgoodies.forms.layout.CellConstraints ) {
"gridX": 3
"gridY": 9
@@ -239,7 +138,7 @@ new FormModel {
"opaque": false
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "moreTabsCheckBox"
"text": "more tabs"
"text": "More tabs"
"mnemonic": 77
auxiliary() {
"JavaCodeGenerator.variableLocal": false
@@ -250,7 +149,7 @@ new FormModel {
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "tabScrollCheckBox"
"text": "tabLayoutPolicy = SCROLL"
"text": "Use scroll layout"
"mnemonic": 83
auxiliary() {
"JavaCodeGenerator.variableLocal": false
@@ -261,7 +160,7 @@ new FormModel {
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "showTabSeparatorsCheckBox"
"text": "JTabbedPane.showTabSeparators"
"text": "Show tab separators"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
@@ -271,8 +170,7 @@ new FormModel {
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "hasFullBorderCheckBox"
"text": "JTabbedPane.hasFullBorder"
"mnemonic": 70
"text": "Show content border"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
@@ -291,5 +189,61 @@ new FormModel {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 625, 515 )
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "hidemode 3,align center center"
"$columnConstraints": "[fill][fill][fill]"
"$rowConstraints": "[fill]"
} ) {
name: "panel1"
auxiliary() {
"JavaCodeGenerator.className": "Panel1"
}
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label1"
"text": "text"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
} )
add( new FormComponent( "javax.swing.JTextField" ) {
name: "textField4"
"text": "some text"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button3"
"text": "..."
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 0"
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 595 )
"size": new java.awt.Dimension( 291, 118 )
} )
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "insets 0,hidemode 3,align center center"
"$columnConstraints": "[fill][fill]"
"$rowConstraints": "[fill]"
} ) {
name: "panel2"
auxiliary() {
"JavaCodeGenerator.className": "Panel2"
}
add( new FormComponent( "javax.swing.JTextField" ) {
name: "textField5"
"text": "more text"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button4"
"text": "..."
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0"
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 340, 595 )
"size": new java.awt.Dimension( 291, 118 )
} )
}
}

View File

@@ -86,6 +86,9 @@ public class FlatHtmlTest
label10 = new JLabel();
radioButtonMenuItem1 = new JRadioButtonMenuItem();
radioButtonMenuItem2 = new JRadioButtonMenuItem();
label14 = new JLabel();
label15 = new JLabel();
label16 = new JLabel();
label1 = new JLabel();
scrollPane15 = new JScrollPane();
editorPane1 = new JEditorPane();
@@ -146,6 +149,7 @@ public class FlatHtmlTest
"[]" +
"[]" +
"[]" +
"[]" +
"[]"));
//---- label5 ----
@@ -173,7 +177,7 @@ public class FlatHtmlTest
panel1.add(button2, "cell 2 1");
//---- label11 ----
label11.setText("text");
label11.setText("JToggleButton:");
panel1.add(label11, "cell 0 2");
//---- toggleButton1 ----
@@ -187,7 +191,7 @@ public class FlatHtmlTest
panel1.add(toggleButton2, "cell 2 2");
//---- label12 ----
label12.setText("text");
label12.setText("JCheckBox:");
panel1.add(label12, "cell 0 3");
//---- checkBox1 ----
@@ -199,7 +203,7 @@ public class FlatHtmlTest
panel1.add(checkBox2, "cell 2 3");
//---- label13 ----
label13.setText("text");
label13.setText("JRadioButton:");
panel1.add(label13, "cell 0 4");
//---- radioButton1 ----
@@ -265,6 +269,20 @@ public class FlatHtmlTest
radioButtonMenuItem2.setText("Some text");
radioButtonMenuItem2.setSelected(true);
panel1.add(radioButtonMenuItem2, "cell 2 8");
//---- label14 ----
label14.setText("JToolTip:");
panel1.add(label14, "cell 0 9");
//---- label15 ----
label15.setText("(move mouse here)");
label15.setToolTipText("<html>Some <b>Bold</b> Text");
panel1.add(label15, "cell 1 9");
//---- label16 ----
label16.setText("(move mouse here)");
label16.setToolTipText("Some text");
panel1.add(label16, "cell 2 9");
}
add(panel1, "cell 4 0 1 3,aligny top,growy 0");
@@ -379,6 +397,9 @@ public class FlatHtmlTest
private JLabel label10;
private JRadioButtonMenuItem radioButtonMenuItem1;
private JRadioButtonMenuItem radioButtonMenuItem2;
private JLabel label14;
private JLabel label15;
private JLabel label16;
private JLabel label1;
private JScrollPane scrollPane15;
private JEditorPane editorPane1;

View File

@@ -36,7 +36,7 @@ new FormModel {
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class net.miginfocom.swing.MigLayout ) {
"$layoutConstraints": "insets 0,hidemode 3"
"$columnConstraints": "[fill][fill][fill]"
"$rowConstraints": "[][][][][][][][][]"
"$rowConstraints": "[][][][][][][][][][]"
} ) {
name: "panel1"
add( new FormComponent( "javax.swing.JLabel" ) {
@@ -77,7 +77,7 @@ new FormModel {
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label11"
"text": "text"
"text": "JToggleButton:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2"
} )
@@ -97,7 +97,7 @@ new FormModel {
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label12"
"text": "text"
"text": "JCheckBox:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 3"
} )
@@ -115,7 +115,7 @@ new FormModel {
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label13"
"text": "text"
"text": "JRadioButton:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 4"
} )
@@ -207,6 +207,26 @@ new FormModel {
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 8"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label14"
"text": "JToolTip:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 9"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label15"
"text": "(move mouse here)"
"toolTipText": "<html>Some <b>Bold</b> Text"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 9"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label16"
"text": "(move mouse here)"
"toolTipText": "Some text"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 9"
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 4 0 1 3,aligny top,growy 0"
} )

View File

@@ -1,5 +1,17 @@
/*
* Created by JFormDesigner on Tue Aug 27 21:47:02 CEST 2019
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.testing;

View File

@@ -0,0 +1,112 @@
/*
* Copyright 2020 FormDev Software GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.formdev.flatlaf.testing;
import java.awt.DisplayMode;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.geom.AffineTransform;
import javax.swing.SwingUtilities;
/**
* Displays information about screens connected to a computer.
*
* This is a single-file program that can be compiled/run without any other
* FlatLaf code or dependencies.
*
* Since Java 11, you can run this program from source with:
* java FlatScreenInfo.java
*
* @author Karl Tauber
*/
public class FlatScreenInfo
{
public static void main( String[] args ) {
SwingUtilities.invokeLater( () -> {
printScreenInfo();
} );
}
private static void printScreenInfo() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice defaultScreenDevice = graphicsEnvironment.getDefaultScreenDevice();
GraphicsDevice[] screenDevices = graphicsEnvironment.getScreenDevices();
System.out.print( "Scale factors: " );
for( GraphicsDevice gd : screenDevices ) {
GraphicsConfiguration gc = gd.getDefaultConfiguration();
if( gd != screenDevices[0] )
System.out.print( " / " );
System.out.print( (int) (gc.getDefaultTransform().getScaleX() * 100) );
System.out.print( "%" );
}
System.out.println();
System.out.println( "Java version: " + System.getProperty( "java.version" ) );
for( GraphicsDevice gd : screenDevices ) {
GraphicsConfiguration gc = gd.getDefaultConfiguration();
DisplayMode displayMode = gd.getDisplayMode();
Rectangle bounds = gc.getBounds();
int width = displayMode.getWidth();
int height = displayMode.getHeight();
double boundsScaleX = (bounds.width > width)
? (double) bounds.width / (double) width
: -((double) width / (double) bounds.width);
double boundsScaleY = (bounds.height > height)
? (double) bounds.height / (double) height
: -((double) height / (double) bounds.height);
boundsScaleX = Math.round( boundsScaleX * 1000. ) / 1000.;
boundsScaleY = Math.round( boundsScaleY * 1000. ) / 1000.;
Insets screenInsets = toolkit.getScreenInsets( gc );
AffineTransform defaultTransform = gc.getDefaultTransform();
double scaleX = defaultTransform.getScaleX();
double scaleY = defaultTransform.getScaleY();
System.out.println();
System.out.print( "ID: " + gd.getIDstring() );
if( gd == defaultScreenDevice )
System.out.print( " (main)" );
System.out.println();
System.out.printf( "Size: %d x %d / %d Bit / %d Hz%n",
displayMode.getWidth(), displayMode.getHeight(),
displayMode.getBitDepth(), displayMode.getRefreshRate() );
System.out.printf( "Bounds: %d x %d / x %d / y %d",
bounds.width, bounds.height, bounds.x, bounds.y );
if( Math.abs( boundsScaleX ) != 1 || Math.abs( boundsScaleY ) != 1 )
System.out.printf( " (scale %s)", toString( boundsScaleX, boundsScaleY ) );
System.out.println();
System.out.printf( "Insets: left %d / right %d / top %d / bottom %d%n",
screenInsets.left, screenInsets.right, screenInsets.top, screenInsets.bottom );
System.out.println( "Scale: " + toString( scaleX, scaleY ) );
}
}
private static String toString( double scaleX, double scaleY ) {
return (scaleX == scaleY)
? String.valueOf( scaleX )
: scaleX + " / " + scaleY;
}
}

View File

@@ -74,9 +74,16 @@ public class FlatTestFrame
System.setProperty( FlatSystemProperties.UI_SCALE, scaleFactor );
}
// install inspectors
FlatInspector.install( "ctrl shift alt X" );
FlatUIDefaultsInspector.install( "ctrl shift alt Y" );
// disable animated Laf change
System.setProperty( "flatlaf.animatedLafChange", "false" );
// test loading custom defaults from package
FlatLaf.registerCustomDefaultsSource( "com.formdev.flatlaf.testing.customdefaults" );
// set look and feel
DemoPrefs.initLaf( args );
@@ -246,6 +253,13 @@ public class FlatTestFrame
} );
}
@Override
public void dispose() {
super.dispose();
FlatUIDefaultsInspector.hide();
}
private void updateTitle() {
double systemScaleFactor = UIScale.getSystemScaleFactor( getGraphicsConfiguration() );
float userScaleFactor = UIScale.getUserScaleFactor();

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.2.0.298" Java: "13.0.2" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"

View File

@@ -78,6 +78,10 @@ public class FlatWindowDecorationsTest
menuBarEmbeddedCheckBox.setEnabled( window instanceof JFrame );
maximizedBoundsCheckBox.setEnabled( window instanceof Frame );
addMenuButton.setEnabled( menuBarCheckBox.isEnabled() );
removeMenuButton.setEnabled( menuBarCheckBox.isEnabled() );
changeMenuButton.setEnabled( menuBarCheckBox.isEnabled() );
boolean windowHasIcons = (window != null && !window.getIconImages().isEmpty());
iconNoneRadioButton.setEnabled( windowHasIcons );
iconTestAllRadioButton.setEnabled( windowHasIcons );
@@ -246,9 +250,9 @@ public class FlatWindowDecorationsTest
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
menuBarCheckBox = new JCheckBox();
JButton addMenuButton = new JButton();
JButton removeMenuButton = new JButton();
JButton changeMenuButton = new JButton();
addMenuButton = new JButton();
removeMenuButton = new JButton();
changeMenuButton = new JButton();
menuBarEmbeddedCheckBox = new JCheckBox();
resizableCheckBox = new JCheckBox();
maximizedBoundsCheckBox = new JCheckBox();
@@ -652,6 +656,9 @@ public class FlatWindowDecorationsTest
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JCheckBox menuBarCheckBox;
private JButton addMenuButton;
private JButton removeMenuButton;
private JButton changeMenuButton;
private JCheckBox menuBarEmbeddedCheckBox;
private JCheckBox resizableCheckBox;
private JCheckBox maximizedBoundsCheckBox;

View File

@@ -26,6 +26,9 @@ new FormModel {
add( new FormComponent( "javax.swing.JButton" ) {
name: "addMenuButton"
"text": "Add menu"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "addMenu", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0 1 2,align left top,grow 0 0"
@@ -33,6 +36,9 @@ new FormModel {
add( new FormComponent( "javax.swing.JButton" ) {
name: "removeMenuButton"
"text": "Remove menu"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "removeMenu", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0 1 2,align left top,grow 0 0"
@@ -40,6 +46,9 @@ new FormModel {
add( new FormComponent( "javax.swing.JButton" ) {
name: "changeMenuButton"
"text": "Change menu"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "changeMenu", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 0 1 2,align left top,grow 0 0"

View File

@@ -17,7 +17,6 @@
package com.formdev.flatlaf.testing.extras;
import javax.swing.*;
import com.formdev.flatlaf.FlatIconColors;
import com.formdev.flatlaf.extras.*;
import com.formdev.flatlaf.testing.*;
import net.miginfocom.swing.*;
@@ -31,7 +30,6 @@ public class FlatExtrasTest
public static void main( String[] args ) {
SwingUtilities.invokeLater( () -> {
FlatTestFrame frame = FlatTestFrame.create( args, "FlatExtrasTest" );
System.out.println( UIManager.getColor( FlatIconColors.ACTIONS_GREY.key ) );
frame.showFrame( FlatExtrasTest::new );
} );
}
@@ -109,7 +107,8 @@ public class FlatExtrasTest
//---- triStateLabel1 ----
triStateLabel1.setText("text");
add(triStateLabel1, "cell 2 0");
triStateLabel1.setEnabled(false);
add(triStateLabel1, "cell 2 0,gapx 30");
//---- triStateCheckBox2 ----
triStateCheckBox2.setText("third state disabled");
@@ -119,7 +118,8 @@ public class FlatExtrasTest
//---- triStateLabel2 ----
triStateLabel2.setText("text");
add(triStateLabel2, "cell 2 1");
triStateLabel2.setEnabled(false);
add(triStateLabel2, "cell 2 1,gapx 30");
//---- label2 ----
label2.setText("SVG Icons:");

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.1.0.272" Java: "13.0.2" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -25,8 +25,9 @@ new FormModel {
add( new FormComponent( "javax.swing.JLabel" ) {
name: "triStateLabel1"
"text": "text"
"enabled": false
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 0"
"value": "cell 2 0,gapx 30"
} )
add( new FormComponent( "com.formdev.flatlaf.extras.TriStateCheckBox" ) {
name: "triStateCheckBox2"
@@ -39,8 +40,9 @@ new FormModel {
add( new FormComponent( "javax.swing.JLabel" ) {
name: "triStateLabel2"
"text": "text"
"enabled": false
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 2 1"
"value": "cell 2 1,gapx 30"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label2"

View File

@@ -61,6 +61,7 @@ import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicLookAndFeel;
import com.formdev.flatlaf.*;
import com.formdev.flatlaf.intellijthemes.FlatAllIJThemes;
import com.formdev.flatlaf.testing.FlatTestLaf;
import com.formdev.flatlaf.ui.FlatLineBorder;
import com.formdev.flatlaf.util.ColorFunctions.ColorFunction;
import com.formdev.flatlaf.util.ColorFunctions.HSLIncreaseDecrease;
@@ -96,6 +97,8 @@ public class UIDefaultsDump
dump( FlatDarculaLaf.class.getName(), dir );
}
dump( FlatTestLaf.class.getName(), dir );
// dump( MyBasicLookAndFeel.class.getName(), dir );
// dump( MetalLookAndFeel.class.getName(), dir );
// dump( NimbusLookAndFeel.class.getName(), dir );

View File

@@ -16,19 +16,21 @@
#---- variables ----
@background=#ccffcc
@foreground=#ff0000
@selectionBackground=#00aa00
@selectionForeground=#ffff00
@selectionInactiveBackground=#888888
@selectionInactiveForeground=#ffffff
@disabledText=#000088
@textComponentBackground=#ffffff
@background=#cfc
@foreground=#f00
@selectionBackground=#0a0
@selectionForeground=#ff0
@selectionInactiveBackground=#888
@selectionInactiveForeground=#fff
@disabledText=#008
@textComponentBackground=#fff
@menuBackground=#fff
@menuHoverBackground=darken(@menuBackground,10%)
@menuCheckBackground=darken(@menuBackground,10%)
@menuCheckHoverBackground=darken(@menuBackground,20%)
@cellFocusColor=#ff0000
@menuAcceleratorForeground=#f88
@menuAcceleratorSelectionForeground=#fff
@cellFocusColor=#f00
@icon=#afafaf
@dropCellBackground=#f00
@@ -39,20 +41,10 @@
#---- globals ----
*.background=@background
*.foreground=@foreground
*.textBackground=#ccffcc
*.textForeground=#ff0000
*.caretForeground=#0000ff
*.caretForeground=#00f
*.inactiveBackground=#f0f0f0
*.inactiveForeground=#000088
*.selectionBackground=@selectionBackground
*.selectionForeground=@selectionForeground
*.inactiveForeground=#008
*.disabledBackground=#e0e0e0
*.disabledForeground=@disabledText
*.disabledText=@disabledText
*.acceleratorForeground=#ff8888
*.acceleratorSelectionForeground=#ffffff
#---- system colors ----
@@ -69,40 +61,40 @@ controlDkShadow=#696969
Button.startBackground=#fff
Button.endBackground=#bbb
Button.focusedBackground=#00ffff
Button.hoverBackground=#ffff00
Button.focusedBackground=#0ff
Button.hoverBackground=#ff0
Button.pressedBackground=#FFC800
Button.startBorderColor=#00f
Button.endBorderColor=#f00
Button.disabledBorderColor=#000088
Button.disabledBorderColor=#008
Button.focusedBorderColor=#466d94
Button.hoverBorderColor=#ff0000
Button.hoverBorderColor=#f00
Button.default.startBackground=#ddd
Button.default.endBackground=#888
Button.default.foreground=#880000
Button.default.focusedBackground=#00ffff
Button.default.hoverBackground=#ffff00
Button.default.foreground=#800
Button.default.focusedBackground=#0ff
Button.default.hoverBackground=#ff0
Button.default.pressedBackground=#FFC800
Button.default.startBorderColor=#f00
Button.default.endBorderColor=#00f
Button.default.hoverBorderColor=#ff0000
Button.default.hoverBorderColor=#f00
Button.default.focusedBorderColor=#537699
Button.default.focusColor=#ff0000
Button.default.focusColor=#f00
Button.toolbar.hoverBackground=#ffffff
Button.toolbar.pressedBackground=#eeeeee
Button.toolbar.hoverBackground=#fff
Button.toolbar.pressedBackground=#eee
#---- CheckBox ----
# enabled
CheckBox.icon.borderColor=#878787
CheckBox.icon.background=#FFFFFF
CheckBox.icon.background=#fff
CheckBox.icon.selectedBorderColor=#4982CC
CheckBox.icon.selectedBackground=#4D89C9
CheckBox.icon.checkmarkColor=#FFFFFF
CheckBox.icon.checkmarkColor=#fff
# disabled
CheckBox.icon.disabledBorderColor=#BDBDBD
@@ -111,12 +103,12 @@ CheckBox.icon.disabledCheckmarkColor=#ABABAB
# focused
CheckBox.icon.focusedBorderColor=#7B9FC7
CheckBox.icon.focusedBackground=#00ffff
CheckBox.icon.focusedBackground=#0ff
CheckBox.icon.selectedFocusedBorderColor=#ACCFF7
# hover
CheckBox.icon.hoverBorderColor=#ff0000
CheckBox.icon.hoverBackground=#ffff00
CheckBox.icon.hoverBorderColor=#f00
CheckBox.icon.hoverBackground=#ff0
# pressed
CheckBox.icon.pressedBackground=#FFC800
@@ -124,18 +116,18 @@ CheckBox.icon.pressedBackground=#FFC800
#---- ComboBox ----
ComboBox.background=#ffffff
ComboBox.background=#fff
ComboBox.buttonBackground=#f0f0f0
ComboBox.buttonEditableBackground=#cccccc
ComboBox.buttonArrowColor=#666666
ComboBox.buttonEditableBackground=#ccc
ComboBox.buttonArrowColor=#666
ComboBox.buttonDisabledArrowColor=#ABABAB
ComboBox.buttonHoverArrowColor=#ff0000
ComboBox.buttonHoverArrowColor=#f00
#---- Component ----
Component.borderColor=#ff0000
Component.disabledBorderColor=#000088
Component.borderColor=#f00
Component.disabledBorderColor=#008
Component.focusedBorderColor=#466d94
Component.focusColor=#97c3f3
#Component.focusWidth=5
@@ -155,7 +147,7 @@ DesktopIcon.background=darken($Desktop.background,20%)
#---- HelpButton ----
HelpButton.questionMarkColor=#0000ff
HelpButton.questionMarkColor=#00f
#---- InternalFrame ----
@@ -178,16 +170,16 @@ InternalFrame.closePressedForeground=#fff
#---- Label ----
Label.foreground=#008800
Label.disabledForeground=#000088
Label.foreground=#080
Label.disabledForeground=#008
#---- List ----
List.background=#f0ffff
List.cellNoFocusBorder=1,6,1,6
List.focusSelectedCellHighlightBorder=1,6,1,6,#880000
List.focusCellHighlightBorder=1,6,1,6,#880000
List.focusSelectedCellHighlightBorder=1,6,1,6,#800
List.focusCellHighlightBorder=1,6,1,6,#800
#---- Menu ----
@@ -198,7 +190,7 @@ Menu.icon.disabledArrowColor=#ABABAB
#---- MenuBar ----
MenuBar.borderColor=#4444ff
MenuBar.borderColor=#44f
MenuBar.hoverBackground=#fdd
@@ -210,14 +202,14 @@ MenuItemCheckBox.icon.disabledCheckmarkColor=#ABABAB
#---- OptionPane ----
OptionPane.background=#ffdddd
OptionPane.foreground=#ff0000
OptionPane.background=#fdd
OptionPane.foreground=#f00
OptionPane.icon.errorColor=#ff0000
OptionPane.icon.informationColor=#00ff00
OptionPane.icon.questionColor=#0000ff
OptionPane.icon.warningColor=#ffcc00
OptionPane.icon.foreground=#ffffff
OptionPane.icon.errorColor=#f00
OptionPane.icon.informationColor=#0f0
OptionPane.icon.questionColor=#00f
OptionPane.icon.warningColor=#fc0
OptionPane.icon.foreground=#fff
#---- Popup ----
@@ -229,7 +221,7 @@ Popup.dropShadowInsets=-6,6,6,6
#---- PopupMenu ----
PopupMenu.borderColor=#0000ff
PopupMenu.borderColor=#00f
#---- PopupMenuSeparator ----
@@ -241,24 +233,24 @@ PopupMenuSeparator.stripeIndent=1
#---- ProgressBar ----
ProgressBar.background=#88ff88
ProgressBar.background=#8f8
ProgressBar.foreground=#73737333
ProgressBar.selectionForeground=#ff0000
ProgressBar.selectionBackground=#000088
ProgressBar.selectionForeground=#f00
ProgressBar.selectionBackground=#008
ProgressBar.cycleTime=10000
#---- ScrollBar ----
ScrollBar.track=#88ff88
ScrollBar.track=#8f8
ScrollBar.thumb=#73737333
ScrollBar.hoverTrackColor=#00ff00
ScrollBar.hoverThumbColor=#ff0000
ScrollBar.hoverTrackColor=#0f0
ScrollBar.hoverThumbColor=#f00
#---- Separator ----
Separator.foreground=#00bb00
Separator.foreground=#0b0
Separator.height=20
Separator.stripeWidth=10
Separator.stripeIndent=5
@@ -266,54 +258,54 @@ Separator.stripeIndent=5
#---- Slider ----
Slider.trackColor=#00bb00
Slider.thumbColor=#880000
Slider.tickColor=#ff0000
Slider.trackColor=#0b0
Slider.thumbColor=#800
Slider.tickColor=#f00
Slider.focusedColor=$Component.focusColor
Slider.hoverColor=#0000ff
Slider.disabledForeground=#000088
Slider.hoverColor=#00f
Slider.disabledForeground=#008
#---- SplitPane ----
SplitPaneDivider.draggingColor=#880000
SplitPaneDivider.oneTouchArrowColor=#00ff00
SplitPaneDivider.oneTouchHoverArrowColor=#ff0000
SplitPaneDivider.draggingColor=#800
SplitPaneDivider.oneTouchArrowColor=#0f0
SplitPaneDivider.oneTouchHoverArrowColor=#f00
#---- TabbedPane ----
TabbedPane.disabledForeground=#777777
TabbedPane.disabledForeground=#777
TabbedPane.selectedBackground=#0f0
TabbedPane.selectedForeground=#00f
TabbedPane.underlineColor=#4A88C7
TabbedPane.disabledUnderlineColor=#7a7a7a
TabbedPane.hoverColor=#eeeeee
TabbedPane.focusColor=#dddddd
TabbedPane.hoverColor=#eee
TabbedPane.focusColor=#ddd
TabbedPane.tabSeparatorColor=#00f
TabbedPane.contentAreaColor=#bbbbbb
TabbedPane.contentAreaColor=#bbb
#---- Table ----
Table.rowHeight=25
Table.background=#fffff0
Table.sortIconColor=#ffff00
Table.gridColor=#00ffff
Table.sortIconColor=#ff0
Table.gridColor=#0ff
#---- TableHeader ----
TableHeader.background=#4444ff
TableHeader.foreground=#ffffff
TableHeader.separatorColor=#00ff00
TableHeader.bottomSeparatorColor=#00ff00
TableHeader.background=#44f
TableHeader.foreground=#fff
TableHeader.separatorColor=#0f0
TableHeader.bottomSeparatorColor=#0f0
#---- TitledBorder ----
TitledBorder.titleColor=#ff00ff
TitledBorder.border=1,1,1,1,#ff00ff
TitledBorder.titleColor=#f0f
TitledBorder.border=1,1,1,1,#f0f
#---- TitlePane ----
@@ -326,27 +318,27 @@ TitlePane.inactiveForeground=#fff
#---- ToggleButton ----
ToggleButton.background=#ddddff
ToggleButton.selectedBackground=#44ff44
ToggleButton.selectedForeground=#000000
ToggleButton.disabledSelectedBackground=#44dd44
ToggleButton.background=#ddf
ToggleButton.selectedBackground=#4f4
ToggleButton.selectedForeground=#000
ToggleButton.disabledSelectedBackground=#4d4
ToggleButton.focusedBackground=#00ffff
ToggleButton.hoverBackground=#ffff00
ToggleButton.focusedBackground=#0ff
ToggleButton.hoverBackground=#ff0
ToggleButton.pressedBackground=#FFC800
ToggleButton.toolbar.selectedBackground=#dddddd
ToggleButton.toolbar.selectedBackground=#ddd
#---- ToolTip ----
ToolTip.background=#eeeeff
ToolTip.background=#eef
#---- Tree ----
Tree.background=#fff0ff
Tree.paintLines=true
Tree.hash=#ff0000
Tree.hash=#f00
Tree.editorBorder=1,1,1,1,#f00
Tree.editorBorderSelectionColor=#00f

View File

@@ -0,0 +1,2 @@
# Component.arc=9999
# TextComponent.arc=9999

View File

@@ -16,59 +16,59 @@
#---- BusyLabel ----
JXBusyLabel.baseColor=#00ff00
JXBusyLabel.highlightColor=#ff0000
JXBusyLabel.baseColor=#0f0
JXBusyLabel.highlightColor=#f00
#---- Header ----
JXHeader.background=#ff8888
JXHeader.startBackground=#ffcccc
JXHeader.titleForeground=#0000ff
JXHeader.descriptionForeground=#ff0000
JXHeader.background=#f88
JXHeader.startBackground=#fcc
JXHeader.titleForeground=#00f
JXHeader.descriptionForeground=#f00
#---- Hyperlink ----
Hyperlink.linkColor=#ff0000
Hyperlink.visitedColor=#0000ff
Hyperlink.disabledText=#000088
Hyperlink.linkColor=#f00
Hyperlink.visitedColor=#00f
Hyperlink.disabledText=#008
#---- MonthView ----
JXMonthView.background=@textComponentBackground
JXMonthView.monthStringBackground=#00ff00
JXMonthView.monthStringForeground=#0000ff
JXMonthView.daysOfTheWeekForeground=#00ff00
JXMonthView.weekOfTheYearForeground=#0000ff
JXMonthView.unselectableDayForeground=#0000ff
JXMonthView.selectedBackground=#aaffaa
JXMonthView.flaggedDayForeground=#00ffff
JXMonthView.monthStringBackground=#0f0
JXMonthView.monthStringForeground=#00f
JXMonthView.daysOfTheWeekForeground=#0f0
JXMonthView.weekOfTheYearForeground=#00f
JXMonthView.unselectableDayForeground=#00f
JXMonthView.selectedBackground=#afa
JXMonthView.flaggedDayForeground=#0ff
JXMonthView.leadingDayForeground=#c0c0c0
JXMonthView.trailingDayForeground=#c0c0c0
JXMonthView.arrowColor=#0000ff
JXMonthView.arrowColor=#00f
JXMonthView.disabledArrowColor=#ABABAB
#---- TaskPaneContainer ----
TaskPaneContainer.background=#ff8888
TaskPaneContainer.background=#f88
TaskPaneContainer.border=10,10,10,10
#---- TaskPane ----
TaskPane.background=#00ff00
TaskPane.borderColor=#0000ff
TaskPane.background=#0f0
TaskPane.borderColor=#00f
TaskPane.contentInsets=10,10,10,10
TaskPane.titleBackgroundGradientStart=#ffff00
TaskPane.titleForeground=#ff00ff
TaskPane.titleOver=#0000aa
TaskPane.specialTitleBackground=#00ffff
TaskPane.specialTitleForeground=#444444
TaskPane.specialTitleOver=#dd0000
TaskPane.titleBackgroundGradientStart=#ff0
TaskPane.titleForeground=#f0f
TaskPane.titleOver=#00a
TaskPane.specialTitleBackground=#0ff
TaskPane.specialTitleForeground=#444
TaskPane.specialTitleOver=#d00
#---- TitledPanel ----

View File

@@ -80,7 +80,8 @@ Button.default.pressedBackground #3f6796 com.formdev.flatlaf.util.DerivedColo
Button.defaultButtonFollowsFocus true
Button.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
Button.disabledBorderColor #5e6060 javax.swing.plaf.ColorUIResource [UI]
Button.disabledText #777777 javax.swing.plaf.ColorUIResource [UI]
Button.disabledSelectedBackground #53585a com.formdev.flatlaf.util.DerivedColor [UI] lighten(3% autoInverse)
Button.disabledText #888888 javax.swing.plaf.ColorUIResource [UI]
Button.focusedBorderColor #466d94 javax.swing.plaf.ColorUIResource [UI]
Button.font [active] $defaultFont [UI]
Button.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
@@ -93,12 +94,15 @@ Button.margin 2,14,2,14 javax.swing.plaf.InsetsUIResource [U
Button.minimumWidth 72
Button.pressedBackground #5b5f62 com.formdev.flatlaf.util.DerivedColor [UI] lighten(6% autoInverse)
Button.rollover true
Button.selectedBackground #656a6c com.formdev.flatlaf.util.DerivedColor [UI] lighten(10% autoInverse)
Button.selectedForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
Button.shadow #646464 javax.swing.plaf.ColorUIResource [UI]
Button.textIconGap 4
Button.textShiftOffset 0
Button.toolbar.hoverBackground #4e5355 com.formdev.flatlaf.util.DerivedColor [UI] lighten(1% autoInverse)
Button.toolbar.margin 3,3,3,3 javax.swing.plaf.InsetsUIResource [UI]
Button.toolbar.pressedBackground #565a5d com.formdev.flatlaf.util.DerivedColor [UI] lighten(4% autoInverse)
Button.toolbar.selectedBackground #5d6265 com.formdev.flatlaf.util.DerivedColor [UI] lighten(7% autoInverse)
Button.toolbar.spacingInsets 1,2,1,2 javax.swing.plaf.InsetsUIResource [UI]
ButtonUI com.formdev.flatlaf.ui.FlatButtonUI
@@ -113,7 +117,7 @@ Caret.width [active] 1
CheckBox.arc 4
CheckBox.background #3c3f41 javax.swing.plaf.ColorUIResource [UI]
CheckBox.border [lazy] 0,0,0,0 false com.formdev.flatlaf.ui.FlatMarginBorder [UI]
CheckBox.disabledText #777777 javax.swing.plaf.ColorUIResource [UI]
CheckBox.disabledText #888888 javax.swing.plaf.ColorUIResource [UI]
CheckBox.font [active] $defaultFont [UI]
CheckBox.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
CheckBox.icon.background #43494a javax.swing.plaf.ColorUIResource [UI]
@@ -152,7 +156,7 @@ CheckBoxMenuItem.background #303234 javax.swing.plaf.ColorUIResource [UI]
CheckBoxMenuItem.border [lazy] 0,0,0,0 false com.formdev.flatlaf.ui.FlatMenuItemBorder [UI]
CheckBoxMenuItem.borderPainted true
CheckBoxMenuItem.checkIcon [lazy] 15,15 com.formdev.flatlaf.icons.FlatCheckBoxMenuItemIcon [UI]
CheckBoxMenuItem.disabledForeground #777777 javax.swing.plaf.ColorUIResource [UI]
CheckBoxMenuItem.disabledForeground #888888 javax.swing.plaf.ColorUIResource [UI]
CheckBoxMenuItem.font [active] $defaultFont [UI]
CheckBoxMenuItem.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
CheckBoxMenuItem.margin 3,6,3,6 javax.swing.plaf.InsetsUIResource [UI]
@@ -192,7 +196,7 @@ ComboBox.buttonHoverArrowColor #bbbbbb javax.swing.plaf.ColorUIResource [UI]
ComboBox.buttonShadow #646464 javax.swing.plaf.ColorUIResource [UI]
ComboBox.buttonStyle auto
ComboBox.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
ComboBox.disabledForeground #777777 javax.swing.plaf.ColorUIResource [UI]
ComboBox.disabledForeground #888888 javax.swing.plaf.ColorUIResource [UI]
ComboBox.editorColumns 0
ComboBox.font [active] $defaultFont [UI]
ComboBox.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
@@ -266,7 +270,7 @@ EditorPane.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
EditorPane.font [active] $defaultFont [UI]
EditorPane.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
EditorPane.inactiveBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
EditorPane.inactiveForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
EditorPane.inactiveForeground #888888 javax.swing.plaf.ColorUIResource [UI]
EditorPane.margin 2,6,2,6 javax.swing.plaf.InsetsUIResource [UI]
EditorPane.selectionBackground #4b6eaf javax.swing.plaf.ColorUIResource [UI]
EditorPane.selectionForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
@@ -305,9 +309,9 @@ FormattedTextField.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResourc
FormattedTextField.font [active] $defaultFont [UI]
FormattedTextField.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
FormattedTextField.inactiveBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
FormattedTextField.inactiveForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
FormattedTextField.inactiveForeground #888888 javax.swing.plaf.ColorUIResource [UI]
FormattedTextField.margin 2,6,2,6 javax.swing.plaf.InsetsUIResource [UI]
FormattedTextField.placeholderForeground #777777 javax.swing.plaf.ColorUIResource [UI]
FormattedTextField.placeholderForeground #888888 javax.swing.plaf.ColorUIResource [UI]
FormattedTextField.selectionBackground #4b6eaf javax.swing.plaf.ColorUIResource [UI]
FormattedTextField.selectionForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
FormattedTextFieldUI com.formdev.flatlaf.ui.FlatFormattedTextFieldUI
@@ -335,7 +339,7 @@ HelpButton.questionMarkColor #a7a7a7 javax.swing.plaf.ColorUIResource [UI]
#---- Hyperlink ----
Hyperlink.disabledText #777777 javax.swing.plaf.ColorUIResource [UI]
Hyperlink.disabledText #888888 javax.swing.plaf.ColorUIResource [UI]
Hyperlink.linkColor #589df6 javax.swing.plaf.ColorUIResource [UI]
Hyperlink.visitedColor #589df6 javax.swing.plaf.ColorUIResource [UI]
HyperlinkUI com.formdev.flatlaf.swingx.ui.FlatHyperlinkUI
@@ -371,7 +375,7 @@ InternalFrame.inactiveBorderColor #353739 javax.swing.plaf.ColorUIResource [U
InternalFrame.inactiveDropShadowInsets 3,3,4,4 javax.swing.plaf.InsetsUIResource [UI]
InternalFrame.inactiveDropShadowOpacity 0.75
InternalFrame.inactiveTitleBackground #303234 javax.swing.plaf.ColorUIResource [UI]
InternalFrame.inactiveTitleForeground #777777 javax.swing.plaf.ColorUIResource [UI]
InternalFrame.inactiveTitleForeground #888888 javax.swing.plaf.ColorUIResource [UI]
InternalFrame.maximizeIcon [lazy] 24,24 com.formdev.flatlaf.icons.FlatInternalFrameMaximizeIcon [UI]
InternalFrame.minimizeIcon [lazy] 24,24 com.formdev.flatlaf.icons.FlatInternalFrameRestoreIcon [UI]
InternalFrame.titleFont [active] $defaultFont [UI]
@@ -412,15 +416,15 @@ JXHeader.startBackground #4c5052 javax.swing.plaf.ColorUIResource [UI]
JXMonthView.arrowColor #bbbbbb javax.swing.plaf.ColorUIResource [UI]
JXMonthView.background #45494a javax.swing.plaf.ColorUIResource [UI]
JXMonthView.daysOfTheWeekForeground #aaaaaa javax.swing.plaf.ColorUIResource [UI]
JXMonthView.disabledArrowColor #777777 javax.swing.plaf.ColorUIResource [UI]
JXMonthView.disabledArrowColor #888888 javax.swing.plaf.ColorUIResource [UI]
JXMonthView.flaggedDayForeground #e05555 javax.swing.plaf.ColorUIResource [UI]
JXMonthView.leadingDayForeground #777777 javax.swing.plaf.ColorUIResource [UI]
JXMonthView.leadingDayForeground #888888 javax.swing.plaf.ColorUIResource [UI]
JXMonthView.monthDownFileName [lazy] 20,20 com.formdev.flatlaf.swingx.ui.FlatMonthDownIcon [UI]
JXMonthView.monthStringBackground #4c5052 javax.swing.plaf.ColorUIResource [UI]
JXMonthView.monthStringForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
JXMonthView.monthUpFileName [lazy] 20,20 com.formdev.flatlaf.swingx.ui.FlatMonthUpIcon [UI]
JXMonthView.selectedBackground #4b6eaf javax.swing.plaf.ColorUIResource [UI]
JXMonthView.trailingDayForeground #777777 javax.swing.plaf.ColorUIResource [UI]
JXMonthView.trailingDayForeground #888888 javax.swing.plaf.ColorUIResource [UI]
JXMonthView.unselectableDayForeground #e05555 javax.swing.plaf.ColorUIResource [UI]
JXMonthView.weekOfTheYearForeground #888888 javax.swing.plaf.ColorUIResource [UI]
@@ -449,7 +453,7 @@ JideTabbedPaneUI com.formdev.flatlaf.jideoss.ui.FlatJideTabbedPane
#---- Label ----
Label.background #3c3f41 javax.swing.plaf.ColorUIResource [UI]
Label.disabledForeground #777777 javax.swing.plaf.ColorUIResource [UI]
Label.disabledForeground #888888 javax.swing.plaf.ColorUIResource [UI]
Label.disabledShadow #646464 javax.swing.plaf.ColorUIResource [UI]
Label.font [active] $defaultFont [UI]
Label.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
@@ -492,7 +496,7 @@ Menu.border [lazy] 0,0,0,0 false com.formdev.flatlaf.ui.F
Menu.borderPainted true
Menu.cancelMode hideLastSubmenu
Menu.crossMenuMnemonic true
Menu.disabledForeground #777777 javax.swing.plaf.ColorUIResource [UI]
Menu.disabledForeground #888888 javax.swing.plaf.ColorUIResource [UI]
Menu.font [active] $defaultFont [UI]
Menu.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
Menu.icon.arrowColor #a7a7a7 javax.swing.plaf.ColorUIResource [UI]
@@ -540,7 +544,7 @@ MenuItem.border [lazy] 0,0,0,0 false com.formdev.flatlaf.ui.F
MenuItem.borderPainted true
MenuItem.checkBackground #484c4f com.formdev.flatlaf.util.DerivedColor [UI] lighten(10% autoInverse)
MenuItem.checkMargins 2,2,2,2 javax.swing.plaf.InsetsUIResource [UI]
MenuItem.disabledForeground #777777 javax.swing.plaf.ColorUIResource [UI]
MenuItem.disabledForeground #888888 javax.swing.plaf.ColorUIResource [UI]
MenuItem.font [active] $defaultFont [UI]
MenuItem.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
MenuItem.iconTextGap 6
@@ -643,11 +647,12 @@ PasswordField.echoChar '\u2022'
PasswordField.font [active] $defaultFont [UI]
PasswordField.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
PasswordField.inactiveBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
PasswordField.inactiveForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
PasswordField.inactiveForeground #888888 javax.swing.plaf.ColorUIResource [UI]
PasswordField.margin 2,6,2,6 javax.swing.plaf.InsetsUIResource [UI]
PasswordField.placeholderForeground #777777 javax.swing.plaf.ColorUIResource [UI]
PasswordField.placeholderForeground #888888 javax.swing.plaf.ColorUIResource [UI]
PasswordField.selectionBackground #4b6eaf javax.swing.plaf.ColorUIResource [UI]
PasswordField.selectionForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
PasswordField.showCapsLock true
PasswordFieldUI com.formdev.flatlaf.ui.FlatPasswordFieldUI
@@ -706,7 +711,7 @@ ProgressBarUI com.formdev.flatlaf.ui.FlatProgressBarUI
RadioButton.background #3c3f41 javax.swing.plaf.ColorUIResource [UI]
RadioButton.border [lazy] 0,0,0,0 false com.formdev.flatlaf.ui.FlatMarginBorder [UI]
RadioButton.darkShadow #7e7e7e javax.swing.plaf.ColorUIResource [UI]
RadioButton.disabledText #777777 javax.swing.plaf.ColorUIResource [UI]
RadioButton.disabledText #888888 javax.swing.plaf.ColorUIResource [UI]
RadioButton.font [active] $defaultFont [UI]
RadioButton.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
RadioButton.highlight #242424 javax.swing.plaf.ColorUIResource [UI]
@@ -732,7 +737,7 @@ RadioButtonMenuItem.background #303234 javax.swing.plaf.ColorUIResource [UI]
RadioButtonMenuItem.border [lazy] 0,0,0,0 false com.formdev.flatlaf.ui.FlatMenuItemBorder [UI]
RadioButtonMenuItem.borderPainted true
RadioButtonMenuItem.checkIcon [lazy] 15,15 com.formdev.flatlaf.icons.FlatRadioButtonMenuItemIcon [UI]
RadioButtonMenuItem.disabledForeground #777777 javax.swing.plaf.ColorUIResource [UI]
RadioButtonMenuItem.disabledForeground #888888 javax.swing.plaf.ColorUIResource [UI]
RadioButtonMenuItem.font [active] $defaultFont [UI]
RadioButtonMenuItem.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
RadioButtonMenuItem.margin 3,6,3,6 javax.swing.plaf.InsetsUIResource [UI]
@@ -863,7 +868,7 @@ Spinner.buttonDisabledArrowColor #585858 javax.swing.plaf.ColorUIResource [UI
Spinner.buttonHoverArrowColor #bbbbbb javax.swing.plaf.ColorUIResource [UI]
Spinner.buttonStyle button
Spinner.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
Spinner.disabledForeground #777777 javax.swing.plaf.ColorUIResource [UI]
Spinner.disabledForeground #888888 javax.swing.plaf.ColorUIResource [UI]
Spinner.editorAlignment 11
Spinner.editorBorderPainted false
Spinner.font [active] $defaultFont [UI]
@@ -904,7 +909,7 @@ TabbedPane.contentAreaColor #323232 javax.swing.plaf.ColorUIResource [UI]
TabbedPane.contentOpaque true
TabbedPane.contentSeparatorHeight 1
TabbedPane.darkShadow #7e7e7e javax.swing.plaf.ColorUIResource [UI]
TabbedPane.disabledForeground #777777 javax.swing.plaf.ColorUIResource [UI]
TabbedPane.disabledForeground #888888 javax.swing.plaf.ColorUIResource [UI]
TabbedPane.disabledUnderlineColor #7a7a7a javax.swing.plaf.ColorUIResource [UI]
TabbedPane.focus #bbbbbb javax.swing.plaf.ColorUIResource [UI]
TabbedPane.focusColor #3d4b5c javax.swing.plaf.ColorUIResource [UI]
@@ -1010,7 +1015,7 @@ TextArea.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
TextArea.font [active] $defaultFont [UI]
TextArea.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
TextArea.inactiveBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
TextArea.inactiveForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
TextArea.inactiveForeground #888888 javax.swing.plaf.ColorUIResource [UI]
TextArea.margin 2,6,2,6 javax.swing.plaf.InsetsUIResource [UI]
TextArea.selectionBackground #4b6eaf javax.swing.plaf.ColorUIResource [UI]
TextArea.selectionForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
@@ -1035,10 +1040,10 @@ TextField.font [active] $defaultFont [UI]
TextField.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
TextField.highlight #242424 javax.swing.plaf.ColorUIResource [UI]
TextField.inactiveBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
TextField.inactiveForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
TextField.inactiveForeground #888888 javax.swing.plaf.ColorUIResource [UI]
TextField.light #313131 javax.swing.plaf.ColorUIResource [UI]
TextField.margin 2,6,2,6 javax.swing.plaf.InsetsUIResource [UI]
TextField.placeholderForeground #777777 javax.swing.plaf.ColorUIResource [UI]
TextField.placeholderForeground #888888 javax.swing.plaf.ColorUIResource [UI]
TextField.selectionBackground #4b6eaf javax.swing.plaf.ColorUIResource [UI]
TextField.selectionForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
TextField.shadow #646464 javax.swing.plaf.ColorUIResource [UI]
@@ -1055,7 +1060,7 @@ TextPane.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
TextPane.font [active] $defaultFont [UI]
TextPane.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
TextPane.inactiveBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
TextPane.inactiveForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
TextPane.inactiveForeground #888888 javax.swing.plaf.ColorUIResource [UI]
TextPane.margin 2,6,2,6 javax.swing.plaf.InsetsUIResource [UI]
TextPane.selectionBackground #4b6eaf javax.swing.plaf.ColorUIResource [UI]
TextPane.selectionForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
@@ -1080,7 +1085,7 @@ TitlePane.iconMargins 3,8,3,0 javax.swing.plaf.InsetsUIResource [UI]
TitlePane.iconSize 16,16 javax.swing.plaf.DimensionUIResource [UI]
TitlePane.iconifyIcon [lazy] 44,30 com.formdev.flatlaf.icons.FlatWindowIconifyIcon [UI]
TitlePane.inactiveBackground #303234 javax.swing.plaf.ColorUIResource [UI]
TitlePane.inactiveForeground #777777 javax.swing.plaf.ColorUIResource [UI]
TitlePane.inactiveForeground #888888 javax.swing.plaf.ColorUIResource [UI]
TitlePane.maximizeIcon [lazy] 44,30 com.formdev.flatlaf.icons.FlatWindowMaximizeIcon [UI]
TitlePane.menuBarEmbedded true
TitlePane.menuBarMargins 0,8,0,22 javax.swing.plaf.InsetsUIResource [UI]
@@ -1107,7 +1112,7 @@ ToggleButton.border [lazy] 1,1,1,1 false com.formdev.flatlaf.ui.F
ToggleButton.darkShadow #7e7e7e javax.swing.plaf.ColorUIResource [UI]
ToggleButton.disabledBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
ToggleButton.disabledSelectedBackground #53585a com.formdev.flatlaf.util.DerivedColor [UI] lighten(3% autoInverse)
ToggleButton.disabledText #777777 javax.swing.plaf.ColorUIResource [UI]
ToggleButton.disabledText #888888 javax.swing.plaf.ColorUIResource [UI]
ToggleButton.font [active] $defaultFont [UI]
ToggleButton.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
ToggleButton.highlight #242424 javax.swing.plaf.ColorUIResource [UI]
@@ -1141,7 +1146,7 @@ ToolBar.darkShadow #7e7e7e javax.swing.plaf.ColorUIResource [UI]
ToolBar.dockingBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
ToolBar.dockingForeground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
ToolBar.floatingBackground #3c3f41 javax.swing.plaf.ColorUIResource [UI]
ToolBar.floatingForeground #777777 javax.swing.plaf.ColorUIResource [UI]
ToolBar.floatingForeground #888888 javax.swing.plaf.ColorUIResource [UI]
ToolBar.font [active] $defaultFont [UI]
ToolBar.foreground #bbbbbb javax.swing.plaf.ColorUIResource [UI]
ToolBar.gripColor #adadad javax.swing.plaf.ColorUIResource [UI]
@@ -1287,7 +1292,7 @@ swingx/TaskPaneUI com.formdev.flatlaf.swingx.ui.FlatTaskPaneUI
text #45494a javax.swing.plaf.ColorUIResource [UI]
textHighlight #4b6eaf javax.swing.plaf.ColorUIResource [UI]
textHighlightText #bbbbbb javax.swing.plaf.ColorUIResource [UI]
textInactiveText #777777 javax.swing.plaf.ColorUIResource [UI]
textInactiveText #888888 javax.swing.plaf.ColorUIResource [UI]
textText #bbbbbb javax.swing.plaf.ColorUIResource [UI]
window #3c3f41 javax.swing.plaf.ColorUIResource [UI]
windowBorder #bbbbbb javax.swing.plaf.ColorUIResource [UI]

View File

@@ -80,6 +80,7 @@ Button.default.pressedBackground #e6e6e6 com.formdev.flatlaf.util.DerivedColo
Button.defaultButtonFollowsFocus true
Button.disabledBackground #f2f2f2 javax.swing.plaf.ColorUIResource [UI]
Button.disabledBorderColor #cfcfcf javax.swing.plaf.ColorUIResource [UI]
Button.disabledSelectedBackground #dedede com.formdev.flatlaf.util.DerivedColor [UI] darken(13% autoInverse)
Button.disabledText #8c8c8c javax.swing.plaf.ColorUIResource [UI]
Button.focusedBackground #e3f1fa javax.swing.plaf.ColorUIResource [UI]
Button.focusedBorderColor #87afda javax.swing.plaf.ColorUIResource [UI]
@@ -94,12 +95,15 @@ Button.margin 2,14,2,14 javax.swing.plaf.InsetsUIResource [U
Button.minimumWidth 72
Button.pressedBackground #e6e6e6 com.formdev.flatlaf.util.DerivedColor [UI] darken(10% autoInverse)
Button.rollover true
Button.selectedBackground #cccccc com.formdev.flatlaf.util.DerivedColor [UI] darken(20% autoInverse)
Button.selectedForeground #000000 javax.swing.plaf.ColorUIResource [UI]
Button.shadow #c4c4c4 javax.swing.plaf.ColorUIResource [UI]
Button.textIconGap 4
Button.textShiftOffset 0
Button.toolbar.hoverBackground #e0e0e0 com.formdev.flatlaf.util.DerivedColor [UI] darken(12% autoInverse)
Button.toolbar.margin 3,3,3,3 javax.swing.plaf.InsetsUIResource [UI]
Button.toolbar.pressedBackground #d9d9d9 com.formdev.flatlaf.util.DerivedColor [UI] darken(15% autoInverse)
Button.toolbar.selectedBackground #cccccc com.formdev.flatlaf.util.DerivedColor [UI] darken(20% autoInverse)
Button.toolbar.spacingInsets 1,2,1,2 javax.swing.plaf.InsetsUIResource [UI]
ButtonUI com.formdev.flatlaf.ui.FlatButtonUI
@@ -653,6 +657,7 @@ PasswordField.margin 2,6,2,6 javax.swing.plaf.InsetsUIResource [UI]
PasswordField.placeholderForeground #8c8c8c javax.swing.plaf.ColorUIResource [UI]
PasswordField.selectionBackground #2675bf javax.swing.plaf.ColorUIResource [UI]
PasswordField.selectionForeground #ffffff javax.swing.plaf.ColorUIResource [UI]
PasswordField.showCapsLock true
PasswordFieldUI com.formdev.flatlaf.ui.FlatPasswordFieldUI

View File

@@ -25,3 +25,29 @@ dependencies {
implementation( "com.fifesoft:rsyntaxtextarea:3.1.1" )
implementation( "com.fifesoft:autocomplete:3.1.0" )
}
tasks {
jar {
dependsOn( ":flatlaf-core:jar" )
dependsOn( ":flatlaf-extras:jar" )
manifest {
attributes( "Main-Class" to "com.formdev.flatlaf.themeeditor.FlatThemeFileEditor" )
if( JavaVersion.current() >= JavaVersion.VERSION_1_9 )
attributes( "Multi-Release" to "true" )
}
exclude( "module-info.class" )
exclude( "META-INF/versions/*/module-info.class" )
// include all dependencies in jar
from( {
configurations.runtimeClasspath.get()
.filter { it.name.endsWith( "jar" ) }
.map { zipTree( it ).matching {
exclude( "META-INF/LICENSE" )
} }
} )
}
}

View File

@@ -29,6 +29,7 @@ import javax.swing.*;
import org.fife.ui.rsyntaxtextarea.FileLocation;
import com.formdev.flatlaf.FlatLightLaf;
import com.formdev.flatlaf.extras.FlatInspector;
import com.formdev.flatlaf.extras.FlatUIDefaultsInspector;
import com.formdev.flatlaf.util.UIScale;
/**
@@ -51,6 +52,7 @@ public class FlatThemeFileEditor
SwingUtilities.invokeLater( () -> {
FlatLightLaf.install();
FlatInspector.install( "ctrl alt shift X" );
FlatUIDefaultsInspector.install( "ctrl shift alt Y" );
FlatThemeFileEditor frame = new FlatThemeFileEditor();
@@ -85,7 +87,7 @@ public class FlatThemeFileEditor
themeEditorArea = new FlatThemeEditorPane();
//======== this ========
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setTitle("FlatLaf Theme Editor");
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());

View File

@@ -1,4 +1,4 @@
JFDML JFormDesigner: "7.0.1.0.272" Java: "13.0.1" encoding: "UTF-8"
JFDML JFormDesigner: "7.0.2.0.298" Java: "14" encoding: "UTF-8"
new FormModel {
contentType: "form/swing"
@@ -7,7 +7,7 @@ new FormModel {
name: "this"
"$locationPolicy": 2
"$sizePolicy": 2
"defaultCloseOperation": 2
"defaultCloseOperation": 3
"title": "FlatLaf Theme Editor"
add( new FormContainer( "javax.swing.JPanel", new FormLayoutManager( class java.awt.BorderLayout ) ) {
name: "dialogPane"

View File

@@ -28,6 +28,7 @@ Button.default.pressedBackground
Button.defaultButtonFollowsFocus
Button.disabledBackground
Button.disabledBorderColor
Button.disabledSelectedBackground
Button.disabledText
Button.focusInputMap
Button.focusedBackground
@@ -43,12 +44,15 @@ Button.margin
Button.minimumWidth
Button.pressedBackground
Button.rollover
Button.selectedBackground
Button.selectedForeground
Button.shadow
Button.textIconGap
Button.textShiftOffset
Button.toolbar.hoverBackground
Button.toolbar.margin
Button.toolbar.pressedBackground
Button.toolbar.selectedBackground
Button.toolbar.spacingInsets
ButtonUI
Caret.width
@@ -448,6 +452,7 @@ PasswordField.margin
PasswordField.placeholderForeground
PasswordField.selectionBackground
PasswordField.selectionForeground
PasswordField.showCapsLock
PasswordFieldUI
Popup.dropShadowColor
Popup.dropShadowInsets

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

BIN
images/arc_orange.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
images/carbon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
images/cyan_light.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
images/dark_purple.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

Some files were not shown because too many files have changed in this diff Show More