如何将标签绘制到自定义JButton上?

时间:2013-06-01 14:41:15

标签: java swing jbutton custom-component paintcomponent

我扩展了JButton类来制作我自己的自定义版本,但现在我不知道如何让JLabel出现在它上面。在普通按钮中,JLabel被绘制在它上面,但我不知道如何复制该行为。知道怎么样?

这是我覆盖的paintComponent方法:

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    boolean isSelected = getModel().isPressed();
    Color topColor =  !isSelected ? BUTTON_TOP_GRADIENT : BUTTON_TOP_GRADIENT.darker();
    Color bottomColor =  !isSelected ? BUTTON_BOTTOM_GRADIENT : BUTTON_BOTTOM_GRADIENT.darker();

    Graphics2D g2 = (Graphics2D)g.create();
    RenderingHints qualityHints =
            new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    qualityHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2.setRenderingHints(qualityHints);
    g2.setPaint(new GradientPaint(
            new Point(0, 0), 
            topColor, 
            new Point(0, getHeight()), 
            bottomColor));
    g2.fillRoundRect(0, 0, getWidth(), getHeight(), BUTTON_CORNER_RADIUS, BUTTON_CORNER_RADIUS);
    g2.setColor(Color.BLACK);
    g2.dispose();

    // Where I need to draw the JLabel


}

2 个答案:

答案 0 :(得分:2)

paintComponent()方法负责绘制背景,文本和图标。您调用此代码,然后使用自定义代码在所有内容上绘制。所以你丢失了文本和图标的所有默认绘画。

您需要在代码底部调用paintComponent()方法。在您的类的构造函数中,您还需要添加:

setContentAreaFilled( false );

这将阻止paintComponent()方法再次重新绘制背景。

答案 1 :(得分:0)

您可以使用Graphics2D的drawString方法,而不是绘制标签。类似的东西:

g2.drawString("Label text", 10, 40);