/******************************************************************************* * Copyright 2011 See AUTHORS file. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.badlogic.gdx.tools.particleeditor; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; class NewSlider extends JPanel { static private final int KNOB_WIDTH = 10; float value, min, max, stepSize, sliderMin, sliderMax; ChangeListener listener; int border = 2; Color bgColor = new Color(0.6f, 0.6f, 0.6f); Color knobColor = Color.lightGray; public NewSlider (float initialValue, final float min, final float max, float stepSize, final float sliderMin, final float sliderMax) { this.min = min; this.max = max; this.stepSize = stepSize; this.sliderMin = sliderMin; this.sliderMax = sliderMax; value = Math.max(min, Math.min(max, initialValue)); setLayout(new GridBagLayout()); addMouseListener(new MouseAdapter() { public void mousePressed (MouseEvent event) { float width = getWidth() - KNOB_WIDTH - border * 2; float mouseX = event.getX() - KNOB_WIDTH / 2 - border; setValue(sliderMin + (sliderMax - sliderMin) * Math.max(0, Math.min(width, mouseX)) / width); } public void mouseReleased (MouseEvent event) { } public void mouseClicked (MouseEvent event) { repaint(); } }); addMouseMotionListener(new MouseMotionListener() { public void mouseDragged (MouseEvent event) { float width = getWidth() - KNOB_WIDTH - border * 2; float mouseX = event.getX() - KNOB_WIDTH / 2 - border; setValue(sliderMin + (sliderMax - sliderMin) * Math.max(0, Math.min(width, mouseX)) / width); } public void mouseMoved (MouseEvent event) { int mouseX = event.getX(); int mouseY = event.getY(); } }); } protected void paintComponent (Graphics graphics) { super.paintComponent(graphics); Graphics2D g = (Graphics2D)graphics; int width = getWidth(); int height = getHeight(); g.setColor(bgColor); g.fillRect(border, border, width - border * 2, height - border * 2); int maxKnobX = width - border - KNOB_WIDTH; int knobX = (int)((width - border * 2 - KNOB_WIDTH) * (value - sliderMin) / (sliderMax - sliderMin)) + border; g.setColor(knobColor); g.fillRect(Math.max(border, Math.min(maxKnobX, knobX)), 0, KNOB_WIDTH, height); float displayValue = (int)(value * 10) / 10f; String label = displayValue == (int)displayValue ? String.valueOf((int)displayValue) : String.valueOf(displayValue); FontMetrics metrics = g.getFontMetrics(); int labelWidth = metrics.stringWidth(label); g.setColor(Color.white); g.drawString(label, width / 2 - labelWidth / 2, height / 2 + metrics.getAscent() / 2); } public void setValue (float value) { this.value = (int)(Math.max(min, Math.min(max, value)) / stepSize) * stepSize; repaint(); if (listener != null) listener.stateChanged(new ChangeEvent(this)); } public float getValue () { return value; } public void addChangeListener (ChangeListener listener) { this.listener = listener; } public Dimension getPreferredSize () { Dimension size = super.getPreferredSize(); size.width = 150; size.height = 26; return size; } public static void main (String[] args) throws Exception { EventQueue.invokeLater(new Runnable() { public void run () { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setSize(480, 320); frame.setLocationRelativeTo(null); JPanel panel = new JPanel(); frame.getContentPane().add(panel); panel.add(new NewSlider(200, 100, 500, 0.1f, 150, 300)); frame.setVisible(true); } }); } }