ToolBar: skip components with empty input map (e.g. JLabel) when using arrow keys to navigate in focusable buttons (related to issue #346)

This commit is contained in:
Karl Tauber
2021-10-05 12:15:51 +02:00
parent 78aa4343b7
commit 16ea809bb3
2 changed files with 54 additions and 3 deletions

View File

@@ -13,9 +13,13 @@ FlatLaf Change Log
- Theming improvements: Reworks core themes to make it easier to create new - Theming improvements: Reworks core themes to make it easier to create new
themes (e.g. reduced explicit colors by using color functions). **Note**: themes (e.g. reduced explicit colors by using color functions). **Note**:
There are minor incompatible changes in FlatLaf properties files. (PR #390) There are minor incompatible changes in FlatLaf properties files. (PR #390)
- ToolBar: Toolbars are no longer floatable by default (dots on left side of - ToolBar:
toolbar that allows dragging toolbar). Use `UIManager.put( - Toolbars are no longer floatable by default (dots on left side of toolbar
"ToolBar.floatable", true )` if you want the old behavior. that allows dragging toolbar). Use `UIManager.put( "ToolBar.floatable", true
)` if you want the old behavior.
- Skip components with empty input map (e.g. `JLabel`) when using arrow keys
to navigate in focusable buttons (if UI value `ToolBar.focusableButtons` is
`true`).
- Added more color functions to class `ColorFunctions` for easy use in - Added more color functions to class `ColorFunctions` for easy use in
applications: `lighten()`, `darken()`, `saturate()`, `desaturate()`, `spin()`, applications: `lighten()`, `darken()`, `saturate()`, `desaturate()`, `spin()`,
`tint()`, `shade()` and `luma()`. `tint()`, `shade()` and `luma()`.

View File

@@ -24,6 +24,7 @@ import java.awt.event.ContainerListener;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.util.Map; import java.util.Map;
import javax.swing.AbstractButton; import javax.swing.AbstractButton;
import javax.swing.InputMap;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.border.Border; import javax.swing.border.Border;
@@ -194,6 +195,52 @@ public class FlatToolBarUI
} }
} }
/**
* Does the same as super.navigateFocusedComp() with the exception that components
* with empty input map (e.g. JLabel) are skipped.
*/
@Override
protected void navigateFocusedComp( int direction ) {
int count = toolBar.getComponentCount();
if( focusedCompIndex < 0 || focusedCompIndex >= count )
return;
int add;
switch( direction ) {
case EAST: case SOUTH: add = 1; break;
case WEST: case NORTH: add = -1; break;
default: return;
}
for( int i = focusedCompIndex + add; i != focusedCompIndex; i += add ) {
if( i < 0 )
i = count - 1;
else if( i >= count )
i = 0;
Component c = toolBar.getComponentAtIndex( i );
// see Component.canBeFocusOwner()
if( c == null || !c.isEnabled() || !c.isVisible() || !c.isDisplayable() || !c.isFocusable() )
continue; // skip
// check whether component has a empty input map to skip components that
// are focusable, but do nothing when focused (e.g. JLabel)
if( c instanceof JComponent ) {
// see LayoutFocusTraversalPolicy.accept()
InputMap inputMap = ((JComponent)c).getInputMap( JComponent.WHEN_FOCUSED );
while( inputMap != null && inputMap.size() == 0 )
inputMap = inputMap.getParent();
if( inputMap == null )
continue; // skip
}
c.requestFocus();
return;
}
}
// disable rollover border // disable rollover border
@Override protected void setBorderToRollover( Component c ) {} @Override protected void setBorderToRollover( Component c ) {}
@Override protected void setBorderToNonRollover( Component c ) {} @Override protected void setBorderToNonRollover( Component c ) {}