我想创建我自己的自定义按钮,具有定义的大小和定义的颜色。 为此,我使用Custom Component创建了一个扩展JButton的类。 不幸的是我意识到,当我覆盖paintComponent()
并在方法结束时调用super.paintComponent(g)
时,它会导致颜色设置的重写。但是,如果我不调用超级方法,该按钮不再具有可点击的功能。摆动创建一个定制的Jbutton问题
任何建议,如果我的代码有什么问题,或缺少什么?任何建议实现我的目标?
我想创建我自己的自定义按钮,具有定义的大小和定义的颜色。 为此,我使用Custom Component创建了一个扩展JButton的类。 不幸的是我意识到,当我覆盖paintComponent()
并在方法结束时调用super.paintComponent(g)
时,它会导致颜色设置的重写。但是,如果我不调用超级方法,该按钮不再具有可点击的功能。摆动创建一个定制的Jbutton问题
任何建议,如果我的代码有什么问题,或缺少什么?任何建议实现我的目标?
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
我采取这种方式尝试为好,但把调用的超级方法在一开始会导致文本按钮没有任何看得到更多! 实际上,在这两种情况下,我都会调用超级方法,我设置的属性已被覆盖。
我的目标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);
}
“但是,如果我没有调用超级方法,该按钮不再具有可点击的功能”您能更具体地了解吗?你究竟是什么意思?你为什么要在你的方法的**结尾**调用super.paintComponent()?请注意,您可以调用各种设置函数来指定自定义颜色,无需扩展JButton。 – 2014-10-07 18:55:23
为了尽快获得更好的帮助,请发布[MCVE](http://stackoverflow.com/help/mcve)(最小完整可验证示例)。 – 2014-10-07 19:17:16
*“..不再具有可点击的功能”*它可能会但不显示焦点和激活(按下)。在任何情况下,我都倾向于使用未装饰的按钮,每个基本颜色有两个或多个图标,包括“正常图标”,“聚焦图标”,“按下图标”等。比扩展按钮更简单。 – 2014-10-07 19:21:53