diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java index 96831b16..f6d76737 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -670,6 +670,14 @@ public interface FlatClientProperties */ String TAB_BUTTON_SELECTED_BACKGROUND = "JToggleButton.tab.selectedBackground"; + /** + * Override if a tree shows a wide selection. + *
+ * Component {@link javax.swing.JTree}
+ * Value type {@link java.lang.Boolean}
+ */
+ String TREE_WIDE_SELECTION = "JTree.wideSelection";
+
//---- helper methods -----------------------------------------------------
/**
diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java
index 4527270a..eae9cbdd 100644
--- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java
+++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java
@@ -16,6 +16,8 @@
package com.formdev.flatlaf.ui;
+import static com.formdev.flatlaf.FlatClientProperties.*;
+
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
@@ -25,6 +27,7 @@ import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
+import java.lang.reflect.Field;
import javax.swing.CellRendererPane;
import javax.swing.JComponent;
import javax.swing.JTree;
@@ -119,7 +122,7 @@ public class FlatTreeUI
selectionInactiveBackground = UIManager.getColor( "Tree.selectionInactiveBackground" );
selectionInactiveForeground = UIManager.getColor( "Tree.selectionInactiveForeground" );
selectionBorderColor = UIManager.getColor( "Tree.selectionBorderColor" );
- wideSelection = UIManager.getBoolean( "Tree.wideSelection" );
+ wideSelection = clientPropertyBoolean( tree, TREE_WIDE_SELECTION, UIManager.getBoolean( "Tree.wideSelection" ));
showCellFocusIndicator = UIManager.getBoolean( "Tree.showCellFocusIndicator" );
// scale
@@ -145,9 +148,6 @@ public class FlatTreeUI
@Override
protected MouseListener createMouseListener() {
- if( !wideSelection )
- return super.createMouseListener();
-
return new BasicTreeUI.MouseHandler() {
@Override
public void mousePressed( MouseEvent e ) {
@@ -165,7 +165,7 @@ public class FlatTreeUI
}
private MouseEvent handleWideMouseEvent( MouseEvent e ) {
- if( !tree.isEnabled() || !SwingUtilities.isLeftMouseButton( e ) || e.isConsumed() )
+ if( !wideSelection || !tree.isEnabled() || !SwingUtilities.isLeftMouseButton( e ) || e.isConsumed() )
return e;
int x = e.getX();
@@ -192,18 +192,33 @@ public class FlatTreeUI
@Override
protected PropertyChangeListener createPropertyChangeListener() {
- if( !wideSelection )
- return super.createPropertyChangeListener();
-
return new BasicTreeUI.PropertyChangeHandler() {
@Override
public void propertyChange( PropertyChangeEvent e ) {
super.propertyChange( e );
-
- if( e.getSource() == tree && e.getPropertyName() == "dropLocation" ) {
- JTree.DropLocation oldValue = (JTree.DropLocation) e.getOldValue();
- repaintWideDropLocation( oldValue );
- repaintWideDropLocation( tree.getDropLocation() );
+ if (e.getSource() == tree ) {
+ switch( e.getPropertyName() ) {
+ case TREE_WIDE_SELECTION:
+ wideSelection = (Boolean) e.getNewValue();
+ if (currentCellRenderer instanceof DefaultTreeCellRenderer) {
+ try {
+ Field fillBackgroundField = DefaultTreeCellRenderer.class
+ .getDeclaredField( "fillBackground" );
+ fillBackgroundField.setAccessible( true );
+ fillBackgroundField.set( currentCellRenderer, !wideSelection );
+ } catch( Exception ignored ) {
+ }
+ }
+ tree.repaint();
+ break;
+ case "dropLocation":
+ if (wideSelection) {
+ JTree.DropLocation oldValue = (JTree.DropLocation) e.getOldValue();
+ repaintWideDropLocation( oldValue );
+ repaintWideDropLocation( tree.getDropLocation() );
+ }
+ break;
+ }
}
}
diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java
new file mode 100644
index 00000000..17bdae04
--- /dev/null
+++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java
@@ -0,0 +1,28 @@
+package com.formdev.flatlaf.extras.components;
+
+import javax.swing.*;
+import static com.formdev.flatlaf.FlatClientProperties.TREE_WIDE_SELECTION;
+import static com.formdev.flatlaf.FlatClientProperties.clientPropertyBoolean;
+
+/**
+ * Subclass of {@link JTree} that provides easy access to FlatLaf specific client properties.
+ *
+ */
+public class FlatTree
+ extends JTree
+ implements FlatComponentExtension
+{
+ /**
+ * Returns if the tree shows a wide selection
+ */
+ public boolean isWideSelection() {
+ return clientPropertyBoolean( this, TREE_WIDE_SELECTION, UIManager.getBoolean( "Tree.wideSelection" ));
+ }
+
+ /**
+ * Sets if the tree shows a wide selection
+ */
+ public void setWideSelection(boolean wideSelection) {
+ putClientProperty( TREE_WIDE_SELECTION, wideSelection);
+ }
+}