mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-07 06:20:53 +03:00
ProgressBar: If progress text is visible:
- use smaller font - reduced height - changed style to rounded rectangle - fixed painting issues on low values Support configure of arc with `ProgressBar.arc`
This commit is contained in:
@@ -3,6 +3,12 @@ FlatLaf Change Log
|
|||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
- ProgressBar: If progress text is visible:
|
||||||
|
- use smaller font
|
||||||
|
- reduced height
|
||||||
|
- changed style to rounded rectangle
|
||||||
|
- fixed painting issues on low values
|
||||||
|
- ProgressBar: Support configure of arc with `ProgressBar.arc`.
|
||||||
- TabbedPane: Support background color for selected tabs.
|
- TabbedPane: Support background color for selected tabs.
|
||||||
- CheckBox: changed `CheckBox.arc` from radius to diameter to be consistent with
|
- CheckBox: changed `CheckBox.arc` from radius to diameter to be consistent with
|
||||||
`Button.arc` and `Component.arc`
|
`Button.arc` and `Component.arc`
|
||||||
|
|||||||
@@ -283,6 +283,9 @@ public abstract class FlatLaf
|
|||||||
defaults.put( key, uiFont );
|
defaults.put( key, uiFont );
|
||||||
}
|
}
|
||||||
defaults.put( "MenuItem.acceleratorFont", uiFont );
|
defaults.put( "MenuItem.acceleratorFont", uiFont );
|
||||||
|
|
||||||
|
// use smaller font for progress bar
|
||||||
|
defaults.put( "ProgressBar.font", UIScale.scaleFont( uiFont, 0.85f ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -17,13 +17,16 @@
|
|||||||
package com.formdev.flatlaf.ui;
|
package com.formdev.flatlaf.ui;
|
||||||
|
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
|
import java.awt.FontMetrics;
|
||||||
import java.awt.Graphics;
|
import java.awt.Graphics;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Insets;
|
import java.awt.Insets;
|
||||||
|
import java.awt.geom.Area;
|
||||||
import java.awt.geom.RoundRectangle2D;
|
import java.awt.geom.RoundRectangle2D;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JProgressBar;
|
import javax.swing.JProgressBar;
|
||||||
import javax.swing.LookAndFeel;
|
import javax.swing.LookAndFeel;
|
||||||
|
import javax.swing.UIManager;
|
||||||
import javax.swing.plaf.ComponentUI;
|
import javax.swing.plaf.ComponentUI;
|
||||||
import javax.swing.plaf.basic.BasicProgressBarUI;
|
import javax.swing.plaf.basic.BasicProgressBarUI;
|
||||||
import com.formdev.flatlaf.util.UIScale;
|
import com.formdev.flatlaf.util.UIScale;
|
||||||
@@ -44,11 +47,19 @@ import com.formdev.flatlaf.util.UIScale;
|
|||||||
* @uiDefault ProgressBar.repaintInterval int default is 50 milliseconds
|
* @uiDefault ProgressBar.repaintInterval int default is 50 milliseconds
|
||||||
* @uiDefault ProgressBar.cycleTime int default is 3000 milliseconds
|
* @uiDefault ProgressBar.cycleTime int default is 3000 milliseconds
|
||||||
*
|
*
|
||||||
|
* <!-- FlatProgressBarUI -->
|
||||||
|
*
|
||||||
|
* @uiDefault ProgressBar.arc int
|
||||||
|
*
|
||||||
* @author Karl Tauber
|
* @author Karl Tauber
|
||||||
*/
|
*/
|
||||||
public class FlatProgressBarUI
|
public class FlatProgressBarUI
|
||||||
extends BasicProgressBarUI
|
extends BasicProgressBarUI
|
||||||
{
|
{
|
||||||
|
protected int arc;
|
||||||
|
protected Dimension horizontalSize;
|
||||||
|
protected Dimension verticalSize;
|
||||||
|
|
||||||
public static ComponentUI createUI( JComponent c ) {
|
public static ComponentUI createUI( JComponent c ) {
|
||||||
return new FlatProgressBarUI();
|
return new FlatProgressBarUI();
|
||||||
}
|
}
|
||||||
@@ -58,16 +69,37 @@ public class FlatProgressBarUI
|
|||||||
super.installDefaults();
|
super.installDefaults();
|
||||||
|
|
||||||
LookAndFeel.installProperty( progressBar, "opaque", false );
|
LookAndFeel.installProperty( progressBar, "opaque", false );
|
||||||
|
|
||||||
|
arc = UIManager.getInt( "ProgressBar.arc" );
|
||||||
|
horizontalSize = UIManager.getDimension( "ProgressBar.horizontalSize" );
|
||||||
|
verticalSize = UIManager.getDimension( "ProgressBar.verticalSize" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension getPreferredSize( JComponent c ) {
|
||||||
|
Dimension size = super.getPreferredSize( c );
|
||||||
|
|
||||||
|
if( progressBar.isStringPainted() ) {
|
||||||
|
// recalculate progress height/width to make it smaller
|
||||||
|
Insets insets = progressBar.getInsets();
|
||||||
|
FontMetrics fm = progressBar.getFontMetrics( progressBar.getFont() );
|
||||||
|
if( progressBar.getOrientation() == JProgressBar.HORIZONTAL )
|
||||||
|
size.height = Math.max( fm.getHeight() + insets.top + insets.bottom, getPreferredInnerHorizontal().height );
|
||||||
|
else
|
||||||
|
size.width = Math.max( fm.getHeight() + insets.left + insets.right, getPreferredInnerVertical().width );
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Dimension getPreferredInnerHorizontal() {
|
protected Dimension getPreferredInnerHorizontal() {
|
||||||
return UIScale.scale( super.getPreferredInnerHorizontal() );
|
return UIScale.scale( horizontalSize );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Dimension getPreferredInnerVertical() {
|
protected Dimension getPreferredInnerVertical() {
|
||||||
return UIScale.scale( super.getPreferredInnerVertical() );
|
return UIScale.scale( verticalSize );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -90,13 +122,14 @@ public class FlatProgressBarUI
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
boolean horizontal = (progressBar.getOrientation() == JProgressBar.HORIZONTAL);
|
boolean horizontal = (progressBar.getOrientation() == JProgressBar.HORIZONTAL);
|
||||||
int arc = horizontal ? height : width;
|
int arc = Math.min( UIScale.scale( this.arc ), horizontal ? height : width );
|
||||||
|
|
||||||
FlatUIUtils.setRenderingHints( (Graphics2D) g );
|
FlatUIUtils.setRenderingHints( (Graphics2D) g );
|
||||||
|
|
||||||
// paint track
|
// paint track
|
||||||
|
RoundRectangle2D.Float trackShape = new RoundRectangle2D.Float( x, y, width, height, arc, arc );
|
||||||
g.setColor( progressBar.getBackground() );
|
g.setColor( progressBar.getBackground() );
|
||||||
((Graphics2D)g).fill( new RoundRectangle2D.Float( x, y, width, height, arc, arc ) );
|
((Graphics2D)g).fill( trackShape );
|
||||||
|
|
||||||
// paint progress
|
// paint progress
|
||||||
if( progressBar.isIndeterminate() ) {
|
if( progressBar.isIndeterminate() ) {
|
||||||
@@ -112,11 +145,19 @@ public class FlatProgressBarUI
|
|||||||
} else {
|
} else {
|
||||||
int amountFull = getAmountFull( insets, width, height );
|
int amountFull = getAmountFull( insets, width, height );
|
||||||
|
|
||||||
g.setColor( progressBar.getForeground() );
|
RoundRectangle2D.Float progressShape = horizontal
|
||||||
((Graphics2D)g).fill( horizontal
|
|
||||||
? new RoundRectangle2D.Float( c.getComponentOrientation().isLeftToRight() ? x : x + (width - amountFull),
|
? new RoundRectangle2D.Float( c.getComponentOrientation().isLeftToRight() ? x : x + (width - amountFull),
|
||||||
y, amountFull, height, arc, arc )
|
y, amountFull, height, arc, arc )
|
||||||
: new RoundRectangle2D.Float( x, y + (height - amountFull), width, amountFull, arc, arc ) );
|
: new RoundRectangle2D.Float( x, y + (height - amountFull), width, amountFull, arc, arc );
|
||||||
|
|
||||||
|
g.setColor( progressBar.getForeground() );
|
||||||
|
if( amountFull < (horizontal ? height : width) ) {
|
||||||
|
// special painting for low amounts to avoid painting outside of track
|
||||||
|
Area area = new Area( trackShape );
|
||||||
|
area.intersect( new Area( progressShape ) );
|
||||||
|
((Graphics2D)g).fill( area );
|
||||||
|
} else
|
||||||
|
((Graphics2D)g).fill( progressShape );
|
||||||
|
|
||||||
if( progressBar.isStringPainted() )
|
if( progressBar.isStringPainted() )
|
||||||
paintString( g, x, y, width, height, amountFull, insets );
|
paintString( g, x, y, width, height, amountFull, insets );
|
||||||
|
|||||||
@@ -197,6 +197,14 @@ public class UIScale
|
|||||||
return new FontUIResource( font.getFamily(), font.getStyle(), newFontSize );
|
return new FontUIResource( font.getFamily(), font.getStyle(), newFontSize );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scales the given font.
|
||||||
|
*/
|
||||||
|
public static FontUIResource scaleFont( FontUIResource font, float scaleFactor ) {
|
||||||
|
int newFontSize = Math.round( font.getSize() * scaleFactor );
|
||||||
|
return new FontUIResource( font.getFamily(), font.getStyle(), newFontSize );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Similar to sun.java2d.SunGraphicsEnvironment.getScaleFactor(String)
|
* Similar to sun.java2d.SunGraphicsEnvironment.getScaleFactor(String)
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -261,6 +261,7 @@ PopupMenuSeparator.stripeIndent=4
|
|||||||
#---- ProgressBar ----
|
#---- ProgressBar ----
|
||||||
|
|
||||||
ProgressBar.border=com.formdev.flatlaf.ui.FlatEmptyBorder
|
ProgressBar.border=com.formdev.flatlaf.ui.FlatEmptyBorder
|
||||||
|
ProgressBar.arc=6
|
||||||
ProgressBar.horizontalSize=146,6
|
ProgressBar.horizontalSize=146,6
|
||||||
ProgressBar.verticalSize=6,146
|
ProgressBar.verticalSize=6,146
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,15 @@ public class FlatComponentsTest
|
|||||||
initComponents();
|
initComponents();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void indeterminateCheckBoxActionPerformed() {
|
private void changeProgress() {
|
||||||
|
int value = slider3.getValue();
|
||||||
|
progressBar1.setValue( value );
|
||||||
|
progressBar2.setValue( value );
|
||||||
|
progressBar3.setValue( value );
|
||||||
|
progressBar4.setValue( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void indeterminateProgress() {
|
||||||
boolean indeterminate = indeterminateCheckBox.isSelected();
|
boolean indeterminate = indeterminateCheckBox.isSelected();
|
||||||
progressBar1.setIndeterminate( indeterminate );
|
progressBar1.setIndeterminate( indeterminate );
|
||||||
progressBar2.setIndeterminate( indeterminate );
|
progressBar2.setIndeterminate( indeterminate );
|
||||||
@@ -166,7 +174,7 @@ public class FlatComponentsTest
|
|||||||
JLabel sliderLabel = new JLabel();
|
JLabel sliderLabel = new JLabel();
|
||||||
JSlider slider1 = new JSlider();
|
JSlider slider1 = new JSlider();
|
||||||
JSlider slider6 = new JSlider();
|
JSlider slider6 = new JSlider();
|
||||||
JSlider slider3 = new JSlider();
|
slider3 = new JSlider();
|
||||||
JSlider slider5 = new JSlider();
|
JSlider slider5 = new JSlider();
|
||||||
JLabel progressBarLabel = new JLabel();
|
JLabel progressBarLabel = new JLabel();
|
||||||
progressBar1 = new JProgressBar();
|
progressBar1 = new JProgressBar();
|
||||||
@@ -737,12 +745,12 @@ public class FlatComponentsTest
|
|||||||
|
|
||||||
//---- progressBar3 ----
|
//---- progressBar3 ----
|
||||||
progressBar3.setOrientation(SwingConstants.VERTICAL);
|
progressBar3.setOrientation(SwingConstants.VERTICAL);
|
||||||
progressBar3.setValue(50);
|
progressBar3.setValue(60);
|
||||||
add(progressBar3, "cell 4 13 1 6,growy");
|
add(progressBar3, "cell 4 13 1 6,growy");
|
||||||
|
|
||||||
//---- progressBar4 ----
|
//---- progressBar4 ----
|
||||||
progressBar4.setOrientation(SwingConstants.VERTICAL);
|
progressBar4.setOrientation(SwingConstants.VERTICAL);
|
||||||
progressBar4.setValue(55);
|
progressBar4.setValue(60);
|
||||||
progressBar4.setStringPainted(true);
|
progressBar4.setStringPainted(true);
|
||||||
add(progressBar4, "cell 4 13 1 6,growy");
|
add(progressBar4, "cell 4 13 1 6,growy");
|
||||||
|
|
||||||
@@ -867,6 +875,7 @@ public class FlatComponentsTest
|
|||||||
slider3.setMajorTickSpacing(50);
|
slider3.setMajorTickSpacing(50);
|
||||||
slider3.setPaintLabels(true);
|
slider3.setPaintLabels(true);
|
||||||
slider3.setValue(30);
|
slider3.setValue(30);
|
||||||
|
slider3.addChangeListener(e -> changeProgress());
|
||||||
add(slider3, "cell 1 20 3 1,aligny top,grow 100 0");
|
add(slider3, "cell 1 20 3 1,aligny top,grow 100 0");
|
||||||
|
|
||||||
//---- slider5 ----
|
//---- slider5 ----
|
||||||
@@ -883,17 +892,17 @@ public class FlatComponentsTest
|
|||||||
add(progressBarLabel, "cell 0 21");
|
add(progressBarLabel, "cell 0 21");
|
||||||
|
|
||||||
//---- progressBar1 ----
|
//---- progressBar1 ----
|
||||||
progressBar1.setValue(50);
|
progressBar1.setValue(60);
|
||||||
add(progressBar1, "cell 1 21 3 1,growx");
|
add(progressBar1, "cell 1 21 3 1,growx");
|
||||||
|
|
||||||
//---- progressBar2 ----
|
//---- progressBar2 ----
|
||||||
progressBar2.setStringPainted(true);
|
progressBar2.setStringPainted(true);
|
||||||
progressBar2.setValue(55);
|
progressBar2.setValue(60);
|
||||||
add(progressBar2, "cell 1 21 3 1,growx");
|
add(progressBar2, "cell 1 21 3 1,growx");
|
||||||
|
|
||||||
//---- indeterminateCheckBox ----
|
//---- indeterminateCheckBox ----
|
||||||
indeterminateCheckBox.setText("indeterminate");
|
indeterminateCheckBox.setText("indeterminate");
|
||||||
indeterminateCheckBox.addActionListener(e -> indeterminateCheckBoxActionPerformed());
|
indeterminateCheckBox.addActionListener(e -> indeterminateProgress());
|
||||||
add(indeterminateCheckBox, "cell 4 21");
|
add(indeterminateCheckBox, "cell 4 21");
|
||||||
|
|
||||||
//---- toolTipLabel ----
|
//---- toolTipLabel ----
|
||||||
@@ -952,6 +961,7 @@ public class FlatComponentsTest
|
|||||||
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
|
// JFormDesigner - Variables declaration - DO NOT MODIFY //GEN-BEGIN:variables
|
||||||
private JProgressBar progressBar3;
|
private JProgressBar progressBar3;
|
||||||
private JProgressBar progressBar4;
|
private JProgressBar progressBar4;
|
||||||
|
private JSlider slider3;
|
||||||
private JProgressBar progressBar1;
|
private JProgressBar progressBar1;
|
||||||
private JProgressBar progressBar2;
|
private JProgressBar progressBar2;
|
||||||
private JCheckBox indeterminateCheckBox;
|
private JCheckBox indeterminateCheckBox;
|
||||||
|
|||||||
@@ -673,7 +673,7 @@ new FormModel {
|
|||||||
add( new FormComponent( "javax.swing.JProgressBar" ) {
|
add( new FormComponent( "javax.swing.JProgressBar" ) {
|
||||||
name: "progressBar3"
|
name: "progressBar3"
|
||||||
"orientation": 1
|
"orientation": 1
|
||||||
"value": 50
|
"value": 60
|
||||||
auxiliary() {
|
auxiliary() {
|
||||||
"JavaCodeGenerator.variableLocal": false
|
"JavaCodeGenerator.variableLocal": false
|
||||||
}
|
}
|
||||||
@@ -683,7 +683,7 @@ new FormModel {
|
|||||||
add( new FormComponent( "javax.swing.JProgressBar" ) {
|
add( new FormComponent( "javax.swing.JProgressBar" ) {
|
||||||
name: "progressBar4"
|
name: "progressBar4"
|
||||||
"orientation": 1
|
"orientation": 1
|
||||||
"value": 55
|
"value": 60
|
||||||
"stringPainted": true
|
"stringPainted": true
|
||||||
auxiliary() {
|
auxiliary() {
|
||||||
"JavaCodeGenerator.variableLocal": false
|
"JavaCodeGenerator.variableLocal": false
|
||||||
@@ -836,6 +836,10 @@ new FormModel {
|
|||||||
"majorTickSpacing": 50
|
"majorTickSpacing": 50
|
||||||
"paintLabels": true
|
"paintLabels": true
|
||||||
"value": 30
|
"value": 30
|
||||||
|
auxiliary() {
|
||||||
|
"JavaCodeGenerator.variableLocal": false
|
||||||
|
}
|
||||||
|
addEvent( new FormEvent( "javax.swing.event.ChangeListener", "stateChanged", "changeProgress", false ) )
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "cell 1 20 3 1,aligny top,grow 100 0"
|
"value": "cell 1 20 3 1,aligny top,grow 100 0"
|
||||||
} )
|
} )
|
||||||
@@ -858,7 +862,7 @@ new FormModel {
|
|||||||
} )
|
} )
|
||||||
add( new FormComponent( "javax.swing.JProgressBar" ) {
|
add( new FormComponent( "javax.swing.JProgressBar" ) {
|
||||||
name: "progressBar1"
|
name: "progressBar1"
|
||||||
"value": 50
|
"value": 60
|
||||||
auxiliary() {
|
auxiliary() {
|
||||||
"JavaCodeGenerator.variableLocal": false
|
"JavaCodeGenerator.variableLocal": false
|
||||||
}
|
}
|
||||||
@@ -868,7 +872,7 @@ new FormModel {
|
|||||||
add( new FormComponent( "javax.swing.JProgressBar" ) {
|
add( new FormComponent( "javax.swing.JProgressBar" ) {
|
||||||
name: "progressBar2"
|
name: "progressBar2"
|
||||||
"stringPainted": true
|
"stringPainted": true
|
||||||
"value": 55
|
"value": 60
|
||||||
auxiliary() {
|
auxiliary() {
|
||||||
"JavaCodeGenerator.variableLocal": false
|
"JavaCodeGenerator.variableLocal": false
|
||||||
}
|
}
|
||||||
@@ -881,7 +885,7 @@ new FormModel {
|
|||||||
auxiliary() {
|
auxiliary() {
|
||||||
"JavaCodeGenerator.variableLocal": false
|
"JavaCodeGenerator.variableLocal": false
|
||||||
}
|
}
|
||||||
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "indeterminateCheckBoxActionPerformed", false ) )
|
addEvent( new FormEvent( "java.awt.event.ActionListener", "actionPerformed", "indeterminateProgress", false ) )
|
||||||
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
}, new FormLayoutConstraints( class net.miginfocom.layout.CC ) {
|
||||||
"value": "cell 4 21"
|
"value": "cell 4 21"
|
||||||
} )
|
} )
|
||||||
|
|||||||
Reference in New Issue
Block a user