import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class JSliderPopupDemo extends JFrame {
public JSliderPopupDemo() {
this.getContentPane().add(new MalFormedSlider(JSlider.HORIZONTAL, 0 , 10000, 0), BorderLayout.NORTH);
}
class MalFormedSlider extends JSlider implements ChangeListener, MouseListener, MouseMotionListener {
private JSlider slider;
private boolean mouseIsDown;
private int x;
public MalFormedSlider(int orientation, int min, int max, int value) {
super(orientation, min, max, value);
this.addChangeListener(this);
this.addMouseMotionListener(this);
this.setFont(new Font("Arial", Font.BOLD, 15));
}
public void stateChanged(ChangeEvent e) {
this.repaint();
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {
mouseIsDown = false;
this.repaint();
}
public void mouseDragged(MouseEvent e) {
mouseIsDown = true;
x = e.getX();
if(x<0)
x=0;
}
public void mouseMoved(MouseEvent e) {
mouseIsDown = false;
this.repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (!mouseIsDown)
return;
Graphics2D g2 = (Graphics2D)g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
String value = String.valueOf(this.getValue());
Font font = this.getFont();
int w = this.getFontMetrics(font).stringWidth(value) + 2;
if (this.getValue()*100/this.getMaximum()<80)
g2.translate(x+14, (this.getHeight() - font.getSize())/2);
else
g2.translate(x-14-w, (this.getHeight() - font.getSize())/2);
g2.setColor(Color.WHITE);
g2.fillRoundRect(0, 0, w, font.getSize()+2, 5, 5);
g2.setColor(Color.BLACK);
g2.drawString(String.valueOf(value), 1, font.getSize());
g2.dispose();
}
}
public static void main(String[] args) {
JFrame frame = new JSliderPopupDemo();
frame.setBounds(0, 0, 500, 300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}