没有调用 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
的一个实例
我有如下一段代码,
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()
.
CustomEtchedBorder
的一个实例