📄 gauge.java
字号:
* @throws IllegalArgumentException if maxValue is not positive for interactive gauges * or if maxValue is neither positive nor INDEFINITE for non-interactive gauges * or if initialValue is not one of CONTINUOUS_IDLE, INCREMENTAL_IDLE, CONTINUOUS_RUNNING, or INCREMENTAL_UPDATING for a non-interactive gauge with indefinite range * @see #INDEFINITE * @see #CONTINUOUS_IDLE * @see #INCREMENTAL_IDLE * @see #CONTINUOUS_RUNNING * @see #INCREMENTAL_UPDATING */ public Gauge( String label, boolean interactive, int maxValue, int initialValue, Style style ) { super( label, Item.LAYOUT_DEFAULT, Item.PLAIN, style ); // check values: //#ifndef polish.skipArgumentCheck if (interactive) { if (maxValue < 0 ) { //#ifdef polish.debugVerbose throw new IllegalArgumentException("Invalid maxValue for interactive Gauge: " + maxValue ); //#else //# throw new IllegalArgumentException(); //#endif } if (initialValue < 0 || initialValue > maxValue) { //#ifdef polish.debugVerbose throw new IllegalArgumentException("Invalid initialValue for interactive Gauge: " + initialValue ); //#else //# throw new IllegalArgumentException(); //#endif } } else { if (maxValue == INDEFINITE) { this.isIndefinite = true; this.maxValue = 20; if ( !( initialValue == CONTINUOUS_IDLE || initialValue == CONTINUOUS_RUNNING || initialValue == INCREMENTAL_IDLE || initialValue == INCREMENTAL_UPDATING ) ) { //#ifdef polish.debugVerbose throw new IllegalArgumentException("Invalid initialValue for indefinite Gauge: " + initialValue ); //#else //# throw new IllegalArgumentException(); //#endif } } else if (maxValue < 0 ) { //#ifdef polish.debugVerbose throw new IllegalArgumentException("Invalid maxValue for Gauge: " + maxValue ); //#else //# throw new IllegalArgumentException(); //#endif } else if (initialValue < 0 || initialValue > maxValue) { //#ifdef polish.debugVerbose throw new IllegalArgumentException("Invalid initialValue for Gauge: " + initialValue ); //#else //# throw new IllegalArgumentException(); //#endif } } //#endif // set values this.isInteractive = interactive; if (interactive) { this.appearanceMode = Item.INTERACTIVE; } this.maxValue = maxValue; this.isIndefinite = (maxValue == INDEFINITE); setValue( initialValue ); } /** * Sets the current value of this <code>Gauge</code> object. * * <p>If the gauge is interactive, or if it is non-interactive with * definite range, the following rules apply. If the value is less than * zero, zero is used. If the current value is greater than the maximum * value, the current value is set to be equal to the maximum value. </p> * * <p> If this <code>Gauge</code> object is a non-interactive * gauge with indefinite * range, then value must be one of <code>CONTINUOUS_IDLE</code>, * <code>INCREMENTAL_IDLE</code>, <code>CONTINUOUS_RUNNING</code>, or * <code>INCREMENTAL_UPDATING</code>. * Other values will cause an exception to be thrown.</p> * * @param value the new value * @throws IllegalArgumentException if value is not one of CONTINUOUS_IDLE, INCREMENTAL_IDLE, CONTINUOUS_RUNNING, or INCREMENTAL_UPDATING for non-interactive gauges with indefinite range * @see #INDEFINITE * @see #CONTINUOUS_IDLE * @see #INCREMENTAL_IDLE * @see #CONTINUOUS_RUNNING * @see #INCREMENTAL_UPDATING */ public void setValue(int value) { if (this.isIndefinite) { if (this.value == CONTINUOUS_RUNNING ) { // when the value WAS continuous-running, remove this gauge from // the animations: Screen scr = getScreen(); if (scr != null) { scr.gauge = null; } } if (value == CONTINUOUS_IDLE) { this.indefinitePos = 0; } else if (value == CONTINUOUS_RUNNING){ Screen scr = getScreen(); if (scr != null) { scr.gauge = this; } } else if ( value == INCREMENTAL_IDLE ) { this.indefinitePos = 0; } else if ( value == INCREMENTAL_UPDATING ) { this.indefinitePos++; if (this.indefinitePos > this.maxValue ) { this.indefinitePos = 0; } } else { //#ifdef polish.debugVerbose throw new IllegalArgumentException("Invalid value for indefinite Gauge: " + value ); //#else //# throw new IllegalArgumentException(); //#endif } } else if (value < 0 ) { value = 0; } else if (value > this.maxValue) { value = this.maxValue; } this.value = value; this.valueString = "" + value; if (this.isInitialised) { if (this.isIndefinite) { updateIndefiniteIndicatorImage(); } else if (this.image == null){ createIndicatorImage(); } } if (this.isInitialised) { repaint(); } } /** * Calculates the position of the indicator and creator the appropriate image. * This method must not be called when the gauge has not yet been initialised. */ private void createIndicatorImage() { int percentage = (this.value * 100) / this.maxValue; int position = (percentage * (this.contentWidth - this.valueWidth)) / 100; if (position == 0) { position = 1; } this.indicatorImage = Image.createImage( position, this.contentHeight ); Graphics g = this.indicatorImage.getGraphics(); if (this.image != null) { int imageWidth = this.image.getWidth(); int x = 0; while ( x < position ) { g.drawImage(this.image, x, 0, Graphics.TOP | Graphics.LEFT ); x += imageWidth; } } else if (this.mode == MODE_CHUNKED) { /* if (this.chunkWidth == 0) { int spacePerChunk = this.contentWidth / this.maxValue; if (spacePerChunk > 5) { this.gapWidth = 3; this.chunkWidth = spacePerChunk - this.gapWidth; } else { } } */ // paint the filling: g.setColor( this.color ); g.fillRect( 0, 0, position, this.contentHeight ); // paint the gaps: g.setColor( this.gapColor ); int x = this.chunkWidth; while (x < position) { g.fillRect( x, 0, this.gapWidth, this.contentHeight ); x += this.gapWidth + this.chunkWidth; } } else { // mode == CONTINUOUS g.setColor( this.color ); g.fillRect( 0, 0, position, this.contentHeight ); } } /** * Updates the indicator image for an indefinite gauge. */ private void updateIndefiniteIndicatorImage() { Graphics g = this.indicatorImage.getGraphics(); if (this.value == CONTINUOUS_IDLE || this.value == INCREMENTAL_IDLE) { g.setColor( this.gapColor ); g.fillRect( 0, 0, this.contentWidth, this.contentHeight ); } else if (this.value == CONTINUOUS_RUNNING ) { if (this.image != null) { g.setColor( this.color ); g.fillRect( 0, 0, this.contentWidth, this.contentHeight ); g.drawImage( this.image, this.indefinitePos, 0, Graphics.TOP | Graphics.LEFT ); } else { g.setColor( this.color ); g.fillRect( 0, 0, this.contentWidth, this.contentHeight ); g.setColor( this.gapColor ); int cWidth = this.chunkWidth + this.gapWidth; int x = this.indefinitePos - cWidth; while (x < this.contentWidth) { g.fillRect( x, 0, this.gapWidth, this.contentHeight ); x += cWidth; } } } else { // value == INCREMENTAL_UPDATE int percentage = (this.indefinitePos * 100) / this.maxValue; int position = (percentage * this.contentWidth) / 100; if (this.image != null) { g.setColor( this.color ); g.fillRect( 0, 0, this.contentWidth, this.contentHeight ); int imageWidth = this.image.getWidth(); int x = 0; while (x < position) { g.drawImage( this.image, x, 0, Graphics.TOP | Graphics.LEFT ); x += imageWidth; } } else { g.setColor( this.gapColor ); g.fillRect( 0, 0, this.contentWidth, this.contentHeight ); g.setColor( this.color ); int cWidth = this.chunkWidth + this.gapWidth; int x = 0; while (x < position) { g.fillRect( x, 0, this.chunkWidth, this.contentHeight ); x += cWidth; } } } } /** * Gets the current value of this <code>Gauge</code> object. * * <p> If this <code>Gauge</code> object is a non-interactive * gauge with indefinite * range, the value returned will be one of <code>CONTINUOUS_IDLE</code>, * <code>INCREMENTAL_IDLE</code>, <code>CONTINUOUS_RUNNING</code>, or * <code>INCREMENTAL_UPDATING</code>. Otherwise, it will be an integer * between zero and the gauge's maximum value, inclusive.</p> * * @return current value of the Gauge * @see #INDEFINITE * @see #CONTINUOUS_IDLE * @see #INCREMENTAL_IDLE * @see #CONTINUOUS_RUNNING * @see #INCREMENTAL_UPDATING */ public int getValue() { return this.value; } /** * Sets the maximum value of this <code>Gauge</code> object. * * <p>For interactive gauges, the new maximum value must be greater than * zero, otherwise an exception is thrown. For non-interactive gauges, * the new maximum value must be greater than zero or equal to the special * value <code>INDEFINITE</code>, otherwise an exception is thrown. </p> * * <p>If the new maximum value is greater than zero, this provides the * gauge with a definite range. If the gauge previously had a definite * range, and if the current value is greater than new maximum value, the * current value is set to be equal to the new maximum value. If the * gauge previously had a definite range, and if the current value is less * than or equal to the new maximum value, the current value is left * unchanged. </p> * * <p>If the new maximum value is greater than zero, and if the gauge had * previously had indefinite range, this new maximum value provides it * with a definite range. Its graphical representation must change * accordingly, the previous state of <code>CONTINUOUS_IDLE</code>, * <code>INCREMENTAL_IDLE</code>, <code>CONTINUOUS_RUNNING</code>, or * <code>INCREMENTAL_UPDATING</code> is ignored, and the current value * is set to zero. </p> * * <p>If this gauge is non-interactive and the new maximum value is * <code>INDEFINITE</code>, this gives the gauge indefinite range. * If the gauge * previously had a definite range, its graphical representation must * change accordingly, the previous value is ignored, and the current * state is set to <code>CONTINUOUS_IDLE</code>. If the gauge previously * had an indefinite range, setting the maximum value to * <code>INDEFINITE</code> will have no effect. </p> * * @param maxValue the new maximum value * @throws IllegalArgumentException if maxValue is invalid * @see #INDEFINITE * @see #getMaxValue() */ public void setMaxValue(int maxValue) { this.isInitialised = false; if (maxValue == INDEFINITE) { this.isIndefinite = true; //#ifndef polish.skipArgumentCheck } else if (maxValue < 0) { //#ifdef polish.verboseDebug throw new IllegalArgumentException("Invalid maxValue for Gauge: " + maxValue ); //#else //# throw new IllegalArgumentException(); //#endif //#endif } this.maxValue = maxValue; this.isInitialised = false; } /** * Gets the maximum value of this <code>Gauge</code> object. * * <p>If this gauge is interactive, the maximum value will be a positive * integer. If this gauge is non-interactive, the maximum value will be a * positive integer (indicating that the gauge has definite range) * or the special value <code>INDEFINITE</code> (indicating that * the gauge has indefinite range).</p> * * @return the maximum value of the Gauge, or INDEFINITE * @see #INDEFINITE * @see #setMaxValue(int) */ public int getMaxValue() { return this.maxValue; } /** * Tells whether the user is allowed to change the value of the * <code>Gauge</code>. * * @return a boolean indicating whether the Gauge is interactive */ public boolean isInteractive() { return this.isInteractive; } /* (non-Javadoc) * @see de.enough.polish.ui.Item#paint(int, int, javax.microedition.lcdui.Graphics) */ public void paintContent(int x, int y, int leftBorder, int rightBorder, Graphics g) { if (this.showValue && this.isValueLeft) { g.setFont( this.font ); g.setColor( this.fontColor ); g.drawString( this.valueString, x, y, Graphics.TOP | Graphics.LEFT ); x += this.valueWidth; } //#ifdef polish.css.gauge-inactive-image if (this.inactiveImage != null) { g.drawImage(this.inactiveImage, x, y + this.imageYOffset, Graphics.TOP | Graphics.LEFT ); } //#endif if (this.isIndefinite) { if (this.image != null) { g.drawImage( this.image, x + this.indefinitePos, y + this.imageYOffset, Graphics.TOP | Graphics.LEFT ); } else { g.drawImage(this.indicatorImage, x, y + this.imageYOffset, Graphics.TOP | Graphics.LEFT ); } } else if (this.image != null) { //#if polish.css.gauge-button-image if (this.value != 0 || this.useImageAsButton) { //#else //# if (this.value != 0) { //#endif //#if polish.css.gauge-button-image //#if polish.css.gauge-slider-image if (this.sliderImage != null) { g.drawImage(this.sliderImage, x, y + this.contentHeight / 2, Graphics.LEFT | Graphics.VCENTER); } //#endif if (this.useImageAsButton) { int xPos = (this.sliderWidth * this.value) / this.maxValue; g.drawImage( this.image, x + xPos, y + this.imageYOffset, Graphics.LEFT | Graphics.TOP );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -