2013-05-20 42 views
0

正如標題所暗示的,我正在嘗試複製JButton上主文本下面的文本,並將其向下移動一個像素。我試圖在它上面得到像下面的陰影效果,沒有模糊,並在文本正下方有一個像素。在JButton上投下陰影/重複文本

我該怎麼做,並且用一個actionListener而不是一個按鈕設置一個JPanel會更容易?

碼 -

import java.awt.Color; 
import java.awt.Component; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Insets; 
import java.awt.RenderingHints; 
import java.awt.Shape; 
import java.awt.geom.RoundRectangle2D; 

import javax.swing.ButtonModel; 
import javax.swing.JButton; 
import javax.swing.JFrame; 

class ButtonUI extends JButton { 

    private Color startColor = new Color(162, 110, 235); 
    private Color endColor = new Color(110, 49, 237); 
    private Color rollOverTopColor = new Color(171, 137, 219); 
    private Color rollOverBottomColor = new Color(129, 89, 216); 

    private Color pressedStartColor = new Color(73, 30, 113); 
    private Color pressedMidColor = new Color(113, 57, 221); 
    private Color pressedEndColor = new Color(93, 43, 198); 

    private Color outerBorderColor = new Color(117, 14, 182); 
    private Color innerBorderTopColor = new Color(178, 133, 237, 255); 
    private Color innerBorderBottomColor = new Color(178, 133, 237, 150); 

    /** 
    * @param top 
    *   , left, bottom, right 
    */ 
    private Insets insetsForButtons = new Insets(0, 13, 4, 13); 

    private int outerRoundRectSize = 4; 
    private int innerRoundRectSize = 2; 
    private GradientPaint GP; 

    /** 
    * 
    * @param text 
    */ 
    public ButtonUI(String text) { 
     super(); 
     setText(text); 
     setAlignmentX(Component.CENTER_ALIGNMENT); 
     setContentAreaFilled(false); 
     setBorderPainted(false); 
     setForeground(Color.WHITE); 
     setFocusable(false); 
     setMargin(insetsForButtons); 

    } 

    /** 
    * 
    * @param startColor 
    * @param endColor 
    * @param rollOverColor 
    * @param rollOverTopColor 
    * @param rollOverBottomColor 
    * @param pressedColor 
    * @param pressedTopColor 
    * @param pressedBottomColor 
    */ 
    public ButtonUI(Color startColor, Color endColor, Color rollOverTopColor, 
      Color rollOverBottomColor, Color pressedStartColor, 
      Color pressedMidColor, Color pressedEndColor) { 
     super(); 
     this.startColor = startColor; 
     this.endColor = endColor; 
     this.pressedStartColor = pressedStartColor; 
     this.pressedMidColor = pressedMidColor; 
     this.pressedEndColor = pressedEndColor; 

     setForeground(Color.WHITE); 
     setFocusable(false); 
     setContentAreaFilled(false); 
     setBorderPainted(false); 
    } 

    public void paintComponent(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
       RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     int h = getHeight(); 
     int w = getWidth(); 
     ButtonModel model = getModel(); 
     if (!model.isEnabled()) { 
      setForeground(Color.BLACK); 
      GP = new GradientPaint(0, 0, new Color(73, 30, 113), 0, h, 
        new Color(73, 30, 113), true); 
     } else { 
      setForeground(Color.WHITE); 
      if (model.isRollover()) { 
       GP = new GradientPaint(0, 0, rollOverTopColor, 0, h, 
         rollOverBottomColor, true); 
      } else { 
       GP = new GradientPaint(0, 0, startColor, 0, h, endColor, true); 
      } 
     } 
     g2d.setPaint(GP); 
     GradientPaint p1; 
     GradientPaint p2; 
     if (model.isPressed()) { 
      GP = new GradientPaint(0, 0, pressedStartColor, 0, h, 
        pressedMidColor, true); 
      g2d.setPaint(GP); 
      p1 = new GradientPaint(0, 0, outerBorderColor, 0, h - 1, 
        outerBorderColor); 

      // BE SURE TO EDIT TO MAKE LESS DRAMATIC 
      p2 = new GradientPaint(0, 1, innerBorderTopColor, 0, h - 3, 
        innerBorderTopColor); 
     } else { 
      p1 = new GradientPaint(0, 0, outerBorderColor, 0, h - 1, 
        outerBorderColor); 

      p2 = new GradientPaint(0, 1, innerBorderTopColor, 0, h - 3, 
        innerBorderBottomColor); 

      GP = new GradientPaint(0, 0, startColor, 0, h, endColor, true); 
     } 
     RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0, 0, w - 1, 
       h - 1, outerRoundRectSize, outerRoundRectSize); 
     Shape clip = g2d.getClip(); 
     g2d.clip(r2d); 
     g2d.fillRect(0, 0, w, h); 
     g2d.setClip(clip); 
     g2d.setPaint(p1); 
     g2d.drawRoundRect(0, 0, w - 1, h - 1, outerRoundRectSize, 
       outerRoundRectSize); 
     g2d.setPaint(p2); 
     g2d.drawRoundRect(1, 1, w - 3, h - 3, innerRoundRectSize, 
       innerRoundRectSize); 
     g2d.dispose(); 

     super.paintComponent(g); 
    } 
} 

public class ButtonClass { 

    public static void createGUI() { 
     JFrame programFrame = new JFrame("Custom Button UI"); 
     ButtonUI testButton = new ButtonUI("Custom JButton UI!"); 

     programFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     programFrame.add(testButton); 
     programFrame.pack(); 
     programFrame.setVisible(true); 
     programFrame.setResizable(true); 
     programFrame.setSize(250, 75); 
     programFrame.setLocationRelativeTo(null); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createGUI(); 
      } 
     }); 
    } 
} 

和往常一樣,如果你downvote這一點,解釋一下我可以做的更好,這樣就不會再發生了。

編輯:張貼我的覆蓋JButton類,這是我用我所有的按鈕,而不是爲每個按鈕。

回答

1

你需要解決兩個問題:

  • 一個按鈕的文本是由它的UI代理呈現;自定義ButtonUI顯示爲here

  • 下拉陰影可以呈現在任何方式的variety

附錄:不存在於您的更新的sscce,我不知道有什麼不工作,你所希望的方式。您可以嘗試使用Icon的實現來代替自定義UI委託,從而將文本呈現爲純文本或陰影。使用setRolloverIcon()方法,如here所示,根據需要更改圖標。這LayoutTest可能會幫助幾何。

+0

對不起,花了很長時間回覆,我已經完成了一些有關該程序的編輯。我會將源文件發佈到上面。可以將上述效果添加到上面的代碼中,對嗎? – Hathor

+0

我已經詳細闡述過了。 – trashgod

+0

使用SSCCE編輯。唯一不符合我想要的是複製當前文本下的文本,更改顏色並將其向下移動一個像素。 我不使用圖像的原因是因爲不是爲每個按鈕保存單獨的圖像,因此使用CustomUI委託可以獲得與更多控制大致相同的效果。 – Hathor