Theme Editor: added "live" preview

This commit is contained in:
Karl Tauber
2021-08-21 18:09:59 +02:00
parent c6d1ed91a7
commit dab0ee3306
10 changed files with 1290 additions and 10 deletions

View File

@@ -35,6 +35,7 @@ import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.Properties;
@@ -66,6 +67,7 @@ import javax.swing.text.html.HTMLEditorKit;
import com.formdev.flatlaf.ui.FlatNativeWindowBorder;
import com.formdev.flatlaf.ui.FlatPopupFactory;
import com.formdev.flatlaf.ui.FlatRootPaneUI;
import com.formdev.flatlaf.ui.FlatUIUtils;
import com.formdev.flatlaf.util.GrayFilter;
import com.formdev.flatlaf.util.LoggingFacade;
import com.formdev.flatlaf.util.MultiResolutionImageSupport;
@@ -96,6 +98,7 @@ public abstract class FlatLaf
private MnemonicHandler mnemonicHandler;
private Consumer<UIDefaults> postInitialization;
private List<Function<Object, Object>> uiDefaultsGetters;
/**
* Sets the application look and feel to the given LaF
@@ -356,7 +359,7 @@ public abstract class FlatLaf
public UIDefaults getDefaults() {
// use larger initial capacity to avoid resizing UI defaults hash table
// (from 610 to 1221 to 2443 entries) and to save some memory
UIDefaults defaults = new UIDefaults( 1500, 0.75f );
UIDefaults defaults = new FlatUIDefaults( 1500, 0.75f );
// initialize basic defaults (see super.getDefaults())
initClassDefaults( defaults );
@@ -921,6 +924,104 @@ public abstract class FlatLaf
return super.hashCode();
}
/**
* Registers a UI defaults getter function that is invoked before the standard getter.
* This allows using different UI defaults for special purposes
* (e.g. using multiple themes at the same time).
*
* @see #unregisterUIDefaultsGetter(Function)
* @see #runWithUIDefaultsGetter(Function, Runnable)
* @since 1.6
*/
public void registerUIDefaultsGetter( Function<Object, Object> uiDefaultsGetter ) {
if( uiDefaultsGetters == null )
uiDefaultsGetters = new ArrayList<>();
uiDefaultsGetters.remove( uiDefaultsGetter );
uiDefaultsGetters.add( uiDefaultsGetter );
// disable shared UIs
FlatUIUtils.setUseSharedUIs( false );
}
/**
* Unregisters a UI defaults getter function that was invoked before the standard getter.
*
* @see #registerUIDefaultsGetter(Function)
* @see #runWithUIDefaultsGetter(Function, Runnable)
* @since 1.6
*/
public void unregisterUIDefaultsGetter( Function<Object, Object> uiDefaultsGetter ) {
if( uiDefaultsGetters == null )
return;
uiDefaultsGetters.remove( uiDefaultsGetter );
// enable shared UIs
if( uiDefaultsGetters.isEmpty() )
FlatUIUtils.setUseSharedUIs( true );
}
/**
* Registers a UI defaults getter function that is invoked before the standard getter,
* runs the given runnable and unregisters the UI defaults getter function again.
* This allows using different UI defaults for special purposes
* (e.g. using multiple themes at the same time).
* If the current look and feel is not FlatLaf, then the getter is ignored and
* the given runnable invoked.
*
* @see #registerUIDefaultsGetter(Function)
* @see #unregisterUIDefaultsGetter(Function)
* @since 1.6
*/
public static void runWithUIDefaultsGetter( Function<Object, Object> uiDefaultsGetter, Runnable runnable ) {
LookAndFeel laf = UIManager.getLookAndFeel();
if( laf instanceof FlatLaf ) {
((FlatLaf)laf).registerUIDefaultsGetter( uiDefaultsGetter );
try {
runnable.run();
} finally {
((FlatLaf)laf).unregisterUIDefaultsGetter( uiDefaultsGetter );
}
} else
runnable.run();
}
//---- class FlatUIDefaults -----------------------------------------------
private class FlatUIDefaults
extends UIDefaults
{
FlatUIDefaults( int initialCapacity, float loadFactor ) {
super( initialCapacity, loadFactor );
}
@Override
public Object get( Object key ) {
Object value = getValue( key );
return (value != null) ? value : super.get( key );
}
@Override
public Object get( Object key, Locale l ) {
Object value = getValue( key );
return (value != null) ? value : super.get( key, l );
}
private Object getValue( Object key ) {
if( uiDefaultsGetters == null )
return null;
for( int i = uiDefaultsGetters.size() - 1; i >= 0; i-- ) {
Object value = uiDefaultsGetters.get( i ).apply( key );
if( value != null )
return value;
}
return null;
}
}
//---- class ActiveFont ---------------------------------------------------
private static class ActiveFont

View File

@@ -69,6 +69,7 @@ public class FlatUIUtils
{
public static final boolean MAC_USE_QUARTZ = Boolean.getBoolean( "apple.awt.graphics.UseQuartz" );
private static boolean useSharedUIs = true;
private static WeakHashMap<LookAndFeel, IdentityHashMap<Object, ComponentUI>> sharedUIinstances = new WeakHashMap<>();
public static Rectangle addInsets( Rectangle r, Insets insets ) {
@@ -825,6 +826,27 @@ debug*/
return explicitlySet;
}
/**
* Returns whether shared UI delegates are used.
*
* @since 1.6
*/
public static boolean isUseSharedUIs() {
return useSharedUIs;
}
/**
* Specifies whether shared UI delegates are used.
* This does not change already existing UI delegates.
*
* @since 1.6
*/
public static boolean setUseSharedUIs( boolean useSharedUIs ) {
boolean old = FlatUIUtils.useSharedUIs;
FlatUIUtils.useSharedUIs = useSharedUIs;
return old;
}
/**
* Creates a shared component UI for the given key and the current Laf.
* Each Laf instance has its own shared component UI instance.
@@ -833,6 +855,9 @@ debug*/
* may use multiple Laf instances at the same time.
*/
public static ComponentUI createSharedUI( Object key, Supplier<ComponentUI> newInstanceSupplier ) {
if( !useSharedUIs )
return newInstanceSupplier.get();
return sharedUIinstances
.computeIfAbsent( UIManager.getLookAndFeel(), k -> new IdentityHashMap<>() )
.computeIfAbsent( key, k -> newInstanceSupplier.get() );

View File

@@ -30,6 +30,7 @@ import javax.swing.JFrame;
import javax.swing.JLayer;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
@@ -67,6 +68,8 @@ class FlatThemeEditorPane
private final FlatSyntaxTextArea textArea;
private final ErrorStrip errorStrip;
private FlatFindReplaceBar findReplaceBar;
private JScrollPane previewScrollPane;
private FlatThemePreview preview;
private File file;
@@ -260,6 +263,30 @@ class FlatThemeEditorPane
collapsiblePanel.showBottomComponent( findReplaceBar );
}
void showPreview( boolean show ) {
if( show ) {
if( preview != null )
return;
preview = new FlatThemePreview( textArea );
previewScrollPane = new JScrollPane( preview );
previewScrollPane.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
previewScrollPane.setBorder( null );
previewScrollPane.getVerticalScrollBar().setUnitIncrement( 20 );
previewScrollPane.getHorizontalScrollBar().setUnitIncrement( 20 );
add( previewScrollPane, BorderLayout.LINE_END );
} else {
if( preview == null )
return;
remove( previewScrollPane );
previewScrollPane = null;
preview = null;
}
revalidate();
}
//---- class FlatSyntaxScheme ---------------------------------------------
private static class FlatSyntaxScheme

View File

@@ -61,6 +61,7 @@ public class FlatThemeFileEditor
private static final String KEY_RECENT_DIRECTORY = "recentDirectory";
private static final String KEY_RECENT_FILE = "recentFile";
private static final String KEY_WINDOW_BOUNDS = "windowBounds";
private static final String KEY_PREVIEW = "preview";
private static final String KEY_LAF = "laf";
private static final String KEY_FONT_SIZE_INCR = "fontSizeIncr";
@@ -281,6 +282,9 @@ public class FlatThemeFileEditor
tabbedPane.setTitleAt( index, titleFun.get() );
} );
if( state.getBoolean( KEY_PREVIEW, true ) )
themeEditorPane.showPreview( true );
tabbedPane.addTab( titleFun.get(), null, themeEditorPane, file.getAbsolutePath() );
if( select )
@@ -350,6 +354,13 @@ public class FlatThemeFileEditor
themeEditorPane.showFindReplaceBar();
}
private void showHidePreview() {
boolean show = previewMenuItem.isSelected();
for( FlatThemeEditorPane themeEditorPane : getThemeEditorPanes() )
themeEditorPane.showPreview( show );
state.putBoolean( KEY_PREVIEW, show );
}
private void lightLaf() {
applyLookAndFeel( FlatLightLaf.class.getName() );
}
@@ -407,6 +418,8 @@ public class FlatThemeFileEditor
String[] directories = getPrefsStrings( state, KEY_DIRECTORIES );
SortedComboBoxModel<String> model = new SortedComboBoxModel<>( directories );
directoryField.setModel( model );
previewMenuItem.setSelected( state.getBoolean( KEY_PREVIEW, true ) );
}
private void saveState() {
@@ -505,6 +518,7 @@ public class FlatThemeFileEditor
editMenu = new JMenu();
findMenuItem = new JMenuItem();
viewMenu = new JMenu();
previewMenuItem = new JCheckBoxMenuItem();
lightLafMenuItem = new JRadioButtonMenuItem();
darkLafMenuItem = new JRadioButtonMenuItem();
incrFontSizeMenuItem = new JMenuItem();
@@ -589,6 +603,13 @@ public class FlatThemeFileEditor
viewMenu.setText("View");
viewMenu.setMnemonic('V');
//---- previewMenuItem ----
previewMenuItem.setText("Preview");
previewMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK));
previewMenuItem.addActionListener(e -> showHidePreview());
viewMenu.add(previewMenuItem);
viewMenu.addSeparator();
//---- lightLafMenuItem ----
lightLafMenuItem.setText("Light Laf");
lightLafMenuItem.setMnemonic('L');
@@ -684,10 +705,10 @@ public class FlatThemeFileEditor
}
contentPane.add(tabbedPane, BorderLayout.CENTER);
//---- buttonGroup1 ----
ButtonGroup buttonGroup1 = new ButtonGroup();
buttonGroup1.add(lightLafMenuItem);
buttonGroup1.add(darkLafMenuItem);
//---- lafButtonGroup ----
ButtonGroup lafButtonGroup = new ButtonGroup();
lafButtonGroup.add(lightLafMenuItem);
lafButtonGroup.add(darkLafMenuItem);
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
@@ -700,6 +721,7 @@ public class FlatThemeFileEditor
private JMenu editMenu;
private JMenuItem findMenuItem;
private JMenu viewMenu;
private JCheckBoxMenuItem previewMenuItem;
private JRadioButtonMenuItem lightLafMenuItem;
private JRadioButtonMenuItem darkLafMenuItem;
private JMenuItem incrFontSizeMenuItem;

View File

@@ -99,10 +99,19 @@ new FormModel {
name: "viewMenu"
"text": "View"
"mnemonic": 86
add( new FormComponent( "javax.swing.JCheckBoxMenuItem" ) {
name: "previewMenuItem"
"text": "Preview"
"accelerator": static javax.swing.KeyStroke getKeyStroke( 80, 130, false )
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "showHidePreview", false ) )
} )
add( new FormComponent( "javax.swing.JPopupMenu$Separator" ) {
name: "separator3"
} )
add( new FormComponent( "javax.swing.JRadioButtonMenuItem" ) {
name: "lightLafMenuItem"
"text": "Light Laf"
"$buttonGroup": new FormReference( "buttonGroup1" )
"$buttonGroup": new FormReference( "lafButtonGroup" )
"mnemonic": 76
"selected": true
"accelerator": static javax.swing.KeyStroke getKeyStroke( 122, 0, false )
@@ -111,7 +120,7 @@ new FormModel {
add( new FormComponent( "javax.swing.JRadioButtonMenuItem" ) {
name: "darkLafMenuItem"
"text": "Dark Laf"
"$buttonGroup": new FormReference( "buttonGroup1" )
"$buttonGroup": new FormReference( "lafButtonGroup" )
"mnemonic": 68
"accelerator": static javax.swing.KeyStroke getKeyStroke( 123, 0, false )
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "darkLaf", false ) )
@@ -163,7 +172,7 @@ new FormModel {
"size": new java.awt.Dimension( 535, 300 )
} )
add( new FormNonVisual( "javax.swing.ButtonGroup" ) {
name: "buttonGroup1"
name: "lafButtonGroup"
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 310 )
} )

View File

@@ -0,0 +1,649 @@
/*
/*
* Copyright 2021 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.themeeditor;
import java.awt.*;
import java.awt.event.HierarchyEvent;
import javax.swing.*;
import javax.swing.UIDefaults.ActiveValue;
import javax.swing.UIDefaults.LazyValue;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import com.formdev.flatlaf.FlatLaf;
import com.formdev.flatlaf.extras.components.*;
import net.miginfocom.swing.*;
/**
* @author Karl Tauber
*/
class FlatThemePreview
extends JPanel
implements DocumentListener
{
private final FlatSyntaxTextArea textArea;
private final Timer timer;
FlatThemePreview( FlatSyntaxTextArea textArea ) {
this.textArea = textArea;
initComponents();
tabbedPane1.setTabLayoutPolicy( JTabbedPane.SCROLL_TAB_LAYOUT );
tabbedPane1.addTab( "Tab 1", null );
tabbedPane1.addTab( "Tab 2", null );
tabbedPane1.addTab( "Tab 3", null );
tabbedPane1.addTab( "Tab 4", null );
tabbedPane1.addTab( "Tab 5", null );
tabbedPane1.addTab( "Tab 6", null );
tabbedPane1.addTab( "Tab 7", null );
tabbedPane1.addTab( "Tab 8", null );
// timer used for delayed preview updates
timer = new Timer( 500, e -> update() );
timer.setRepeats( false );
// listen to changes in text area to automatically update preview
textArea.getDocument().addDocumentListener( this );
// update when showing preview (e.g. activating tab)
addHierarchyListener( e -> {
if( (e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0 && isShowing() )
EventQueue.invokeLater( this::update );
} );
}
@Override
public void insertUpdate( DocumentEvent e ) {
timer.restart();
}
@Override
public void removeUpdate( DocumentEvent e ) {
timer.restart();
}
@Override
public void changedUpdate( DocumentEvent e ) {
}
private void update() {
if( !isShowing() )
return;
FlatLaf.runWithUIDefaultsGetter( this::getUIDefaultProperty, this::updateComponentTreeUI );
}
private void updateComponentTreeUI() {
try {
SwingUtilities.updateComponentTreeUI( this );
} catch( Exception ex ) {
ex.printStackTrace();
}
}
private Object getUIDefaultProperty( Object key ) {
if( !(key instanceof String) )
return null;
Object value = textArea.propertiesSupport.getParsedProperty( (String) key );
if( value instanceof LazyValue )
value = ((LazyValue)value).createValue( null );
else if( value instanceof ActiveValue )
value = ((ActiveValue)value).createValue( null );
// System.out.println( key + " = " + value );
return value;
}
@SuppressWarnings( "deprecation" )
@Override
public void layout() {
try {
super.layout();
} catch( Exception ex ) {
ex.printStackTrace();
}
}
@Override
protected void validateTree() {
try {
super.validateTree();
} catch( Exception ex ) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
try {
return super.getPreferredSize();
} catch( Exception ex ) {
ex.printStackTrace();
return new Dimension( 100, 100 );
}
}
@Override
public Dimension getMinimumSize() {
try {
return super.getMinimumSize();
} catch( Exception ex ) {
ex.printStackTrace();
return new Dimension( 100, 100 );
}
}
@Override
public Dimension getMaximumSize() {
try {
return super.getMaximumSize();
} catch( Exception ex ) {
ex.printStackTrace();
return new Dimension( Short.MAX_VALUE, Short.MAX_VALUE );
}
}
@Override
public void paint( Graphics g ) {
try {
super.paint( g );
} catch( Exception ex ) {
ex.printStackTrace();
}
}
@Override
protected void paintComponent( Graphics g ) {
try {
super.paintComponent( g );
} catch( Exception ex ) {
ex.printStackTrace();
}
}
@Override
protected void paintChildren( Graphics g ) {
try {
super.paintChildren( g );
} catch( Exception ex ) {
ex.printStackTrace();
}
}
private void enabledChanged() {
FlatLaf.runWithUIDefaultsGetter( this::getUIDefaultProperty, () -> {
enableDisable( this, enabledCheckBox.isSelected() );
} );
}
private void enableDisable( Component comp, boolean enabled ) {
comp.setEnabled( enabled );
if( !(comp instanceof Container) )
return;
for( Component c : ((Container)comp).getComponents() ) {
if( c == enabledCheckBox || c == previewLabel )
continue;
if( c instanceof JScrollPane )
c = ((JScrollPane)c).getViewport().getView();
enableDisable( c, enabled );
}
}
private void changeProgress() {
int value = slider3.getValue();
progressBar1.setValue( value );
}
private void initComponents() {
// JFormDesigner - Component initialization - DO NOT MODIFY //GEN-BEGIN:initComponents
previewLabel = new JLabel();
enabledCheckBox = new JCheckBox();
separator2 = new JSeparator();
labelLabel = new JLabel();
label1 = new JLabel();
flatButton1 = new FlatButton();
buttonLabel = new JLabel();
button1 = new JButton();
testDefaultButton1 = new FlatThemePreview.TestDefaultButton();
helpButton = new FlatButton();
hSpacer2 = new JPanel(null);
toggleButtonLabel = new JLabel();
toggleButton1 = new JToggleButton();
toggleButton3 = new JToggleButton();
hSpacer1 = new JPanel(null);
checkBoxLabel = new JLabel();
checkBox1 = new JCheckBox();
checkBox3 = new JCheckBox();
hSpacer3 = new JPanel(null);
radioButtonLabel = new JLabel();
radioButton1 = new JRadioButton();
radioButton3 = new JRadioButton();
hSpacer4 = new JPanel(null);
comboBoxLabel = new JLabel();
comboBox1 = new FlatComboBox<>();
comboBox3 = new JComboBox<>();
spinnerLabel = new JLabel();
spinner1 = new JSpinner();
textFieldLabel = new JLabel();
textField1 = new FlatTextField();
formattedTextFieldLabel = new JLabel();
formattedTextField1 = new FlatFormattedTextField();
passwordFieldLabel = new JLabel();
passwordField1 = new FlatPasswordField();
textAreaLabel = new JLabel();
scrollPane1 = new JScrollPane();
textArea1 = new JTextArea();
editorPaneLabel = new JLabel();
scrollPane5 = new JScrollPane();
editorPane1 = new JEditorPane();
textPaneLabel = new JLabel();
scrollPane9 = new JScrollPane();
textPane1 = new JTextPane();
scrollBarLabel = new JLabel();
scrollBar1 = new JScrollBar();
scrollBar5 = new FlatScrollBar();
separatorLabel = new JLabel();
separator1 = new JSeparator();
sliderLabel = new JLabel();
slider1 = new JSlider();
slider3 = new JSlider();
progressBarLabel = new JLabel();
progressBar1 = new FlatProgressBar();
toolTipLabel = new JLabel();
toolTip1 = new JToolTip();
tabbedPaneLabel = new JLabel();
tabbedPane1 = new JTabbedPane();
//======== this ========
setLayout(new MigLayout(
"insets dialog,hidemode 3",
// columns
"[fill]" +
"[130,fill]",
// rows
"[]0" +
"[]unrel" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[]" +
"[grow]"));
//---- previewLabel ----
previewLabel.setText("Preview");
previewLabel.setFont(previewLabel.getFont().deriveFont(previewLabel.getFont().getSize() + 6f));
add(previewLabel, "cell 0 0 2 1,alignx left,growx 0");
//---- enabledCheckBox ----
enabledCheckBox.setText("Enabled");
enabledCheckBox.setSelected(true);
enabledCheckBox.addActionListener(e -> enabledChanged());
add(enabledCheckBox, "cell 0 0 2 1,align right top,grow 0 0");
add(separator2, "cell 0 1 2 1");
//---- labelLabel ----
labelLabel.setText("JLabel:");
add(labelLabel, "cell 0 2");
//---- label1 ----
label1.setText("Some Text");
add(label1, "cell 1 2");
//---- flatButton1 ----
flatButton1.setText("Help");
flatButton1.setButtonType(FlatButton.ButtonType.help);
flatButton1.setVisible(false);
add(flatButton1, "cell 1 1,alignx right,growx 0");
//---- buttonLabel ----
buttonLabel.setText("JButton:");
add(buttonLabel, "cell 0 3");
//---- button1 ----
button1.setText("Apply");
button1.setToolTipText("This button is enabled.");
add(button1, "cell 1 3,alignx left,growx 0");
//---- testDefaultButton1 ----
testDefaultButton1.setText("OK");
add(testDefaultButton1, "cell 1 3");
//---- helpButton ----
helpButton.setButtonType(FlatButton.ButtonType.help);
add(helpButton, "cell 1 3");
add(hSpacer2, "cell 1 3");
//---- toggleButtonLabel ----
toggleButtonLabel.setText("JToggleButton:");
add(toggleButtonLabel, "cell 0 4");
//---- toggleButton1 ----
toggleButton1.setText("Unselected");
toggleButton1.setToolTipText("LOOOOOOOOOOOOOONG TEXT");
add(toggleButton1, "cell 1 4,alignx left,growx 0");
//---- toggleButton3 ----
toggleButton3.setText("Selected");
toggleButton3.setSelected(true);
add(toggleButton3, "cell 1 4");
add(hSpacer1, "cell 1 4");
//---- checkBoxLabel ----
checkBoxLabel.setText("JCheckBox");
add(checkBoxLabel, "cell 0 5");
//---- checkBox1 ----
checkBox1.setText("Unselected");
add(checkBox1, "cell 1 5,alignx left,growx 0");
//---- checkBox3 ----
checkBox3.setText("Selected");
checkBox3.setSelected(true);
add(checkBox3, "cell 1 5,alignx left,growx 0");
add(hSpacer3, "cell 1 5");
//---- radioButtonLabel ----
radioButtonLabel.setText("JRadioButton:");
add(radioButtonLabel, "cell 0 6");
//---- radioButton1 ----
radioButton1.setText("Unselected");
add(radioButton1, "cell 1 6,alignx left,growx 0");
//---- radioButton3 ----
radioButton3.setText("Selected");
radioButton3.setSelected(true);
add(radioButton3, "cell 1 6,alignx left,growx 0");
add(hSpacer4, "cell 1 6");
//---- comboBoxLabel ----
comboBoxLabel.setText("JComboBox:");
add(comboBoxLabel, "cell 0 7");
//---- comboBox1 ----
comboBox1.setEditable(true);
comboBox1.setModel(new DefaultComboBoxModel<>(new String[] {
"Editable",
"a",
"bb",
"ccc",
"dd",
"e",
"ff",
"ggg",
"hh",
"i",
"jj",
"kkk"
}));
comboBox1.setMaximumRowCount(6);
comboBox1.setPlaceholderText("placeholder text");
add(comboBox1, "cell 1 7");
//---- comboBox3 ----
comboBox3.setModel(new DefaultComboBoxModel<>(new String[] {
"Not edit",
"a",
"bb",
"ccc",
"dd",
"e",
"ff",
"ggg",
"hh",
"i",
"jj",
"kkk"
}));
comboBox3.setMaximumRowCount(6);
add(comboBox3, "cell 1 7");
//---- spinnerLabel ----
spinnerLabel.setText("JSpinner:");
add(spinnerLabel, "cell 0 8");
add(spinner1, "cell 1 8");
//---- textFieldLabel ----
textFieldLabel.setText("JTextField:");
add(textFieldLabel, "cell 0 9");
//---- textField1 ----
textField1.setText("Some Text");
textField1.setPlaceholderText("placeholder text");
add(textField1, "cell 1 9");
//---- formattedTextFieldLabel ----
formattedTextFieldLabel.setText("JFormattedTextF.:");
add(formattedTextFieldLabel, "cell 0 10");
//---- formattedTextField1 ----
formattedTextField1.setText("Some Text");
formattedTextField1.setPlaceholderText("placeholder text");
add(formattedTextField1, "cell 1 10");
//---- passwordFieldLabel ----
passwordFieldLabel.setText("JPasswordField:");
add(passwordFieldLabel, "cell 0 11");
//---- passwordField1 ----
passwordField1.setText("Some Text");
passwordField1.setPlaceholderText("placeholder text");
add(passwordField1, "cell 1 11");
//---- textAreaLabel ----
textAreaLabel.setText("JTextArea:");
add(textAreaLabel, "cell 0 12");
//======== scrollPane1 ========
{
scrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
//---- textArea1 ----
textArea1.setText("Some Text");
textArea1.setRows(2);
scrollPane1.setViewportView(textArea1);
}
add(scrollPane1, "cell 1 12");
//---- editorPaneLabel ----
editorPaneLabel.setText("JEditorPane");
add(editorPaneLabel, "cell 0 13");
//======== scrollPane5 ========
{
scrollPane5.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scrollPane5.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
//---- editorPane1 ----
editorPane1.setText("Some Text");
scrollPane5.setViewportView(editorPane1);
}
add(scrollPane5, "cell 1 13");
//---- textPaneLabel ----
textPaneLabel.setText("JTextPane:");
add(textPaneLabel, "cell 0 14");
//======== scrollPane9 ========
{
scrollPane9.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scrollPane9.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
//---- textPane1 ----
textPane1.setText("Some Text");
scrollPane9.setViewportView(textPane1);
}
add(scrollPane9, "cell 1 14");
//---- scrollBarLabel ----
scrollBarLabel.setText("JScrollBar:");
add(scrollBarLabel, "cell 0 15");
//---- scrollBar1 ----
scrollBar1.setOrientation(Adjustable.HORIZONTAL);
add(scrollBar1, "cell 1 15");
//---- scrollBar5 ----
scrollBar5.setOrientation(Adjustable.HORIZONTAL);
scrollBar5.setShowButtons(true);
add(scrollBar5, "cell 1 16");
//---- separatorLabel ----
separatorLabel.setText("JSeparator:");
add(separatorLabel, "cell 0 17");
add(separator1, "cell 1 17");
//---- sliderLabel ----
sliderLabel.setText("JSlider:");
add(sliderLabel, "cell 0 18");
//---- slider1 ----
slider1.setValue(30);
add(slider1, "cell 1 18");
//---- slider3 ----
slider3.setMinorTickSpacing(10);
slider3.setPaintTicks(true);
slider3.setMajorTickSpacing(50);
slider3.setPaintLabels(true);
slider3.setValue(30);
slider3.addChangeListener(e -> changeProgress());
add(slider3, "cell 1 19");
//---- progressBarLabel ----
progressBarLabel.setText("JProgressBar:");
add(progressBarLabel, "cell 0 20");
//---- progressBar1 ----
progressBar1.setValue(60);
add(progressBar1, "cell 1 20");
//---- toolTipLabel ----
toolTipLabel.setText("JToolTip:");
add(toolTipLabel, "cell 0 21");
//---- toolTip1 ----
toolTip1.setTipText("Some text in tool tip.");
add(toolTip1, "cell 1 21,alignx left,growx 0");
//---- tabbedPaneLabel ----
tabbedPaneLabel.setText("JTabbedPane:");
add(tabbedPaneLabel, "cell 0 22");
add(tabbedPane1, "cell 1 22");
//---- buttonGroup1 ----
ButtonGroup buttonGroup1 = new ButtonGroup();
buttonGroup1.add(radioButton1);
buttonGroup1.add(radioButton3);
// JFormDesigner - End of component initialization //GEN-END:initComponents
}
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
private JLabel previewLabel;
private JCheckBox enabledCheckBox;
private JSeparator separator2;
private JLabel labelLabel;
private JLabel label1;
private FlatButton flatButton1;
private JLabel buttonLabel;
private JButton button1;
private FlatThemePreview.TestDefaultButton testDefaultButton1;
private FlatButton helpButton;
private JPanel hSpacer2;
private JLabel toggleButtonLabel;
private JToggleButton toggleButton1;
private JToggleButton toggleButton3;
private JPanel hSpacer1;
private JLabel checkBoxLabel;
private JCheckBox checkBox1;
private JCheckBox checkBox3;
private JPanel hSpacer3;
private JLabel radioButtonLabel;
private JRadioButton radioButton1;
private JRadioButton radioButton3;
private JPanel hSpacer4;
private JLabel comboBoxLabel;
private FlatComboBox<String> comboBox1;
private JComboBox<String> comboBox3;
private JLabel spinnerLabel;
private JSpinner spinner1;
private JLabel textFieldLabel;
private FlatTextField textField1;
private JLabel formattedTextFieldLabel;
private FlatFormattedTextField formattedTextField1;
private JLabel passwordFieldLabel;
private FlatPasswordField passwordField1;
private JLabel textAreaLabel;
private JScrollPane scrollPane1;
private JTextArea textArea1;
private JLabel editorPaneLabel;
private JScrollPane scrollPane5;
private JEditorPane editorPane1;
private JLabel textPaneLabel;
private JScrollPane scrollPane9;
private JTextPane textPane1;
private JLabel scrollBarLabel;
private JScrollBar scrollBar1;
private FlatScrollBar scrollBar5;
private JLabel separatorLabel;
private JSeparator separator1;
private JLabel sliderLabel;
private JSlider slider1;
private JSlider slider3;
private JLabel progressBarLabel;
private FlatProgressBar progressBar1;
private JLabel toolTipLabel;
private JToolTip toolTip1;
private JLabel tabbedPaneLabel;
private JTabbedPane tabbedPane1;
// JFormDesigner - End of variables declaration //GEN-END:variables
//---- class TestDefaultButton --------------------------------------------
private static class TestDefaultButton
extends JButton
{
@Override
public boolean isDefaultButton() {
return true;
}
}
}

View File

@@ -0,0 +1,422 @@
JFDML JFormDesigner: "7.0.4.0.360" Java: "16" 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": "[fill][130,fill]"
"$rowConstraints": "[]0[]unrel[][][][][][][][][][][][][][][][][][][][][][grow]"
} ) {
name: "this"
add( new FormComponent( "javax.swing.JLabel" ) {
name: "previewLabel"
"text": "Preview"
"font": new com.jformdesigner.model.SwingDerivedFont( null, 0, 6, false )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0 2 1,alignx left,growx 0"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "enabledCheckBox"
"text": "Enabled"
"selected": true
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "enabledChanged", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 0 2 1,align right top,grow 0 0"
} )
add( new FormComponent( "javax.swing.JSeparator" ) {
name: "separator2"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 1 2 1"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "labelLabel"
"text": "JLabel:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 2"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "label1"
"text": "Some Text"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 2"
} )
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatButton" ) {
name: "flatButton1"
"text": "Help"
"buttonType": enum com.formdev.flatlaf.extras.components.FlatButton$ButtonType help
"visible": false
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 1,alignx right,growx 0"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "buttonLabel"
"text": "JButton:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 3"
} )
add( new FormComponent( "javax.swing.JButton" ) {
name: "button1"
"text": "Apply"
"toolTipText": "This button is enabled."
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 3,alignx left,growx 0"
} )
add( new FormComponent( "com.formdev.flatlaf.themeeditor.FlatThemePreview$TestDefaultButton" ) {
name: "testDefaultButton1"
"text": "OK"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 3"
} )
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatButton" ) {
name: "helpButton"
"buttonType": enum com.formdev.flatlaf.extras.components.FlatButton$ButtonType help
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 3"
} )
add( new FormComponent( "com.jformdesigner.designer.wrapper.HSpacer" ) {
name: "hSpacer2"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 3"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "toggleButtonLabel"
"text": "JToggleButton:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 4"
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton1"
"text": "Unselected"
"toolTipText": "LOOOOOOOOOOOOOONG TEXT"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 4,alignx left,growx 0"
} )
add( new FormComponent( "javax.swing.JToggleButton" ) {
name: "toggleButton3"
"text": "Selected"
"selected": true
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 4"
} )
add( new FormComponent( "com.jformdesigner.designer.wrapper.HSpacer" ) {
name: "hSpacer1"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 4"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "checkBoxLabel"
"text": "JCheckBox"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 5"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "checkBox1"
"text": "Unselected"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 5,alignx left,growx 0"
} )
add( new FormComponent( "javax.swing.JCheckBox" ) {
name: "checkBox3"
"text": "Selected"
"selected": true
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 5,alignx left,growx 0"
} )
add( new FormComponent( "com.jformdesigner.designer.wrapper.HSpacer" ) {
name: "hSpacer3"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 5"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "radioButtonLabel"
"text": "JRadioButton:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 6"
} )
add( new FormComponent( "javax.swing.JRadioButton" ) {
name: "radioButton1"
"text": "Unselected"
"$buttonGroup": new FormReference( "buttonGroup1" )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 6,alignx left,growx 0"
} )
add( new FormComponent( "javax.swing.JRadioButton" ) {
name: "radioButton3"
"text": "Selected"
"selected": true
"$buttonGroup": new FormReference( "buttonGroup1" )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 6,alignx left,growx 0"
} )
add( new FormComponent( "com.jformdesigner.designer.wrapper.HSpacer" ) {
name: "hSpacer4"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 6"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "comboBoxLabel"
"text": "JComboBox:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 7"
} )
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatComboBox" ) {
name: "comboBox1"
"editable": true
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "Editable"
addElement( "Editable" )
addElement( "a" )
addElement( "bb" )
addElement( "ccc" )
addElement( "dd" )
addElement( "e" )
addElement( "ff" )
addElement( "ggg" )
addElement( "hh" )
addElement( "i" )
addElement( "jj" )
addElement( "kkk" )
}
"maximumRowCount": 6
"placeholderText": "placeholder text"
auxiliary() {
"JavaCodeGenerator.typeParameters": "String"
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 7"
} )
add( new FormComponent( "javax.swing.JComboBox" ) {
name: "comboBox3"
"model": new javax.swing.DefaultComboBoxModel {
selectedItem: "Not edit"
addElement( "Not edit" )
addElement( "a" )
addElement( "bb" )
addElement( "ccc" )
addElement( "dd" )
addElement( "e" )
addElement( "ff" )
addElement( "ggg" )
addElement( "hh" )
addElement( "i" )
addElement( "jj" )
addElement( "kkk" )
}
"maximumRowCount": 6
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 7"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "spinnerLabel"
"text": "JSpinner:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 8"
} )
add( new FormComponent( "javax.swing.JSpinner" ) {
name: "spinner1"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 8"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "textFieldLabel"
"text": "JTextField:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 9"
} )
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatTextField" ) {
name: "textField1"
"text": "Some Text"
"placeholderText": "placeholder text"
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 9"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "formattedTextFieldLabel"
"text": "JFormattedTextF.:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 10"
} )
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatFormattedTextField" ) {
name: "formattedTextField1"
"text": "Some Text"
"placeholderText": "placeholder text"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 10"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "passwordFieldLabel"
"text": "JPasswordField:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 11"
} )
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatPasswordField" ) {
name: "passwordField1"
"text": "Some Text"
"placeholderText": "placeholder text"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 11"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "textAreaLabel"
"text": "JTextArea:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 12"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane1"
"verticalScrollBarPolicy": 21
"horizontalScrollBarPolicy": 31
add( new FormComponent( "javax.swing.JTextArea" ) {
name: "textArea1"
"text": "Some Text"
"rows": 2
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 12"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "editorPaneLabel"
"text": "JEditorPane"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 13"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane5"
"verticalScrollBarPolicy": 21
"horizontalScrollBarPolicy": 31
add( new FormComponent( "javax.swing.JEditorPane" ) {
name: "editorPane1"
"text": "Some Text"
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 13"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "textPaneLabel"
"text": "JTextPane:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 14"
} )
add( new FormContainer( "javax.swing.JScrollPane", new FormLayoutManager( class javax.swing.JScrollPane ) ) {
name: "scrollPane9"
"verticalScrollBarPolicy": 21
"horizontalScrollBarPolicy": 31
add( new FormComponent( "javax.swing.JTextPane" ) {
name: "textPane1"
"text": "Some Text"
} )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 14"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "scrollBarLabel"
"text": "JScrollBar:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 15"
} )
add( new FormComponent( "javax.swing.JScrollBar" ) {
name: "scrollBar1"
"orientation": 0
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 15"
} )
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatScrollBar" ) {
name: "scrollBar5"
"orientation": 0
"showButtons": true
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 16"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "separatorLabel"
"text": "JSeparator:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 17"
} )
add( new FormComponent( "javax.swing.JSeparator" ) {
name: "separator1"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 17"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "sliderLabel"
"text": "JSlider:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 18"
} )
add( new FormComponent( "javax.swing.JSlider" ) {
name: "slider1"
"value": 30
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 18"
} )
add( new FormComponent( "javax.swing.JSlider" ) {
name: "slider3"
"minorTickSpacing": 10
"paintTicks": true
"majorTickSpacing": 50
"paintLabels": true
"value": 30
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
addEvent( new FormEvent( "javax.swing.event.ChangeListener", "stateChanged", "changeProgress", false ) )
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 19"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "progressBarLabel"
"text": "JProgressBar:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 20"
} )
add( new FormComponent( "com.formdev.flatlaf.extras.components.FlatProgressBar" ) {
name: "progressBar1"
"value": 60
auxiliary() {
"JavaCodeGenerator.variableLocal": false
}
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 20"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "toolTipLabel"
"text": "JToolTip:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 21"
} )
add( new FormComponent( "javax.swing.JToolTip" ) {
name: "toolTip1"
"tipText": "Some text in tool tip."
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 21,alignx left,growx 0"
} )
add( new FormComponent( "javax.swing.JLabel" ) {
name: "tabbedPaneLabel"
"text": "JTabbedPane:"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 0 22"
} )
add( new FormContainer( "javax.swing.JTabbedPane", new FormLayoutManager( class javax.swing.JTabbedPane ) ) {
name: "tabbedPane1"
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
"value": "cell 1 22"
} )
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 0 )
"size": new java.awt.Dimension( 400, 785 )
} )
add( new FormNonVisual( "javax.swing.ButtonGroup" ) {
name: "buttonGroup1"
}, new FormLayoutConstraints( null ) {
"location": new java.awt.Point( 0, 955 )
} )
}
}

View File

@@ -49,6 +49,7 @@ class FlatThemePropertiesSupport
// caches
private Properties propertiesCache;
private final Map<Integer, Object> parsedValueCache = new HashMap<>();
private final Map<String, Object> parsedValueCache2 = new HashMap<>();
private Set<String> allKeysCache;
private String baseTheme;
@@ -123,6 +124,28 @@ class FlatThemePropertiesSupport
}
}
Object getParsedProperty( String key ) {
Object parsedValue = parsedValueCache2.get( key );
if( parsedValue != null )
return !(parsedValue instanceof Exception) ? parsedValue : null;
String str = getPropertyOrWildcard( key );
if( str == null )
return null;
try {
Object[] resultValueType = new Object[1];
String value = resolveValue( str );
parsedValue = UIDefaultsLoaderAccessor.parseValue( key, value, resultValueType, resolver );
parsedValueCache2.put( key, parsedValue );
return parsedValue;
} catch( Exception ex ) {
System.out.println( textArea.getFileName() + ": " + ex.getMessage() ); //TODO
parsedValueCache2.put( key, ex );
return null;
}
}
private String getPropertyOrWildcard( String key ) {
String value = getProperty( key );
if( value != null )
@@ -192,6 +215,7 @@ class FlatThemePropertiesSupport
private void clearCache() {
propertiesCache = null;
parsedValueCache.clear();
parsedValueCache2.clear();
allKeysCache = null;
baseTheme = null;
@@ -208,6 +232,7 @@ class FlatThemePropertiesSupport
return;
parsedValueCache.clear();
parsedValueCache2.clear();
allKeysCache = null;
}

View File

@@ -16,7 +16,7 @@
#---- TabbedPane ----
TabbedPane.selectedBackground = darken($TabbedPane.background,5%)
#TabbedPane.selectedBackground = darken($TabbedPane.background,5%)
#---- FlatThemeEditorPane ----

View File

@@ -16,7 +16,7 @@
#---- TabbedPane ----
TabbedPane.selectedBackground = lighten($TabbedPane.background,5%)
#TabbedPane.selectedBackground = lighten($TabbedPane.background,5%)
#---- FlatThemeEditorPane ----