package src.com.fxexperience.javafx.scene.control.colorpicker; import javafx.beans.binding.ObjectBinding; import javafx.beans.binding.StringBinding; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.effect.DropShadow; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; import javafx.scene.shape.Rectangle; import javafx.scene.shape.RectangleBuilder; /** * @author Jasper Potts */ public class ColorPicker extends Button { private ObjectProperty<Color> color = new SimpleObjectProperty<Color>( Color.RED); public ObjectProperty<Color> colorProperty() { return color; } public Color getColor() { return color.get(); } public void setColor(Color newColor) { color.set(newColor); } private ColorPickerPopover popover; public ColorPicker() { this(Color.BLACK); } public ColorPicker(Color startColor) { setMinWidth(USE_PREF_SIZE); setMaxWidth(Double.MAX_VALUE); setAlignment(Pos.BASELINE_LEFT); getStyleClass().add("color-picker"); color.set(startColor); textProperty().bind(new StringBinding() { { bind(color); } @Override protected String computeValue() { return getWebColor(getColor()); } }); setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent arg0) { if (popover == null) { popover = new ColorPickerPopover(); popover.colorProperty().addListener( new ChangeListener<Color>() { @Override public void changed( ObservableValue<? extends Color> arg0, Color arg1, Color newValue) { setColor(newValue); } }); } if (popover.isShowing()) { popover.hide(); } else { popover.setColor(getColor()); popover.show(ColorPicker.this); } } }); Rectangle colorRect = RectangleBuilder.create().width(16).height(16) .build(); colorRect.fillProperty().bind(new ObjectBinding<Paint>() { { bind(color); } @Override protected Paint computeValue() { return getColor(); } }); colorRect.setEffect(new DropShadow(3, 0, 1, Color.rgb(0, 0, 0, 0.8))); setGraphic(colorRect); } private static String getWebColor(Color color) { final int red = (int) (color.getRed() * 255); final int green = (int) (color.getGreen() * 255); final int blue = (int) (color.getBlue() * 255); return "#" + String.format("%02X", red) + String.format("%02X", green) + String.format("%02X", blue); } public String getWebColor() { return getWebColor(getColor()); } }