All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jdesktop.swingx.JXGradientChooser Maven / Gradle / Ivy

The newest version!
/*
 * $Id: JXGradientChooser.java 4147 2012-02-01 17:13:24Z kschaefe $
 *
 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
 * Santa Clara, California 95054, U.S.A. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

package org.jdesktop.swingx;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.MultipleGradientPaint;
import java.awt.RadialGradientPaint;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.logging.Logger;

import javax.swing.ActionMap;
import javax.swing.ButtonGroup;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import org.jdesktop.beans.JavaBean;
import org.jdesktop.swingx.action.AbstractActionExt;
import org.jdesktop.swingx.color.GradientPreviewPanel;
import org.jdesktop.swingx.color.GradientThumbRenderer;
import org.jdesktop.swingx.color.GradientTrackRenderer;
import org.jdesktop.swingx.multislider.Thumb;
import org.jdesktop.swingx.multislider.ThumbListener;
import org.jdesktop.swingx.util.PaintUtils;

/**
 * 

A specialized JXPanel that allows the user to construct and choose a Gradient. * The returned values will be one of: LinearGradientPaint or RadialGradientPaint.

* *

Dependency: Because this class relies on LinearGradientPaint and * RadialGradientPaint, it requires the optional MultipleGradientPaint.jar

* * @author joshy */ @JavaBean public class JXGradientChooser extends JXPanel { private enum GradientStyle { Linear, Radial } /** * The multi-thumb slider to use for the gradient stops */ private JXMultiThumbSlider slider; private JButton deleteThumbButton; private JButton addThumbButton; private JTextField colorField; private JXColorSelectionButton changeColorButton; private JSpinner colorLocationSpinner; private JSpinner alphaSpinner; private JSlider alphaSlider; private JComboBox styleCombo; private GradientPreviewPanel gradientPreview; private JRadioButton noCycleRadio; private JRadioButton reflectedRadio; private JRadioButton repeatedRadio; private JCheckBox reversedCheck; private MultipleGradientPaint gradient; /** * Creates new JXGradientChooser */ public JXGradientChooser() { initComponents2(); } /** * Returns the MultipleGradientPaint currently choosen by the user. * @return the currently selected gradient */ public MultipleGradientPaint getGradient() { return gradient; } private boolean thumbsMoving = false; private Logger log = Logger.getLogger(JXGradientChooser.class.getName()); /** * Sets the gradient within this panel to the new gradient. This will delete * the old gradient all of it's settings, resetting the slider, gradient * type selection, and other gradient configuration options to match the * new gradient. * * @param mgrad The desired gradient. */ public void setGradient(MultipleGradientPaint mgrad) { if(gradient == mgrad) { return; } float[] fracts = mgrad.getFractions(); Color[] colors = mgrad.getColors(); if(!thumbsMoving) { // update the slider properly if(slider.getModel().getThumbCount() != mgrad.getColors().length) { // removing all thumbs; while(slider.getModel().getThumbCount() > 0) { slider.getModel().removeThumb(0); } // add them back for(int i=0; i thumb) { if(thumb == null) { updateFromStop(-1,-1,Color.black); } else { updateFromStop(1,thumb.getPosition(),thumb.getObject()); } } private void updateFromStop(int thumb, float position, Color color) { log.fine("updating: " + thumb + " " + position + " " + color); if(thumb == -1) { colorLocationSpinner.setEnabled(false); alphaSpinner.setEnabled(false); alphaSlider.setEnabled(false); colorField.setEnabled(false); changeColorButton.setEnabled(false); changeColorButton.setBackground(Color.black); deleteThumbButton.setEnabled(false); } else { colorLocationSpinner.setEnabled(true); alphaSpinner.setEnabled(true); alphaSlider.setEnabled(true); colorField.setEnabled(true); changeColorButton.setEnabled(true); colorLocationSpinner.setValue((int)(100*position)); colorField.setText(Integer.toHexString(color.getRGB()).substring(2)); alphaSpinner.setValue(color.getAlpha()*100/255); alphaSlider.setValue(color.getAlpha()*100/255); changeColorButton.setBackground(color); deleteThumbButton.setEnabled(true); } updateDeleteButtons(); recalcGradientFromStops(); } private void updateDeleteButtons() { if(slider.getModel().getThumbCount() <= 2) { deleteThumbButton.setEnabled(false); } } private void updateGradientProperty() { firePropertyChange("gradient",null,getGradient()); gradientPreview.repaint(); } /** This method is called from within the constructor to * initialize the form. */ private JPanel topPanel, previewPanel; private void initComponents() { // declarations for anonymous components JPanel jPanel1, jPanel2, jPanel3, jPanel4; JLabel jLabel1, jLabel5, jLabel2, jLabel6, jLabel4, jLabel7, jLabel8, jLabel9; ButtonGroup typeGroup; // pre-init stuff slider = new JXMultiThumbSlider(); gradientPreview = new GradientPreviewPanel(); gradientPreview.setMultiThumbModel(slider.getModel()); java.awt.GridBagConstraints gridBagConstraints; typeGroup = new javax.swing.ButtonGroup(); jPanel1 = new javax.swing.JPanel(); topPanel = new javax.swing.JPanel(); jPanel2 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); colorField = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); colorLocationSpinner = new javax.swing.JSpinner(); jLabel4 = new javax.swing.JLabel(); jLabel7 = new javax.swing.JLabel(); alphaSpinner = new javax.swing.JSpinner(); changeColorButton = new JXColorSelectionButton(); alphaSlider = new javax.swing.JSlider(); //slider = new javax.swing.JSlider(); jPanel4 = new javax.swing.JPanel(); addThumbButton = new javax.swing.JButton(); deleteThumbButton = new javax.swing.JButton(); previewPanel = new javax.swing.JPanel(); jPanel3 = new javax.swing.JPanel(); jLabel8 = new javax.swing.JLabel(); styleCombo = new javax.swing.JComboBox(); jLabel9 = new javax.swing.JLabel(); noCycleRadio = new javax.swing.JRadioButton(); reflectedRadio = new javax.swing.JRadioButton(); repeatedRadio = new javax.swing.JRadioButton(); reversedCheck = new javax.swing.JCheckBox(); //gradientPreview = new javax.swing.JPanel(); //setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jPanel1.setLayout(new java.awt.GridBagLayout()); topPanel.setLayout(new java.awt.GridBagLayout()); topPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Gradient")); jPanel2.setLayout(new java.awt.GridBagLayout()); jLabel1.setText("Color:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.ipadx = 2; gridBagConstraints.ipady = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel2.add(jLabel1, gridBagConstraints); jLabel5.setText("#"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.insets = new java.awt.Insets(4, 0, 4, 4); jPanel2.add(jLabel5, gridBagConstraints); colorField.setColumns(6); colorField.setEnabled(false); colorField.setPreferredSize(null); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; jPanel2.add(colorField, gridBagConstraints); jLabel2.setText("Location:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel2.add(jLabel2, gridBagConstraints); jLabel6.setText("%"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 1; jPanel2.add(jLabel6, gridBagConstraints); colorLocationSpinner.setEnabled(false); colorLocationSpinner.setPreferredSize(null); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; jPanel2.add(colorLocationSpinner, gridBagConstraints); jLabel4.setText("Opacity:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel2.add(jLabel4, gridBagConstraints); jLabel7.setText("%"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 2; jPanel2.add(jLabel7, gridBagConstraints); alphaSpinner.setEnabled(false); alphaSpinner.setPreferredSize(null); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; jPanel2.add(alphaSpinner, gridBagConstraints); changeColorButton.setText("00"); changeColorButton.setEnabled(false); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.NONE; gridBagConstraints.weightx = 1.0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 0); jPanel2.add(changeColorButton, gridBagConstraints); alphaSlider.setEnabled(false); alphaSlider.setPreferredSize(new java.awt.Dimension(20, 25)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; jPanel2.add(alphaSlider, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); topPanel.add(jPanel2, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; topPanel.add(slider, gridBagConstraints); jPanel4.setLayout(new java.awt.GridLayout(1, 0, 2, 0)); addThumbButton.setText("Add"); jPanel4.add(addThumbButton); deleteThumbButton.setText("Delete"); jPanel4.add(deleteThumbButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); topPanel.add(jPanel4, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; jPanel1.add(topPanel, gridBagConstraints); previewPanel.setLayout(new java.awt.GridBagLayout()); previewPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Preview")); jPanel3.setLayout(new java.awt.GridBagLayout()); jLabel8.setText("Style:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel3.add(jLabel8, gridBagConstraints); styleCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Linear", "Radial" })); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel3.add(styleCombo, gridBagConstraints); jLabel9.setText("Type:"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel3.add(jLabel9, gridBagConstraints); typeGroup.add(noCycleRadio); noCycleRadio.setSelected(true); noCycleRadio.setText("None"); noCycleRadio.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); noCycleRadio.setMargin(new java.awt.Insets(0, 0, 0, 0)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel3.add(noCycleRadio, gridBagConstraints); typeGroup.add(reflectedRadio); reflectedRadio.setText("Reflect"); reflectedRadio.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); reflectedRadio.setMargin(new java.awt.Insets(0, 0, 0, 0)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel3.add(reflectedRadio, gridBagConstraints); typeGroup.add(repeatedRadio); repeatedRadio.setText("Repeat"); repeatedRadio.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); repeatedRadio.setMargin(new java.awt.Insets(0, 0, 0, 0)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel3.add(repeatedRadio, gridBagConstraints); reversedCheck.setText("Reverse"); reversedCheck.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0)); reversedCheck.setMargin(new java.awt.Insets(0, 0, 0, 0)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 4; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); jPanel3.add(reversedCheck, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; previewPanel.add(jPanel3, gridBagConstraints); gradientPreview.setBorder(javax.swing.BorderFactory.createEtchedBorder()); gradientPreview.setPreferredSize(new java.awt.Dimension(130, 130)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 10.0; gridBagConstraints.weighty = 10.0; previewPanel.add(gradientPreview, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; jPanel1.add(previewPanel, gridBagConstraints); }// private void initComponents2() { this.initComponents(); setLayout(new BorderLayout()); add(topPanel, BorderLayout.NORTH); add(previewPanel, BorderLayout.CENTER); // do event handling stuff //create the actions and load them in the action map AddThumbAction addThumbAction = new AddThumbAction(); DeleteThumbAction deleteThumbAction = new DeleteThumbAction(); deleteThumbAction.setEnabled(false); //disabled to begin with //TODO Add to the action map with proper keys, etc ActionMap actions = getActionMap(); actions.put("add-thumb", addThumbAction); actions.put("delete-thumb", deleteThumbAction); //actions.put("change-color", changeColorAction); addThumbButton.setAction(addThumbAction); deleteThumbButton.setAction(deleteThumbAction); changeColorButton.addPropertyChangeListener("background", new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { selectColorForThumb(); updateGradientProperty(); } }); colorLocationSpinner.addChangeListener(new ChangeLocationListener()); ChangeAlphaListener changeAlphaListener = new ChangeAlphaListener(); alphaSpinner.addChangeListener(changeAlphaListener); alphaSlider.addChangeListener(changeAlphaListener); RepaintOnEventListener repaintListener = new RepaintOnEventListener(); styleCombo.addItemListener(repaintListener); styleCombo.setModel(new DefaultComboBoxModel(GradientStyle.values())); noCycleRadio.addActionListener(repaintListener); reflectedRadio.addActionListener(repaintListener); repeatedRadio.addActionListener(repaintListener); reversedCheck.addActionListener(repaintListener); gradientPreview.picker = this; //wow, nasty ///To still refactor below:: SpinnerNumberModel alpha_model = new SpinnerNumberModel(100,0,100,1); alphaSpinner.setModel(alpha_model); SpinnerNumberModel location_model = new SpinnerNumberModel(100,0,100,1); colorLocationSpinner.setModel(location_model); slider.setOpaque(false); slider.setPreferredSize(new Dimension(100,35)); slider.getModel().setMinimumValue(0f); slider.getModel().setMaximumValue(1.0f); slider.getModel().addThumb(0,Color.black); slider.getModel().addThumb(0.5f,Color.red); slider.getModel().addThumb(1.0f,Color.white); slider.setThumbRenderer(new GradientThumbRenderer()); slider.setTrackRenderer(new GradientTrackRenderer()); slider.addMultiThumbListener(new StopListener()); // called when the gradient property of the preview pane changes gradientPreview.addPropertyChangeListener("gradient", new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent propertyChangeEvent) { recalcGradientFromStops(); } }); recalcGradientFromStops(); } // called whenever the color location spinner is changed private final class ChangeLocationListener implements ChangeListener { @Override public void stateChanged(ChangeEvent evt) { if(slider.getSelectedIndex() >= 0) { Thumb thumb = slider.getModel().getThumbAt(slider.getSelectedIndex()); thumb.setPosition((Integer)colorLocationSpinner.getValue()/100f); updateFromStop(thumb); updateGradientProperty(); } } } // called when the alpha slider moves private final class ChangeAlphaListener implements ChangeListener { @Override public void stateChanged(ChangeEvent changeEvent) { if(slider.getSelectedIndex() >= 0 && !thumbsMoving) { // get the selected thumb Thumb thumb = slider.getModel().getThumbAt(slider.getSelectedIndex()); // get the new alpha value int alpha = changeEvent.getSource() == alphaSpinner ? (Integer)alphaSpinner.getValue() : alphaSlider.getValue(); // calc new color and set it on thumb Color col = thumb.getObject(); col = PaintUtils.setAlpha(col, alpha*255/100); thumb.setObject(col); // set the new alpha value on the other alpha control if (changeEvent.getSource() == alphaSpinner) { alphaSlider.setValue(alpha); } else { alphaSpinner.setValue(alpha); } recalcGradientFromStops(); } } } private final class AddThumbAction extends AbstractActionExt { public AddThumbAction() { super("Add"); } @Override public void actionPerformed(ActionEvent actionEvent) { float pos = 0.2f; Color color = Color.black; int num = slider.getModel().addThumb(pos,color); log.fine("new number = " + num); /* for (int i = 0; i < slider.getModel().getThumbCount(); i++) { float pos2 = slider.getModel().getThumbAt(i).getPosition(); if (pos2 < pos) { continue; } slider.getModel().insertThumb(pos, color, i); updateFromStop(i,pos,color); break; } */ } } private final class DeleteThumbAction extends AbstractActionExt { public DeleteThumbAction() { super("Delete"); } @Override public void actionPerformed(ActionEvent actionEvent) { int index = slider.getSelectedIndex(); if (index >= 0) { slider.getModel().removeThumb(index); updateFromStop(-1,-1,null); } } } private class StopListener implements ThumbListener { public StopListener() { super(); } @Override public void thumbMoved(int thumb, float pos) { log.fine("moved: " + thumb + " " + pos); Color color = slider.getModel().getThumbAt(thumb).getObject(); thumbsMoving = true; updateFromStop(thumb,pos,color); updateDeleteButtons(); thumbsMoving = false; } @Override public void thumbSelected(int thumb) { if(thumb == -1) { updateFromStop(-1,-1,Color.black); return; } thumbsMoving = true; float pos = slider.getModel().getThumbAt(thumb).getPosition(); Color color = slider.getModel().getThumbAt(thumb).getObject(); log.fine("selected = " + thumb + " " + pos + " " + color); updateFromStop(thumb,pos,color); updateDeleteButtons(); slider.repaint(); thumbsMoving = false; } @Override public void mousePressed(MouseEvent e) { if(e.getClickCount() > 1) { selectColorForThumb(); } } } private final class RepaintOnEventListener implements ActionListener, ItemListener { @Override public void actionPerformed(ActionEvent e) { gradientPreview.setReflected(reflectedRadio.isSelected()); gradientPreview.setReversed(reversedCheck.isSelected()); gradientPreview.setRepeated(repeatedRadio.isSelected()); //updateGradientProperty(); recalcGradientFromStops(); gradientPreview.repaint(); } @Override public void itemStateChanged(ItemEvent e) { if(styleCombo.getSelectedItem() == GradientStyle.Radial) { gradientPreview.setRadial(true); } else { gradientPreview.setRadial(false); } recalcGradientFromStops(); } } private void selectColorForThumb() { int index = slider.getSelectedIndex(); if (index >= 0) { Color color = changeColorButton.getBackground(); slider.getModel().getThumbAt(index).setObject(color); updateFromStop(index, slider.getModel().getThumbAt(index).getPosition(), color); } } /** * This static utility method cannot be called from the * ETD, or your application will lock up. Call it from a separate * thread or create a new Thread with a Runnable. * @param comp The component to use when finding a top level window or frame for * the dialog. * @param title The desired title of the gradient chooser dialog. * @param mgrad The gradient to initialize the chooser too. * @return The gradient the user chose. */ public static MultipleGradientPaint showDialog(Component comp, String title, MultipleGradientPaint mgrad) { Component root = SwingUtilities.getRoot(comp); final JDialog dialog = new JDialog((JFrame)root,title,true); final JXGradientChooser picker = new JXGradientChooser(); if(mgrad != null) { picker.setGradient(mgrad); } dialog.add(picker); JPanel panel = new JPanel(); JButton cancel = new JButton("Cancel"); cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { dialog.setVisible(false); } }); JButton okay = new JButton("Ok"); okay.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent) { dialog.setVisible(false); } }); okay.setDefaultCapable(true); GridLayout gl = new GridLayout(); gl.setHgap(2); panel.setLayout(gl); panel.add(cancel); panel.add(okay); JPanel p2 = new JPanel(); p2.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.EAST; gbc.weightx = 1.0; p2.add(panel,gbc); dialog.add(p2,"South"); dialog.getRootPane().setDefaultButton(okay); dialog.pack(); dialog.setResizable(false); dialog.setVisible(true); return picker.getGradient(); } /** * Creates a string representation of a {@code MultipleGradientPaint}. This * string is used for debugging purposes. Its contents cannot be guaranteed * between releases. * * @param paint * the {@code paint} to create a string for * @return a string representing the supplied {@code paint} */ public static String toString(MultipleGradientPaint paint) { StringBuffer buffer = new StringBuffer(); buffer.append(paint.getClass().getName()); Color[] colors = paint.getColors(); float[] values = paint.getFractions(); buffer.append("["); for(int i=0; i




© 2015 - 2024 Weber Informatics LLC | Privacy Policy