我写了一个简短的程序,因为我想创建一个带有圆角的定制按钮。因此,我扩展了JButton类并重写了paintComponent方法(请参见下面的代码)。
public class JRoundedButton extends JButton {
private int arcRadius;
public JRoundedButton(String label, int arcRadius) {
super(label);
this.setContentAreaFilled(false);
this.arcRadius = arcRadius;
}
@Override
protected void paintComponent(Graphics g) {
if(g instanceof Graphics2D) {
Graphics2D graphics = (Graphics2D) g;
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//Draw button background
graphics.setColor(getBackground());
graphics.fillRoundRect(getX(), getY(), getWidth() - 1, getHeight() - 1, arcRadius, arcRadius);
}
}
@Override
public boolean contains(int x, int y) {
return new RoundRectangle2D.Double(getX(), getY(), getWidth(), getHeight(), arcRadius, arcRadius).contains(x,y);
}
public int getArcRadius() {
return arcRadius;
}
public void setArcRadius(int arcRadius) {
this.arcRadius = arcRadius;
this.repaint();
}
}
当我创建一个简单的框架并将一个按钮添加到面板时,然后将其添加到框架中,它可以完美显示。但是,一旦我要创建两个按钮并将它们设置为彼此下面(使用Borderlayout我使用了NORTH和SOUTH),只有上面的按钮才显示正确。下面的按钮正确显示了文本(我从painComponent(...)方法中删除了该部分),但未绘制背景。我不以任何方式使用setOpaque(...)方法。
可能是什么问题?
我需要设置自定义按钮的边界吗?
编辑:这是创建框架并显示按钮的代码:
public static void main(String[] args) {
JFrame frame = new JFrame("Buttontest");
frame.setSize(new Dimension(500, 500));
frame.setLayout(new BorderLayout());
JPanel contentPanel = new JPanel();
contentPanel.setSize(new Dimension(500, 500));
contentPanel.setLayout(new GridLayout(2, 1, 0, 20));
JRoundedButton button1 = new JRoundedButton("Rounded Button", 40);
button1.setForeground(Color.YELLOW);
button1.setBackground(Color.GREEN);
JRoundedButton button2 = new JRoundedButton("Rounded Button 2", 40);
button2.setBackground(Color.BLACK);
button2.setForeground(Color.WHITE);
contentPanel.add(button1);
contentPanel.add(button2);
frame.add(contentPanel, BorderLayout.CENTER);
frame.setVisible(true);
}
输出是这个:
为什么下部按钮的背景不可见?它应该是黑色的!
在paintComponent()中,您需要fillRoundRect
(0,0,...)而不是getX()和getY()因为g相对于组件本身。