2014-10-07 43 views
0

我想创建我自己的自定义按钮,具有定义的大小和定义的颜色。 为此,我使用Custom Component创建了一个扩展JButton的类。 不幸的是我意识到,当我覆盖paintComponent()并在方法结束时调用super.paintComponent(g)时,它会导致颜色设置的重写。但是,如果我不调用超级方法,该按钮不再具有可点击的功能。摆动创建一个定制的Jbutton问题

任何建议,如果我的代码有什么问题,或缺少什么?任何建议实现我的目标?

+0

“但是,如果我没有调用超级方法,该按钮不再具有可点击的功能”您能更具体地了解吗?你究竟是什么意思?你为什么要在你的方法的**结尾**调用super.paintComponent()?请注意,您可以调用各种设置函数来指定自定义颜色,无需扩展JButton。 – 2014-10-07 18:55:23

+1

为了尽快获得更好的帮助,请发布[MCVE](http://stackoverflow.com/help/mcve)(最小完整可验证示例)。 – 2014-10-07 19:17:16

+0

*“..不再具有可点击的功能”*它可能会但不显示焦点和激活(按下)。在任何情况下,我都倾向于使用未装饰的按钮,每个基本颜色有两个或多个图标,包括“正常图标”,“聚焦图标”,“按下图标”等。比扩展按钮更简单。 – 2014-10-07 19:21:53

回答

2
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.Shape; 
import java.awt.geom.Ellipse2D; 

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

public class CreateRoundButton extends JButton { 
    public CreateRoundButton(String label) { 
    super(label); 
    Dimension size = getPreferredSize(); 
    size.width = size.height = Math.max(size.width,size.height); 
    setPreferredSize(size); 
    //added to remove a border of the text in jbutton 
    setFocusPainted(false); 
    setContentAreaFilled(false); 
    } 

    protected void paintComponent(Graphics g) { 
    if (getModel().isArmed()) { 
     g.setColor(Color.lightGray); 
    } else { 
     g.setColor(getBackground()); 
    } 
    g.fillOval(0, 0, getSize().width-1,getSize().height-1); 

    super.paintComponent(g); 
    } 

    protected void paintBorder(Graphics g) { 

    g.setColor(getForeground()); 
    g.drawOval(0, 0, getSize().width-1,  getSize().height-1); 
    } 

    Shape shape; 
    public boolean contains(int x, int y) { 
    if (shape == null || 
     !shape.getBounds().equals(getBounds())) { 
     shape = new Ellipse2D.Float(0, 0, getWidth(), getHeight()); 
    } 
    return shape.contains(x, y); 
    } 

    public static void main(String[] args) { 
    JButton button = new CreateRoundButton("Click"); 
    button.setBackground(Color.gray); 

    JFrame frame = new JFrame(); 
    frame.getContentPane().add(button); 
    frame.getContentPane().setLayout(new FlowLayout()); 
    frame.setSize(150, 150); 
    frame.setVisible(true); 
    } 
} 

从这里http://www.roseindia.net/tutorial/java/swing/createRoundButton.html

+0

不是文本不可见,super.paintComponent(g)应该是JButton自定义绘画的最后一行代码(仅适用于)。 – mKorbel 2014-10-08 06:57:06

+0

是的,我刚刚意识到。我将编辑答案。 – 2014-10-09 18:00:20

+0

:-) ........................ – mKorbel 2014-10-10 07:08:19

0

我采取这种方式尝试为好,但把调用的超级方法在一开始会导致文本按钮没有任何看得到更多! 实际上,在这两种情况下,我都会调用超级方法,我设置的属性已被覆盖。

我的目标si改变了按钮的尺寸,形状和颜色,使其他所有Jbutton变形器都变形。 在这里我的代码。



    protected void paintComponent(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     if (getModel().isArmed()) { 
      g2d.setColor(Color.LIGHT_GRAY); 
     } else { 
      g2d.setColor(this.colorwell); 
     } 
     g2d.fillOval(0, 0, getSize().width-1,getSize().height-1); 
     g.dispose(); 
     } 

     protected void paintBorder(Graphics g) { 
     g.setColor(getForeground()); 
     g.drawOval(0, 0, getSize().width-1,  getSize().height-1); 
     }