麻烦绘制带有摆动的自定义按钮

问题描述 投票:1回答:1

我写了一个简短的程序,因为我想创建一个带有圆角的定制按钮。因此,我扩展了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);
}

输出是这个:

frame showing only one button corrent

为什么下部按钮的背景不可见?它应该是黑色的!

java jbutton
1个回答
0
投票

在paintComponent()中,您需要fillRoundRect(0,0,...)而不是getX()和getY()因为g相对于组件本身。

© www.soinside.com 2019 - 2024. All rights reserved.