2013-10-08 130 views
0

我想改變背景和前景動態刷卡,我使用下面的自定義按鈕。 按鈕樣式被設置爲默認值。 任何plz可以幫我嗎?JButton動態背景和前景變化

public class CustomButton extends JButton { 
     private int buttonStyle = JAVA_DEFAULT; 

    public static final int JAVA_DEFAULT  = 0; 
    public static final int SKINZ    = 1; 
    public static final int CLASSIC   = 2; 
    public static final int IMAGES   = 3; 
    public static final int ROLLOVER   = 4; 
    public static final int GRADIENCE   = 5; 
    public static final int JAVA_LIKE   = 6; // A java-look button with our own text handling. 

    public void paintComponent(Graphics g){ 
     // prep for painting. 
     Graphics2D g2D = (Graphics2D)g; 
     if(buttonStyle != 0 && buttonStyle != IMAGES){ 
     if(g == null) 
      return; 
     if(getBackground() == null) 
      setBackground(color); 
     if(getFadedBackgroundColor() == null) 
      setFadedBackgroundColor(Color.white); 

     g2D.clearRect(0, 0, getWidth()+getX(), getHeight()+getY()); 
     // end prep for painting. 
     } 
     switch (buttonStyle){ 
     case SKINZ: 
     paintSkinz(g2D); 
     return; 
     case IMAGES: 
     paintImages(g2D); 
     break; 
     case ROLLOVER: 
     System.err.println("Rollover look of CustomButton not yet implemented."); 
     break; 
     case JAVA_LIKE: 
     paintJavaLike(g2D); 
     return; 
     case GRADIENCE: 
     paintGradience(g2D); 
     case CLASSIC: 
     case JAVA_DEFAULT: 
     default: 
     super.paintComponent(g); 
     m_originalborder = getBorder(); 
     m_originalfont = getFont(); 
     return; 
     } 
     paintText(g2D,0,0,getWidth(),getHeight()); 
    } 

    private void paintJavaLike(Graphics2D g2D) 
    { 
     g2D.setColor(getBackground()); 
     g2D.fill3DRect(0,0,getWidth(),getHeight(),true); 
     if(getIcon()==null) 
     paintText(g2D,0,0,getWidth(),getHeight()); 
     else if (getText() == null || getText().length() == 0) 
     this.paintCenteredIcon(g2D, ((ImageIcon)getIcon()).getImage()); 
     else { 
     int w = getWidth() - getIconTextGap() - getIcon().getIconWidth() - (borderWidth*2)-4; 
     int h = getHeight()-(borderWidth*2); 
     g2D.drawImage(((ImageIcon)getIcon()).getImage(), 2, (getHeight()/2)-(getIcon().getIconHeight()/2), this); 
     paintText(g2D,2+getIcon().getIconWidth()+this.getIconTextGap(),0,w,h); 
     } 
    } 

    public void paintText(Graphics2D g2D, int offset_x, int offset_y, int width, int height) 
    { 
     int idx,x,y,strwidth,strwidth2=0, strHeight=0; 
     String myText,myText2=null; 
     Font myFont; 
     FontMetrics fm; 

     myText = getText(); 
     myFont = getFont(); 
     if (m_FontSize > 0 && myFont.getSize() != m_FontSize) 
     myFont = myFont.deriveFont((float)m_FontSize); 

     fm = g2D.getFontMetrics(myFont); 
     strwidth = fm.stringWidth(myText); 
     strHeight = fm.getAscent() + fm.getDescent(); 

     // Handle font scaling and line wrapping 
     if (strwidth > width || strHeight > height) 
     { 
     idx = myText.indexOf(' '); 

     // Only one word, shrink font to fit. 
     if (idx == -1) 
     { 
      if (m_FontSize == -1) 
      { 
      while((strwidth > width || strHeight > height) && myFont.getSize() > m_MinimumFontSize) 
      { 
       myFont = myFont.deriveFont((float)(myFont.getSize()-1)); 
       fm = g2D.getFontMetrics(myFont); 
       strwidth = fm.stringWidth(myText); 
       strHeight = fm.getAscent() + fm.getDescent(); 
      } 
      } else { 
      strwidth = fm.stringWidth(myText); 
      } 
     } 
     else // Multiple words 
     { 
      // Split words up. This could be enhanced in the future. 
      // Currently limited to two words split on the first space. 
      if (m_TextWrapOn) // Only if allowing text wrapping. 
      { 
      myText2 = myText.substring(idx+1); 
      myText = myText.substring(0,idx); 
      } 
      strwidth = fm.stringWidth(myText); 
      strwidth2 = fm.stringWidth(myText2); 
      strHeight = (fm.getAscent() + fm.getDescent()) * 2; // *2 lines. 
      if (m_FontSize == -1) 
      { 
      while((strwidth > width || strwidth2 > width || strHeight > height) && 
        myFont.getSize() > m_MinimumFontSize) 
      { 
       myFont = myFont.deriveFont((float)(myFont.getSize()-1)); 
       fm = g2D.getFontMetrics(myFont); 
       strwidth = fm.stringWidth(myText); 
       strwidth2 = fm.stringWidth(myText2); 
       strHeight = (fm.getAscent() + fm.getDescent()) * 2; // *2 lines. 
      } 
      } else { 
      strwidth = fm.stringWidth(myText); 
      strwidth2 = fm.stringWidth(myText2); 
      } 
     } 
     } 
     // Scale text larger 
     else if (strwidth < (width * 0.75)) { 
     if (m_FontSize == -1) 
     { 
      while((strwidth < (width * 0.8)) && (fm.getHeight() < height) && 
       myFont.getSize() < m_MaximumFontSize) 
      { 
      myFont = myFont.deriveFont((float)(myFont.getSize()+1)); 
      fm = g2D.getFontMetrics(myFont); 
      strwidth = fm.stringWidth(myText); 
      } 
     } else { 
      strwidth = fm.stringWidth(myText); 
     } 
     } 

     if (myText2 == null) 
     y = (height/2)+(fm.getMaxAscent()/2)+offset_y; 
     else 
     y = (height/2)-fm.getDescent()+offset_y; 
     if (y < fm.getAscent()) 
     y = fm.getAscent(); 
     if (y > height) 
     y = height;      // Don't put chars off bottom of button 
     if (buttonStyle == JAVA_LIKE && y == height) 
     y = height-2;     // subtract border 

     switch(getHorizontalAlignment()) 
     { 
     case SwingUtilities.LEFT: 
      x = 14 + offset_x; 
      break; 
     case SwingUtilities.RIGHT: 
      x = width-strwidth-14+offset_x; 
      break; 
     case SwingUtilities.CENTER: 
     default: 
      // the computations here are centering the text. 
      x = (width/2)-(strwidth/2)+offset_x; 
      break; 
     } 
     if (x < offset_x) x = offset_x; 
     if (this.buttonStyle == JAVA_LIKE && x < (offset_x+1)) x = offset_x+1; 

     // go ahead and draw text. 
     // prep for painting text 
     if (model.isPressed()) 
     g2D.setColor(getBackground()); 
     else 
     g2D.setColor(getForeground()); 
     g2D.setFont(myFont); 
     g2D.drawString(myText, x, y); 

     if (myText2 != null) 
     { 
     y = (height/2)+fm.getHeight()-fm.getDescent()+offset_y; 
     switch(getHorizontalAlignment()) 
     { 
      case SwingUtilities.LEFT: 
      // the computations here are centering the text. 
      x = borderWidth + getIconTextGap() + offset_x; 
      break; 
      case SwingUtilities.RIGHT: 
      // the computations here are centering the text. 
      x = width-strwidth2-(borderWidth+getIconTextGap())+offset_x; 
      break; 
      case SwingUtilities.CENTER: 
      default: 
      // the computations here are centering the text. 
      x = (width/2)-(strwidth2/2)+offset_x; 
      break; 
     } 
     if (x < offset_x) x = offset_x; 
     g2D.drawString(myText2, x, y); 
     } 
    } 

    public void paintOffCenterIcon(Graphics2D g2D, Image image){ 
     int w = getIcon().getIconWidth(); 
     int h = getIcon().getIconHeight(); 
     g2D.drawImage(image, (getWidth()/2)-(w/2)+2 , (getHeight()/2)-(h/2)+2, this); 
    } 

    public void paintCenteredIcon(Graphics2D g2D, Image image){ 
     int w = getIcon().getIconWidth(); 
     int h = getIcon().getIconHeight(); 
     g2D.drawImage(image, (getWidth()/2)-(w/2), (getHeight()/2)-(h/2), this); 
    } 

    public void paintGradience(Graphics2D g2D) 
    { 
     GradientPaint gradientp; 
     switch(m_shape){ 
     case RECTANGLE: 
     //stuff for round rectangles 
     gradientp = new GradientPaint(m_X1, m_Y1, getBackground(), 
      m_X2, m_Y2, getFadedBackgroundColor()); 
     g2D.setPaint(gradientp); 
     g2D.fillRoundRect(0, 0, getWidth(), getHeight(), arc, arc); 
     break; 
     case OVAL: 
     //stuff for ovals 
     gradientp = new GradientPaint(m_X1, m_Y1, getBackground(), 
      m_X2, m_Y2, getFadedBackgroundColor()); 
     g2D.setPaint(gradientp); 
     g2D.fillOval(0, 0, getWidth(), getHeight()); 
     break; 
     case POLYGON: 
     // stuff for triangles 
     int xs[] = {0, (int)m_X2, (int)m_Y2}; 
     int ys[] = {0, (int)m_X2/2, (int)m_Y2}; 
     g2D.fillPolygon(xs , ys, 3); 
     break; 
     } 
    } 

    public void paintSkinz(Graphics2D g2D){ 
     m_shape = RECTANGLE; //just for clarity's sake. 

     if(getModel().isPressed()){ 
     beveledPressed(g2D); 
     g2D.setClip(null); 
     return; 
     } 
     else if(!getModel().isPressed()){ 
     beveledUnpressed(g2D); 
     g2D.setClip(null); 
     } 
    } 

    public void paintImages(Graphics2D g2D){ 
     m_shape = RECTANGLE; //just for clarity's sake. 
     Icon icon; 

     if(getModel().isPressed()){ 
     icon = getPressedIcon(); 
     if(icon!=null) 
      paintCenteredIcon(g2D, ((ImageIcon)icon).getImage()); 
     g2D.setClip(null); 
     return; 
     } 
     else if(!getModel().isPressed()){ 
     icon = getIcon(); 
     if(icon!=null) 
      paintCenteredIcon(g2D, ((ImageIcon)icon).getImage()); 
     g2D.setClip(null); 
     } 
    } 

    public void setPreferredSize(Dimension prefSz) 
    { 
     m_PreferredSize = prefSz; 
     super.setPreferredSize(prefSz); 
    } 

    public Dimension getPreferredSize() 
    { 
     if (m_PreferredSize != null) 
     return m_PreferredSize; 
     int insets = borderWidth*2 + 4;  // initial border width and insets; 
     switch (buttonStyle) 
     { 
     case JAVA_LIKE: 
      int width = insets; 
      int height = insets; 
      if (this.getGraphics() == null || this.getGraphics().getFontMetrics() == null) // safety net 
      return super.getPreferredSize(); 
      if (this.getText() != null) 
      { 
      width += this.getGraphics().getFontMetrics().stringWidth(getText()); 
      height += this.getGraphics().getFontMetrics().getHeight(); 
      } 
      if (this.getIcon() != null) 
      { 
      width += getIcon().getIconWidth(); 
      if (getText() != null) 
       width += this.getIconTextGap(); 
      if (height < (getIcon().getIconHeight()+insets)) 
       height = getIcon().getIconHeight(); 
      } 
      return new Dimension(width,height); 
     case SKINZ: 
     case CLASSIC: 
     case IMAGES: 
     case ROLLOVER: 
     case GRADIENCE: 
     case JAVA_DEFAULT: 
     default: 
      return super.getPreferredSize(); 
     } 
    } 

    void dButtonStateChanged(ChangeEvent e) 
    { 
     // Call 'super' methods in here. Don't call the overriden versions. 
     if (this.getModel().isRollover()) 
     { 
      if (rolloverBackground != null) 
       super.setBackground(rolloverBackground); 
      if (rolloverForeground != null) 
       super.setForeground(rolloverForeground); 
      if (rolloverFont != null) 
       super.setFont(rolloverFont); 
     } 
     else 
     { 
      super.setBackground(normalBackground); 
      super.setForeground(normalForeground); 
      super.setFont(normalFont); 
     } 
    } // end dButtonStateChanged() 


    protected void fireActionPerformed(ActionEvent event) 
    { 
     if (event != null) 
     super.fireActionPerformed(event); 
     if (m_Key != null) 
     { 
     // just a hack to get this working with the Java Client. 
     if (m_ui == null){ 
      m_ui = getClientUI(); 
     } // end hack. 

     } 
    } 

    void jbInit() 
    { 
     setBackground(color); // sets default bg color. 
     setForeground(Color.black); //sets default foreground to black 
     if(buttonStyle != JAVA_DEFAULT) 
     setBorder(null); 

     enableEvents(MouseEvent.MOUSE_EVENT_MASK); 
     enableEvents(FocusEvent.FOCUS_EVENT_MASK); 
     enableEvents(ActionEvent.ACTION_EVENT_MASK); 
     enableEvents(KeyEvent.KEY_EVENT_MASK); 

     // Sets up a listener for state changes on this button. 
     this.getModel().addChangeListener(new ChangeListener() 
     { 
      public void stateChanged(ChangeEvent e) 
     { 
      dButtonStateChanged(e); 
     } 
     }); 
    } // end jbInit() 

    protected void processMouseEvent(MouseEvent e) 
    { 
     switch(e.getID()) { 
     // these are for future development. 
     case MouseEvent.MOUSE_ENTERED: 
     case MouseEvent.MOUSE_EXITED: 
     super.processMouseEvent(e); 
     break; 
     case MouseEvent.MOUSE_RELEASED: 
     case MouseEvent.MOUSE_CLICKED: 
     e.consume(); 
     break; 
     case MouseEvent.MOUSE_PRESSED: 
     // we call doClick() b/c we may not get a MOUSE_RELEASED event with a 
     // touchscreen so we need to make sure it gets sent, and the doClick() 
     // method does that. 
     doClick(80); 
     e.consume(); 
     break; 
     } 
    } 


    protected void processFocusEvent(FocusEvent e) 
    { 
     super.processFocusEvent(e); 
     switch (e.getID()) 
     { 
     case FocusEvent.FOCUS_LOST: 
     //if (m_ui != null) 
     // m_ui.getFieldManager().setCurrentField(null); 
     break; 
     case FocusEvent.FOCUS_GAINED: 
     if (m_ui != null) 
      m_ui.getFieldManager().setCurrentField(this); // Tell manager I got the focus. 
     break; 
     } 
    } 

    private void beveledUnpressed(Graphics2D g){ 
     // so, we've got a hashtable of images we've drawn. We'll try to get this image out or it. 
     BufferedImage bi = (BufferedImage)m_imagetable.get("UnPressed."+"SKINZ"+"."+ 
          getBackground().toString()+"."+getSize().toString()); 
     Graphics2D g2D; 

     int w = getWidth(); 
     int h = getHeight(); 
     //define some border sizes 
     /* 
     * todo: fix this, i don't like this being hardcoded. 
     * */ 
     if(borderWidth == 0) 
     borderWidth = 10; 
     int borderheight = borderWidth; 
     Rectangle innerRect = new Rectangle(borderWidth, borderheight, w-(borderWidth*2), h-(borderheight*2)); 

     // if we didn't find this image in the hashtable, we'll draw the image. 
     if(bi == null){ 
     bi = (BufferedImage) createImage(getWidth(), getHeight()); 
     g2D = bi.createGraphics(); 

     Color shadowcolor = getBackground().darker(); 
     // would like to have gotten lightcolor with the brighter() method, but that 
     // method doesn't always produce a color different from the original color. 
     Color lightcolor = Color.white; 

     //sets of polygon points 
     int leftXpoints[] = {0, borderWidth, borderWidth, 0}; 
     int leftYpoints[] = {0, borderheight, h-borderheight, h}; 
     int topXpoints[] = {0, w, w-borderWidth, borderWidth}; 
     int topYpoints[] = {0, 0, borderheight, borderheight}; 
     int rightXpoints[] = {w, w, w-borderWidth, w-borderWidth}; 
     int rightYpoints[] = {0, h, h-borderheight, borderheight}; 
     int bottomXpoints[] = {borderWidth, w-borderWidth, w, 0}; 
     int bottomYpoints[] = {h-borderheight, h-borderheight, h, h}; 

     //define polys 
     Polygon leftpoly = new Polygon(leftXpoints, leftYpoints, 4); 
     Polygon toppoly = new Polygon(topXpoints, topYpoints, 4); 
     Polygon rightpoly = new Polygon(rightXpoints, rightYpoints, 4); 
     Polygon bottompoly = new Polygon(bottomXpoints, bottomYpoints, 4); 

     //draw the right-hand beveled edge 
     g2D.setClip(rightpoly); 
     GradientPaint p = new GradientPaint(w-borderWidth, 0, getBackground(), 
      w, 0, shadowcolor); 
     g2D.setPaint(p); 
     g2D.fillRoundRect(0, 0, w, h, arc, arc); 

     //draw the bottom-hand beveled edge 
     g2D.setClip(bottompoly); 
     p = new GradientPaint(0, h-borderheight, 
           getBackground(), 0, 
           h, shadowcolor); 
     g2D.setPaint(p); 
     g2D.fillRoundRect(0, 0, w, h, arc, 
          arc); 

     //draw the left-hand beveled edge 
     g2D.setClip(leftpoly); 
     p = new GradientPaint(0, 0, 
           lightcolor, borderWidth, 
           0, getBackground()); 
     g2D.setPaint(p); 
     g2D.fillRoundRect(0, 0, w, h, arc, 
          arc); 

     //draw the top-hand beveled edge 
     g2D.setClip(toppoly); 
     p = new GradientPaint(0, 0, 
           lightcolor, 0, 
           borderheight, getBackground()); 
     g2D.setPaint(p); 
     g2D.fillRoundRect(0, 0, w, h, arc, 
          arc); 

     //now draw inner rectangle 
     g2D.setClip(innerRect); 
     g2D.setColor(getBackground()); 
     g2D.fill(innerRect); 

     g.drawImage(bi, null, getX(), getY()); 
     // we only want to draw each image once, so we'll throw this image in the hash table. 
     m_imagetable.put("UnPressed."+"SKINZ"+"."+getBackground().toString()+"."+getSize().toString(), bi); 
     } 
     else { 
     g2D = (Graphics2D)bi.getGraphics(); 
     } 

     g.drawImage(bi, 0, 0, this); 

     innerRect.x -=6; 
     innerRect.width += 12; 
     g.setClip(innerRect); 

     // icons take precedence over text. 
     if(getIcon()==null) 
     paintText(g,innerRect.x,innerRect.y,innerRect.width,innerRect.height); 
     else 
     paintCenteredIcon(g, ((ImageIcon)getIcon()).getImage()); 
    } 


    private void beveledPressed(Graphics2D g){ 
     // so, we've got a hashtable of images we've drawn. We'll try to get this image out or it. 
     BufferedImage bi = (BufferedImage)m_imagetable.get("Pressed."+"SKINZ"+"."+ 
          getBackground().toString()+"."+getSize().toString()); 
     Graphics2D g2D; 

     int w = getWidth(); 
     int h = getHeight(); 
     //define some border sizes 
     /* 
     * todo: fix this, i don't like this being hardcoded. 
     * */ 
     if(borderWidth == 0) 
     borderWidth = 10; 
     int borderheight = borderWidth; 
     Rectangle innerRect = new Rectangle(borderWidth, borderheight, w-(borderWidth*2), h-(borderheight*2)); 

     // if we didn't find this image in the hashtable, we'll draw the image. 
     if(bi == null){ 
     bi = (BufferedImage) createImage(getWidth(), getHeight()); 
     g2D = bi.createGraphics(); 

     Color shadowcolor = getBackground().darker(); 
     // would like to have gotten lightcolor with the brighter() method, but that 
     // method doesn't always produce a color different from the original color. 
     Color lightcolor = Color.white; 

     //sets of polygon points 
     int leftXpoints[] = {0, borderWidth, borderWidth, 0}; 
     int leftYpoints[] = {0, borderheight, h-borderheight, h}; 
     int topXpoints[] = {0, w, w-borderWidth, borderWidth}; 
     int topYpoints[] = {0, 0, borderheight, borderheight}; 
     int rightXpoints[] = {w, w, w-borderWidth, w-borderWidth}; 
     int rightYpoints[] = {0, h, h-borderheight, borderheight}; 
     int bottomXpoints[] = {borderWidth, w-borderWidth, w, 0}; 
     int bottomYpoints[] = {h-borderheight, h-borderheight, h, h}; 

     //define polys 
     Polygon leftpoly = new Polygon(leftXpoints, leftYpoints, 4); 
     Polygon toppoly = new Polygon(topXpoints, topYpoints, 4); 
     Polygon rightpoly = new Polygon(rightXpoints, rightYpoints, 4); 
     Polygon bottompoly = new Polygon(bottomXpoints, bottomYpoints, 4); 

     //draw the right-hand beveled edge 
     g2D.setClip(rightpoly); 
     GradientPaint p = new GradientPaint(w-borderWidth, 0, getForeground(), 
      w, 0, shadowcolor); 
     g2D.setPaint(p); 
     g2D.fillRoundRect(0, 0, w, h, arc, arc); 

     //draw the bottom-hand beveled edge 
     g2D.setClip(bottompoly); 
     p = new GradientPaint(0, h-borderheight, 
           getForeground(), 0, 
           h, shadowcolor); 
     g2D.setPaint(p); 
     g2D.fillRoundRect(0, 0, w, h, arc, 
          arc); 

     //draw the left-hand beveled edge 
     g2D.setClip(leftpoly); 
     p = new GradientPaint(0, 0, 
           lightcolor, borderWidth, 
           0, getForeground()); 
     g2D.setPaint(p); 
     g2D.fillRoundRect(0, 0, w, h, arc, 
          arc); 

     //draw the top-hand beveled edge 
     g2D.setClip(toppoly); 
     p = new GradientPaint(0, 0, 
           lightcolor, 0, 
           borderheight, getForeground()); 
     g2D.setPaint(p); 
     g2D.fillRoundRect(0, 0, w, h, arc, 
          arc); 

     //now draw inner rectangle 
     g2D.setClip(innerRect); 
     g2D.setColor(getForeground()); 
     g2D.fill(innerRect); 

     g.drawImage(bi, null, getX(), getY()); 
       m_imagetable.put("Pressed."+"SKINZ"+"."+getBackground().toString()+"."+getSize().toString(), bi); 
     } 
     else { 
     g2D = (Graphics2D)bi.getGraphics(); 
     } 

     g.drawImage(bi, 0, 0, this); 

     innerRect.x -=6; 
     innerRect.width += 12; 
     g.setClip(innerRect); 

     // icons take precedence over text. 
     if(getIcon()==null) 
     paintText(g,innerRect.x,innerRect.y,innerRect.width,innerRect.height); 
     else 
     paintCenteredIcon(g, ((ImageIcon)getIcon()).getImage()); 
    } 


    public void setButtonStyle(int style){ 
     switch (style) { 
     case SKINZ: 
     case IMAGES: 
      setFont(m_originalfont);//new Font("Dialog", Font.BOLD, 20)); 
      setBorder(null); 
     break; 
     case JAVA_LIKE: 
     setBorderWidth(2); 
     case JAVA_DEFAULT: 
     case CLASSIC: 
     case ROLLOVER: 
     default: 
     setBorder(m_originalborder); 
     setFont(m_originalfont); 
     break; 
     } 
     buttonStyle = style; 
    } 

} 

任何建議使用相同的上述代碼來改變顏色? 感謝 Palanisamy

回答

1
  • 我想重寫BasicButtonUI是更好的和最簡單的方式,大部分的變化是不是外觀和感覺敏感,

  • 你可以決定要覆蓋其中的方法之一或保持不變,原因是在JButton,ButtonModel,ButtonGroups API中實施的每種方法的工作原理與Swing Team針對標準(un_touched)一樣實施JButton

  • MetalButtonUI的示例

+0

我一路走下去支持HTML格式。有什麼方法可以保持按鈕的HTML支持?默認情況下爲 – user1280096

+0

JButton接受Html <= 3.2v,減少了對css的支持 – mKorbel

+0

我通過使用下面的代碼實現了前後滑動。但html不支持。 // paint foreground //g.setColor(foregroundColor); (float)c.getHeight()/(float)2,foregroundColor,0.0F,c.getHeight(),foregroundColor); g2D.setPaint(gradient4); String s =((JButton)c).getText(); x = I.left; y = i.top + fm.getAscent(); g.drawString(s,x,y); //super.paint(g,c); – user1280096