没有调用 paintBorder 重写方法

paintBorder overridden method not getting called

我有如下一段代码,

CustomBorderFactory.java

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;

import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

public class CustomBorderFactory extends EtchedBorder {

    private static final long serialVersionUID = 1L;

    @Override
    public void paintBorder(Component c, Graphics g, int x, int y, int width,
            int height) {
        System.err.println("Painting here");
        int w = width;
        int h = height;

        g.translate(x, y);

        g.setColor(etchType == LOWERED ? getShadowColor(c)
                : getHighlightColor(c));
        g.drawRect(0, 0, w - 2, h - 2);

        g.setColor(etchType == LOWERED ? getHighlightColor(c)
                : getShadowColor(c));
        g.drawLine(1, h - 3, 1, 1);
        g.drawLine(1, 1, w - 3, 1);

        g.drawLine(0, h - 1, w - 1, h - 1);
        g.drawLine(w - 1, h - 1, w - 1, 0);

        g.translate(-x, -y);
    }

    public static Border createEtchedBorder(Color black, Color red) {
        return new EtchedBorder(black, red);
    }
}

问题是,覆盖的 paintBorder 没有被调用。

在我的测试代码中,

JPanel panel = new Jpanel();
panel.setBorder(CustomBorderFactory.createEtchedBorder(Color.black,Color.red));

为什么 CustomBorderFactory class 中的 paintBorder 方法没有被调用。 (我可以说 sys.err 没有被打印出来)虽然它被覆盖了,但它仍然调用超级 class 方法。

我是 java 的新手。请帮忙!

你的方法 return 是一个普通的 EtchedBorder :

public static Border createEtchedBorder(Color black, Color red) {
        return new EtchedBorder(black, red);
    }

您想要的是 return 自定义实例 class :

public static Border createEtchedBorder(Color black, Color red) {
        return new CustomBorderFactory(black, red);
    }

请注意,您的 class 名称令人困惑,您应该创建一个 CustomEtchedBorder class 扩展 EtchedBorder,然后创建一个真正的工厂 class CustomBorderFactory,当您调用 createEtchedBorder().

时,这将是 return CustomEtchedBorder 的一个实例