这是swing_example/JSliderExamples1。相信这个板块很多人都看过这个例子,小弟看了大半天硬是看不明白这个例子。希望大家帮忙说明下程序,最好能帮忙注释下那些重要的语句。
这个例子主要是6个java文件。MThumbSliderExample.java MThumbSlider.java
MetalMThumbSliderUI.java MThumbSliderAdditional.java MThumbSliderAdditionalUI.java
AssistantUIManager.java
下面把代码贴出来,希望大家帮帮忙,很多,分不够还可以再加。
/* (swing1.1.1) */
//package jp.gr.java_conf.tame.swing.examples;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import jp.gr.java_conf.tame.swing.slider.*;/**
 * @version 1.0 9/3/99
 */  
public class MThumbSliderExample extends JFrame {
  public MThumbSliderExample() {
    super("MThumbSlider Example");  
    
    JSlider slider = new JSlider();
    slider.putClientProperty( "JSlider.isFilled", Boolean.TRUE );      
    
    int n = 2;
    MThumbSlider mSlider = new MThumbSlider(n);
    mSlider.setValueAt(25, 0);                        
    mSlider.setValueAt(75, 1); 
    mSlider.setFillColorAt(Color.green,  0); 
    mSlider.setFillColorAt(Color.yellow, 1); 
    mSlider.setTrackFillColor(Color.red);
    mSlider.putClientProperty( "JSlider.isFilled", Boolean.TRUE );      
    
    getContentPane().setLayout(new FlowLayout());
    getContentPane().add(slider);
    getContentPane().add(mSlider);
  }  public static void main (String args[]) {
    MThumbSliderExample f = new MThumbSliderExample();
    f.addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
System.exit(0);
      }
    });
    f.setSize (300, 80);
    f.show();
  }
}
/* (swing1.1.1) */
package jp.gr.java_conf.tame.swing.slider;import java.awt.*;
import javax.swing.*;
import jp.gr.java_conf.tame.swing.plaf.*;/**
 * @version 1.0 09/08/99
 */
public class MThumbSlider extends JSlider {
  protected int thumbNum;
  protected BoundedRangeModel[] sliderModels;
  protected Icon[] thumbRenderers;
  protected Color[] fillColors;
  protected Color trackFillColor;
  
  private static final String uiClassID = "MThumbSliderUI";
  
  public MThumbSlider(int n) {
    createThumbs(n);    
    updateUI();
  }
  
  protected void createThumbs(int n) {
    thumbNum = n;
    sliderModels   = new BoundedRangeModel[n];    
    thumbRenderers = new Icon[n];
    fillColors = new Color[n];
    for (int i=0;i<n;i++) {
      sliderModels[i] = new DefaultBoundedRangeModel(50, 0, 0, 100);
      thumbRenderers[i] = null;
      fillColors[i] = null;
    }
  }
  
  
  public void updateUI() {
    AssistantUIManager.setUIName(this);
    super.updateUI();
        
    /*
    // another way
    //
    updateLabelUIs();    
    setUI(AssistantUIManager.createUI(this));
    //setUI(new BasicMThumbSliderUI(this));
    //setUI(new MetalMThumbSliderUI(this));
    //setUI(new MotifMThumbSliderUI(this));    
    */
  }
  
  public String getUIClassID() {
    return uiClassID;
  }
  
  
  public int getThumbNum() {
   return thumbNum;
  }
  
  public int getValueAt(int index) {
    return getModelAt(index).getValue(); 
  }
  
  public void setValueAt(int n, int index) {
    getModelAt(index).setValue(n); 
    // should I fire?
  }
  
  public int getMinimum() {
    return getModelAt(0).getMinimum(); 
  }
  
  public int getMaximum() {
    return getModelAt(0).getMaximum(); 
  }
  
  public BoundedRangeModel getModelAt(int index) {
    return sliderModels[index];
  }
  
  public Icon getThumbRendererAt(int index) {
    return thumbRenderers[index];
  }
  
  public void setThumbRendererAt(Icon icon, int index) {
    thumbRenderers[index] = icon;
  }
  
  public Color getFillColorAt(int index) {
    return fillColors[index];
  }
  
  public void setFillColorAt(Color color, int index) {
    fillColors[index] = color;
  }
  
  public Color getTrackFillColor() {
    return trackFillColor;
  }
  
  public void setTrackFillColor(Color color) {
    trackFillColor = color;
  }
}

解决方案 »

  1.   

    /* (swing1.1.1) */
    package jp.gr.java_conf.tame.swing.slider;import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.plaf.*;
    import javax.swing.plaf.metal.*;
    /**
     * @version 1.0 09/08/99
     */
    public class MetalMThumbSliderUI extends MetalSliderUI 
      implements MThumbSliderAdditional {  MThumbSliderAdditionalUI additonalUi;
      MouseInputAdapter mThumbTrackListener;
      
      public static ComponentUI createUI(JComponent c)    {
        return new MetalMThumbSliderUI((JSlider)c);
      }  
      public MetalMThumbSliderUI()   {
        //super(null);
      }
      
      public MetalMThumbSliderUI(JSlider b)   {
        //super(null);
      }  
      public void installUI(JComponent c)   {
        additonalUi = new MThumbSliderAdditionalUI(this);
        additonalUi.installUI(c);
        mThumbTrackListener = createMThumbTrackListener((JSlider) c);
        super.installUI(c);
      }
      
      public void uninstallUI(JComponent c) {
        super.uninstallUI(c);
        additonalUi.uninstallUI(c);
        additonalUi = null;
        mThumbTrackListener = null;
      }
      
      protected MouseInputAdapter createMThumbTrackListener( JSlider slider ) {
        return additonalUi.trackListener;
      }
        
      protected TrackListener createTrackListener( JSlider slider ) {
        return null;
      }
      
      protected ChangeListener createChangeListener( JSlider slider ) {
        return additonalUi.changeHandler;
      }  protected void installListeners( JSlider slider ) {
        slider.addMouseListener(mThumbTrackListener);
        slider.addMouseMotionListener(mThumbTrackListener);
        slider.addFocusListener(focusListener);
        slider.addComponentListener(componentListener);
        slider.addPropertyChangeListener( propertyChangeListener );
        slider.getModel().addChangeListener(changeListener);
      }  protected void uninstallListeners( JSlider slider ) {
        slider.removeMouseListener(mThumbTrackListener);
        slider.removeMouseMotionListener(mThumbTrackListener);
        slider.removeFocusListener(focusListener);
        slider.removeComponentListener(componentListener);
        slider.removePropertyChangeListener( propertyChangeListener );
        slider.getModel().removeChangeListener(changeListener);
      }  protected void calculateGeometry() {
        super.calculateGeometry();
        additonalUi.calculateThumbsSize();
        additonalUi.calculateThumbsLocation();
      }
      
      
      protected void calculateThumbLocation() {}
        
      
        
      
      Icon thumbRenderer;
      
      public void paint( Graphics g, JComponent c ) {
        Rectangle clip = g.getClipBounds();
        Rectangle[] thumbRects = additonalUi.getThumbRects();
        thumbRect = thumbRects[0];    
        int thumbNum = additonalUi.getThumbNum();
        
        if ( slider.getPaintTrack() && clip.intersects( trackRect ) ) {
          boolean filledSlider_tmp = filledSlider;
          filledSlider = false;
          paintTrack( g );
          filledSlider = filledSlider_tmp;
          
          if ( filledSlider ) {
            g.translate(  trackRect.x,  trackRect.y );
            
            Point t1 = new Point(0,0);
            Point t2 = new Point(0,0);
            Rectangle maxThumbRect = new Rectangle(thumbRect);
            thumbRect = maxThumbRect;
            
            if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
              t2.y = (trackRect.height - 1) - getThumbOverhang();
              t1.y = t2.y - (getTrackWidth() - 1);
              t2.x = trackRect.width - 1;
              int maxPosition = xPositionForValue(slider.getMaximum());
      thumbRect.x = maxPosition - (thumbRect.width / 2) -2;
      thumbRect.y = trackRect.y;
            }
            else {
              t1.x = (trackRect.width - getThumbOverhang()) - getTrackWidth();
              t2.x = (trackRect.width - getThumbOverhang()) - 1;
              t2.y = trackRect.height - 1;
              int maxPosition = yPositionForValue(slider.getMaximum());
      thumbRect.x = trackRect.x;
      thumbRect.y = maxPosition - (thumbRect.height / 2) -2;
            }   
            
            Color fillColor = ((MThumbSlider)slider).getTrackFillColor(); 
            if (fillColor == null) {
              fillColor = MetalLookAndFeel.getControlShadow();
            }
            fillTrack( g, t1, t2, fillColor);
            
            for (int i=thumbNum-1; 0<=i; i--) {
              thumbRect = thumbRects[i];
              fillColor = ((MThumbSlider)slider).getFillColorAt(i);
              if (fillColor == null) {
                fillColor = MetalLookAndFeel.getControlShadow();
              }
              fillTrack( g, t1, t2, fillColor);
            }
            
            g.translate( -trackRect.x, -trackRect.y );    
          }      
        }
        if ( slider.getPaintTicks() && clip.intersects( tickRect ) ) {
          paintTicks( g );
        }
        if ( slider.getPaintLabels() && clip.intersects( labelRect ) ) {
          paintLabels( g );
        }    
        
        for (int i=thumbNum-1; 0<=i; i--) {
          if ( clip.intersects( thumbRects[i] ) ) {
            thumbRect = thumbRects[i];
            thumbRenderer = ((MThumbSlider)slider).getThumbRendererAt(i);
            if (thumbRenderer == null) {
              if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
                thumbRenderer = horizThumbIcon;
              } else {
                thumbRenderer = vertThumbIcon;
              }
            }
            paintThumb( g );
          }
        }    
      }
      
      
      public void paintThumb(Graphics g) {     
        thumbRenderer.paintIcon( slider, g, thumbRect.x,     thumbRect.y );    
      }    
        public void fillTrack(Graphics g, Point t1, Point t2, Color fillColor) {
        //                               t1-------------------
        //                               |                   |
        //                               --------------------t2    
        int middleOfThumb = 0;
        
        if ( slider.getOrientation() == JSlider.HORIZONTAL ) {
          middleOfThumb = thumbRect.x + (thumbRect.width / 2) - trackRect.x;         
          if ( slider.isEnabled() ) {
            g.setColor(fillColor);        
            g.fillRect( t1.x+2,
        t1.y+2,
                middleOfThumb - t1.x -1,
        t2.y - t1.y -3);     
            g.setColor(fillColor.brighter());
            g.drawLine( t1.x+1, t1.y+1, middleOfThumb, t1.y+1 );
            g.drawLine( t1.x+1, t1.y+1, t1.x+1,        t2.y-2 );        
          } else {   
            g.setColor(fillColor);    
            g.fillRect( t1.x, 
        t1.y,
        middleOfThumb - t1.x +2,
        t2.y - t1.y );
          }
        }
        else {
          middleOfThumb = thumbRect.y + (thumbRect.height / 2) - trackRect.y;    
          if ( slider.isEnabled() ) {             
            g.setColor( slider.getBackground() );
    g.drawLine( t1.x+1, middleOfThumb, t2.x-2, middleOfThumb );
    g.drawLine( t1.x+1, middleOfThumb, t1.x+1, t2.y - 2 );
    g.setColor( fillColor );
    g.fillRect( t1.x + 2,
        middleOfThumb + 1,
        t2.x - t1.x -3,
        t2.y-2 -  middleOfThumb);
          } else {       
            g.setColor( fillColor );
    g.fillRect( t1.x,
        middleOfThumb +2,
                t2.x-1 - t1.x,
        t2.y - t1.y );
          }
        }
      }  
      
      public void scrollByBlock(int direction) {}
      public void scrollByUnit(int direction) {}
      
      
      //  
      //  MThumbSliderAdditional
      //
      public Rectangle getTrackRect() {
        return trackRect;
      }  
      public Dimension getThumbSize() {
        return super.getThumbSize();
      }  
      public int xPositionForValue(int value) {
        return super.xPositionForValue( value);
      }  
      public int yPositionForValue(int value) {
        return super.yPositionForValue( value);
      }
      
      }
      

  2.   

    加分也加不到?
    /* (swing1.1.1) */
    package jp.gr.java_conf.tame.swing.slider;import java.awt.*;
    /**
     * @version 1.0 09/08/99
     */
     //
     // MThumbSliderAdditionalUI <--> BasicMThumbSliderUI
     //                          <--> MetalMThumbSliderUI
     //                          <--> MotifMThumbSliderUI
     //
    public interface MThumbSliderAdditional {  public Rectangle getTrackRect();
      
      public Dimension getThumbSize();
      
      public int xPositionForValue(int value);
      
      public int yPositionForValue(int value);
      
    }/* (swing1.1.1) */
    package jp.gr.java_conf.tame.swing.slider;import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.plaf.*;
    import javax.swing.plaf.basic.*;/**
     * @version 1.0 09/08/99
     */
    public class MThumbSliderAdditionalUI {
      
      MThumbSlider  mSlider;
      BasicSliderUI ui;
      Rectangle[]   thumbRects;
      int           thumbNum;
      private transient boolean isDragging;
      Icon thumbRenderer;
      
      Rectangle trackRect;
      
      ChangeHandler changeHandler;
      TrackListener trackListener;
        
      public MThumbSliderAdditionalUI(BasicSliderUI ui)   {
        this.ui      = ui;
      }  
      public void installUI(JComponent c)   {
        mSlider    = (MThumbSlider)c;
        thumbNum   = mSlider.getThumbNum();
        thumbRects = new Rectangle[thumbNum];
        for (int i=0; i<thumbNum; i++) {
          thumbRects[i] = new Rectangle();
        }
        isDragging = false;
        trackListener = new MThumbSliderAdditionalUI.TrackListener(mSlider);
        changeHandler = new ChangeHandler();
      }
      
      public void uninstallUI(JComponent c) {
        thumbRects = null;
        trackListener = null;
        changeHandler = null;
      }
      
          
      protected void calculateThumbsSize() {
        Dimension size = ((MThumbSliderAdditional)ui).getThumbSize();
        for (int i=0; i<thumbNum; i++) {
          thumbRects[i].setSize( size.width, size.height );
        }
      }
      
        
      protected void calculateThumbsLocation() {
        for (int i=0; i<thumbNum; i++) {
          if ( mSlider.getSnapToTicks() ) {
            int tickSpacing = mSlider.getMinorTickSpacing();     
            if (tickSpacing == 0) {
              tickSpacing = mSlider.getMajorTickSpacing();
            }
            if (tickSpacing != 0) {      
              int sliderValue  = mSlider.getValueAt(i);           
              int snappedValue = sliderValue; 
              //int min = mSlider.getMinimumAt(i);                           
              int min = mSlider.getMinimum();                          
              if ( (sliderValue - min) % tickSpacing != 0 ) {
                float temp = (float)(sliderValue - min) / (float)tickSpacing;
                int whichTick = Math.round( temp );
                snappedValue = min + (whichTick * tickSpacing);            
                mSlider.setValueAt( snappedValue , i);           
              }
            }
          }
          trackRect = getTrackRect(); 
          if ( mSlider.getOrientation() == JSlider.HORIZONTAL ) {
            int value = mSlider.getValueAt(i);
            int valuePosition = ((MThumbSliderAdditional)ui).xPositionForValue(value);
            thumbRects[i].x = valuePosition - (thumbRects[i].width / 2);
            thumbRects[i].y = trackRect.y;
            
          } else {
            int valuePosition = ((MThumbSliderAdditional)ui).yPositionForValue(mSlider.getValueAt(i));     // need
            thumbRects[i].x = trackRect.x;
            thumbRects[i].y = valuePosition - (thumbRects[i].height / 2);
          }
        }
      }
      
        
      public int getThumbNum() {
        return thumbNum;
      }
      
      public Rectangle[] getThumbRects() {
        return thumbRects;
      }
      
      
       private static Rectangle unionRect = new Rectangle();
      
      public void setThumbLocationAt(int x, int y, int index)  { 
        Rectangle rect = thumbRects[index];  
        unionRect.setBounds( rect );
        
        rect.setLocation( x, y );
        SwingUtilities.computeUnion( rect.x, rect.y, rect.width, rect.height, unionRect ); 
        mSlider.repaint( unionRect.x, unionRect.y, unionRect.width, unionRect.height );
      }
      
      
      public Rectangle getTrackRect() {
        return ((MThumbSliderAdditional)ui).getTrackRect();
      }
      
      
      
      
      public class ChangeHandler implements ChangeListener {
        public void stateChanged(ChangeEvent e) {
          if ( !isDragging ) {
            calculateThumbsLocation();
    mSlider.repaint();
          }
        }
      }
      
      
      
      public class TrackListener extends MouseInputAdapter {
        protected transient int offset;
        protected transient int currentMouseX, currentMouseY;
        protected Rectangle adjustingThumbRect = null;
        protected int adjustingThumbIndex;
        protected MThumbSlider   slider;
        protected Rectangle trackRect;
        
        TrackListener(MThumbSlider slider) {
          this.slider = slider;
        }
      
        public void mousePressed(MouseEvent e) {
          if ( !slider.isEnabled() ) {
            return; 
          }
          currentMouseX = e.getX();
          currentMouseY = e.getY();
          slider.requestFocus();      for (int i=0; i<thumbNum; i++) {
            Rectangle rect = thumbRects[i];
            if ( rect.contains(currentMouseX, currentMouseY) ) {
              
              switch ( slider.getOrientation() ) {
                case JSlider.VERTICAL:
                     offset = currentMouseY - rect.y;
                     break;
                case JSlider.HORIZONTAL:
                     offset = currentMouseX - rect.x;
                     break;
              }
              isDragging = true;
              slider.setValueIsAdjusting(true);
              adjustingThumbRect = rect;
              adjustingThumbIndex = i;
              return;
            }
          }
        }
        
        public void mouseDragged( MouseEvent e ) {                    
          if ( !slider.isEnabled() 
                     || !isDragging 
                     || !slider.getValueIsAdjusting()
                     || adjustingThumbRect == null ) {
            return;
          }
          int thumbMiddle = 0;
          currentMouseX = e.getX();
          currentMouseY = e.getY();      Rectangle rect = thumbRects[adjustingThumbIndex];
          trackRect = getTrackRect();      
          switch ( slider.getOrientation() ) {
            case JSlider.VERTICAL:      
              int halfThumbHeight = rect.height / 2;
              int thumbTop    = e.getY() - offset;
              int trackTop    = trackRect.y;
              int trackBottom = trackRect.y + (trackRect.height - 1);          thumbTop = Math.max( thumbTop, trackTop    - halfThumbHeight );
              thumbTop = Math.min( thumbTop, trackBottom - halfThumbHeight );          setThumbLocationAt(rect.x, thumbTop, adjustingThumbIndex);          thumbMiddle = thumbTop + halfThumbHeight;
              mSlider.setValueAt( ui.valueForYPosition( thumbMiddle ) , adjustingThumbIndex);
              break;
              
            case JSlider.HORIZONTAL:
              int halfThumbWidth = rect.width / 2;
              int thumbLeft  = e.getX() - offset;
              int trackLeft  = trackRect.x;
              int trackRight = trackRect.x + (trackRect.width - 1);          thumbLeft = Math.max( thumbLeft, trackLeft  - halfThumbWidth );
              thumbLeft = Math.min( thumbLeft, trackRight - halfThumbWidth );          setThumbLocationAt( thumbLeft, rect.y, adjustingThumbIndex);          thumbMiddle = thumbLeft + halfThumbWidth;
              mSlider.setValueAt( ui.valueForXPosition( thumbMiddle ), adjustingThumbIndex );          
              break;
          }
        }
        
        public void mouseReleased(MouseEvent e) {
          if ( !slider.isEnabled() ) {
            return;
          }
          offset = 0;
          isDragging = false;
          mSlider.setValueIsAdjusting(false);
          mSlider.repaint();
        }    public boolean shouldScroll(int direction) {
          return false;
        }
        
      }
      
    }