jrangeslider.java
来自「用applet实现很多应用小程序」· Java 代码 · 共 845 行 · 第 1/2 页
JAVA
845 行
paint3DRectLighting(g2,min,0,max-min-1,height);
}
g2.setColor(getForeground());
g2.fillRect(max, 0, ARROW_SZ-1, height);
paint3DRectLighting(g2,max,0,ARROW_SZ-1,height);
// Draw arrows
g2.setColor(Color.black);
paintArrow(g2, min - ARROW_SZ + (ARROW_SZ-ARROW_HEIGHT) / 2.0, (height-ARROW_WIDTH) / 2.0, ARROW_HEIGHT, ARROW_WIDTH, true);
paintArrow(g2, max + (ARROW_SZ-ARROW_HEIGHT) / 2.0, (height-ARROW_WIDTH) / 2.0, ARROW_HEIGHT, ARROW_WIDTH, false);
}
else {
g2.setColor(getForeground());
g2.fillRect(min, 0, ARROW_SZ - 1, height);
paint3DRectLighting(g2,min,0,ARROW_SZ-1,height);
if ( thumbColor != null ) {
g2.setColor(thumbColor);
g2.fillRect(max, 0, min - max - 1, height);
paint3DRectLighting(g2,max,0,min-max-1,height);
}
g2.setColor(getForeground());
g2.fillRect(max-ARROW_SZ, 0, ARROW_SZ-1, height);
paint3DRectLighting(g2,max-ARROW_SZ,0,ARROW_SZ-1,height);
// Draw arrows
g2.setColor(Color.black);
paintArrow(g2, min + (ARROW_SZ-ARROW_HEIGHT) / 2.0, (height-ARROW_WIDTH) / 2.0, ARROW_HEIGHT, ARROW_WIDTH, true);
paintArrow(g2, max - ARROW_SZ + (ARROW_SZ-ARROW_HEIGHT) / 2.0, (height-ARROW_WIDTH) / 2.0, ARROW_HEIGHT, ARROW_WIDTH, false);
}
}
}
/**
* This draws an arrow as a series of lines within the specified box.
* The last boolean specifies whether the point should be at the
* right/bottom or left/top.
*/
protected void paintArrow(Graphics2D g2, double x, double y, int w, int h,
boolean topDown)
{
int intX = (int)(x+0.5);
int intY = (int)(y+0.5);
if (orientation == VERTICAL) {
if (w % 2 == 0) {
w = w - 1;
}
if (topDown) {
for(int i=0; i<(w/2+1); i++) {
g2.drawLine(intX+i,intY+i,intX+w-i-1,intY+i);
}
}
else {
for(int i=0; i<(w/2+1); i++) {
g2.drawLine(intX+w/2-i,intY+i,intX+w-w/2+i-1,intY+i);
}
}
}
else {
if (h % 2 == 0) {
h = h - 1;
}
if (topDown) {
for(int i=0; i<(h/2+1); i++) {
g2.drawLine(intX+i,intY+i,intX+i,intY+h-i-1);
}
}
else {
for(int i=0; i<(h/2+1); i++) {
g2.drawLine(intX+i,intY+h/2-i,intX+i,intY+h-h/2+i-1);
}
}
}
}
/**
* Adds Windows2K type 3D lighting effects
*/
protected void paint3DRectLighting(Graphics2D g2, int x, int y,
int width, int height)
{
g2.setColor(Color.white);
g2.drawLine(x+1,y+1,x+1,y+height-1);
g2.drawLine(x+1,y+1,x+width-1,y+1);
g2.setColor(Color.gray);
g2.drawLine(x+1,y+height-1,x+width-1,y+height-1);
g2.drawLine(x+width-1,y+1,x+width-1,y+height-1);
g2.setColor(Color.darkGray);
g2.drawLine(x,y+height,x+width,y+height);
g2.drawLine(x+width,y,x+width,y+height);
}
/**
* Converts from screen coordinates to a range value.
*/
protected int toLocal(int xOrY) {
Dimension sz = getSize();
int min = getMinimum();
double scale;
if (orientation == VERTICAL) {
scale = (sz.height - (2 * ARROW_SZ)) / (double) (getMaximum() - min);
}
else {
scale = (sz.width - (2 * ARROW_SZ)) / (double) (getMaximum() - min);
}
if (direction == LEFTRIGHT_TOPBOTTOM) {
return (int) (((xOrY - ARROW_SZ) / scale) + min + 0.5);
}
else {
if (orientation == VERTICAL) {
return (int) ((sz.height - xOrY - ARROW_SZ) / scale + min + 0.5);
}
else {
return (int) ((sz.width - xOrY - ARROW_SZ) / scale + min + 0.5);
}
}
}
/**
* Converts from a range value to screen coordinates.
*/
protected int toScreen(int xOrY) {
Dimension sz = getSize();
int min = getMinimum();
double scale;
if (orientation == VERTICAL) {
scale = (sz.height - (2 * ARROW_SZ)) / (double) (getMaximum() - min);
}
else {
scale = (sz.width - (2 * ARROW_SZ)) / (double) (getMaximum() - min);
}
// If the direction is left/right_top/bottom then we subtract the min and multiply times scale
// Otherwise, we have to invert the number by subtracting the value from the height
if (direction == LEFTRIGHT_TOPBOTTOM) {
return (int)(ARROW_SZ + ((xOrY - min) * scale) + 0.5);
}
else {
if (orientation == VERTICAL) {
return (int)(sz.height-(xOrY - min) * scale - ARROW_SZ + 0.5);
}
else {
return (int)(sz.width-(xOrY - min) * scale - ARROW_SZ + 0.5);
}
}
}
/**
* Converts from a range value to screen coordinates.
*/
protected double toScreenDouble(int xOrY) {
Dimension sz = getSize();
int min = getMinimum();
double scale;
if (orientation == VERTICAL) {
scale = (sz.height - (2 * ARROW_SZ)) / (double) (getMaximum()+1 - min);
}
else {
scale = (sz.width - (2 * ARROW_SZ)) / (double) (getMaximum()+1 - min);
}
// If the direction is left/right_top/bottom then we subtract the min and multiply times scale
// Otherwise, we have to invert the number by subtracting the value from the height
if (direction == LEFTRIGHT_TOPBOTTOM) {
return ARROW_SZ + ((xOrY - min) * scale);
}
else {
if (orientation == VERTICAL) {
return sz.height-(xOrY - min) * scale - ARROW_SZ;
}
else {
return sz.width-(xOrY - min) * scale - ARROW_SZ;
}
}
}
// ------------------------------------------------------------------------
// Event Handling
static final int PICK_NONE = 0;
static final int PICK_LEFT_OR_TOP = 1;
static final int PICK_THUMB = 2;
static final int PICK_RIGHT_OR_BOTTOM = 3;
int pick;
int pickOffsetLow;
int pickOffsetHigh;
int mouse;
private int pickHandle(int xOrY) {
int min = toScreen(getLowValue());
int max = toScreen(getHighValue());
int pick = PICK_NONE;
if (direction == LEFTRIGHT_TOPBOTTOM) {
if ((xOrY > (min - ARROW_SZ)) && (xOrY < min)) {
pick = PICK_LEFT_OR_TOP;
} else if ((xOrY >= min) && (xOrY <= max)) {
pick = PICK_THUMB;
} else if ((xOrY > max) && (xOrY < (max + ARROW_SZ))) {
pick = PICK_RIGHT_OR_BOTTOM;
}
}
else {
if ((xOrY > min) && (xOrY < (min + ARROW_SZ))) {
pick = PICK_LEFT_OR_TOP;
} else if ((xOrY <= min) && (xOrY >= max)) {
pick = PICK_THUMB;
} else if ((xOrY > (max - ARROW_SZ) && (xOrY < max))) {
pick = PICK_RIGHT_OR_BOTTOM;
}
}
return pick;
}
private void offset(int dxOrDy) {
model.setValue(model.getValue()+dxOrDy);
}
/**
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed(MouseEvent e) {
if (orientation == VERTICAL) {
pick = pickHandle(e.getY());
pickOffsetLow = e.getY() - toScreen(getLowValue());
pickOffsetHigh = e.getY() - toScreen(getHighValue());
mouse = e.getY();
}
else {
pick = pickHandle(e.getX());
pickOffsetLow = e.getX() - toScreen(getLowValue());
pickOffsetHigh = e.getX() - toScreen(getHighValue());
mouse = e.getX();
}
repaint();
}
/**
* @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
*/
public void mouseDragged(MouseEvent e) {
requestFocus();
int value = (orientation == VERTICAL) ? e.getY() : e.getX();
int minimum = getMinimum();
int maximum = getMaximum();
int lowValue = getLowValue();
int highValue = getHighValue();
switch (pick) {
case PICK_LEFT_OR_TOP:
int low = toLocal(value-pickOffsetLow);
if (low < minimum) {
low = minimum;
}
if (low > maximum - minExtent) {
low = maximum - minExtent;
}
if (low > highValue-minExtent) {
setRange(low, low + minExtent);
}
else
setLowValue(low);
break;
case PICK_RIGHT_OR_BOTTOM:
int high = toLocal(value-pickOffsetHigh);
if (high < minimum + minExtent) {
high = minimum + minExtent;
}
if (high > maximum) {
high = maximum;
}
if (high < lowValue+minExtent) {
setRange(high - minExtent, high);
}
else
setHighValue(high);
break;
case PICK_THUMB:
int dxOrDy = toLocal(value - pickOffsetLow) - lowValue;
if ((dxOrDy < 0) && ((lowValue + dxOrDy) < minimum)) {
dxOrDy = minimum - lowValue;
}
if ((dxOrDy > 0) && ((highValue + dxOrDy) > maximum)) {
dxOrDy = maximum - highValue;
}
if (dxOrDy != 0) {
offset(dxOrDy);
}
break;
}
}
/**
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased(MouseEvent e) {
pick = PICK_NONE;
repaint();
}
/**
* @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
*/
public void mouseMoved(MouseEvent e) {
if (orientation == VERTICAL) {
switch (pickHandle(e.getY())) {
case PICK_LEFT_OR_TOP:
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
break;
case PICK_RIGHT_OR_BOTTOM:
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
break;
case PICK_THUMB:
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
break;
case PICK_NONE :
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
break;
}
}
else {
switch (pickHandle(e.getX())) {
case PICK_LEFT_OR_TOP:
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
break;
case PICK_RIGHT_OR_BOTTOM:
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
break;
case PICK_THUMB:
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
break;
case PICK_NONE :
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
break;
}
}
}
/**
* @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
*/
public void mouseClicked(MouseEvent e) {
}
/**
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
public void mouseEntered(MouseEvent e) {
}
/**
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
public void mouseExited(MouseEvent e) {
}
private void grow(int increment) {
model.setRangeProperties(model.getValue()-increment,
model.getExtent()+2*increment,
model.getMinimum(), model.getMaximum(), false);
}
/**
* @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
*/
public void keyPressed(KeyEvent e) {
int kc = e.getKeyCode();
boolean v = (orientation == VERTICAL);
boolean d = (kc == KeyEvent.VK_DOWN);
boolean u = (kc == KeyEvent.VK_UP);
boolean l = (kc == KeyEvent.VK_LEFT);
boolean r = (kc == KeyEvent.VK_RIGHT);
int minimum = getMinimum();
int maximum = getMaximum();
int lowValue = getLowValue();
int highValue = getHighValue();
if ( v&&r || !v&&u ) {
if ( lowValue-increment >= minimum &&
highValue+increment <= maximum ) {
grow(increment);
}
} else if ( v&&l || !v&&d ) {
if ( highValue-lowValue >= 2*increment ) {
grow(-1*increment);
}
} else if ( v&&d || !v&&l ) {
if ( lowValue-increment >= minimum ) {
offset(-increment);
}
} else if ( v&&u || !v&&r ) {
if ( highValue+increment <= maximum ) {
offset(increment);
}
}
}
/**
* @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
*/
public void keyReleased(KeyEvent e) {
}
/**
* @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
*/
public void keyTyped(KeyEvent e) {
}
} // end of class JRangeSlider
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?