替换(不能)覆盖 JAVA 中的 JComboBox 和 BasicArrowButton 私有方法?
Replacement for (can't) overriding JComboBox and BasicArrowButton private methods in JAVA?
我想替换 DefaultArrowButton 和 JComboBox 中的一些方法,使它们在视觉上发生变化(改变一切)。
有些方法是私有的。我无法覆盖它们。下一个问题是无法调用超类的私有成员。
我确定我有错误的想法来实现我的目标。我在下面放了一些错误的代码,因为我无法访问子 Class 的私有成员。此外,我没有插入所有长代码,只插入了两种显示我想要显示的所有内容的方法(+ 构造函数):
public class DefaultArrowButton extends BasicArrowButton {
public DefaultArrowButton(int direction) {
super(direction);
setBackground(HFColors.BLUE);
setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
}
public DefaultArrowButton(int direction, Color background, Color shadow,
Color darkShadow, Color highlight) {
super(direction, background, shadow, darkShadow, highlight);
}
public void paintTriangle(Graphics g, int x, int y, int size, int direction,
boolean isEnabled)
{
Color savedColor = g.getColor();
switch (direction)
{
case NORTH:
paintTriangleNorth(g, x, y, size, isEnabled);
break;
case SOUTH:
paintTriangleSouth(g, x, y, size, isEnabled);
break;
case LEFT:
case WEST:
paintTriangleWest(g, x, y, size, isEnabled);
break;
case RIGHT:
case EAST:
paintTriangleEast(g, x, y, size, isEnabled);
break;
}
g.setColor(savedColor);
}
private void paintTriangleSouth(Graphics g, int x, int y, int size,
boolean isEnabled) {
int tipX = x + (size - 2) / 2;
int tipY = y + (size - 1);
int baseX1 = tipX - (size - 1);
int baseX2 = tipX + (size - 1);
int baseY = y;
Polygon triangle = new Polygon();
triangle.addPoint(tipX, tipY);
triangle.addPoint(baseX1, baseY);
triangle.addPoint(baseX2, baseY);
if (isEnabled)
{
g.setColor(Color.CYAN);
g.fillPolygon(triangle);
g.drawPolygon(triangle);
} else
{
g.setColor(Color.CYAN);
g.fillPolygon(triangle);
g.drawPolygon(triangle);
}
}
}
我应该怎么做?
这里有两个问题
- Invoking parent's private methods
是的,您可以调用父级的私有方法。请检查 How to invoke parent private method from child? 了解具体方法。
现在的问题是,这样做可以吗?只有当该方法没有任何副作用时才可以这样做。请检查 Side effect--what's this? 以了解方法的副作用。
- Overriding parent's private methods
不,不可能覆盖父级的私有方法。请检查此 .
所以在你的情况下,
如果您只想调用父级的私有方法,请确保该方法没有任何副作用。
但是如果你想覆盖父级的私有方法,从头开始创建一个新的class。
我想替换 DefaultArrowButton 和 JComboBox 中的一些方法,使它们在视觉上发生变化(改变一切)。 有些方法是私有的。我无法覆盖它们。下一个问题是无法调用超类的私有成员。
我确定我有错误的想法来实现我的目标。我在下面放了一些错误的代码,因为我无法访问子 Class 的私有成员。此外,我没有插入所有长代码,只插入了两种显示我想要显示的所有内容的方法(+ 构造函数):
public class DefaultArrowButton extends BasicArrowButton {
public DefaultArrowButton(int direction) {
super(direction);
setBackground(HFColors.BLUE);
setBorder(BorderFactory.createEmptyBorder(0,0,0,0));
}
public DefaultArrowButton(int direction, Color background, Color shadow,
Color darkShadow, Color highlight) {
super(direction, background, shadow, darkShadow, highlight);
}
public void paintTriangle(Graphics g, int x, int y, int size, int direction,
boolean isEnabled)
{
Color savedColor = g.getColor();
switch (direction)
{
case NORTH:
paintTriangleNorth(g, x, y, size, isEnabled);
break;
case SOUTH:
paintTriangleSouth(g, x, y, size, isEnabled);
break;
case LEFT:
case WEST:
paintTriangleWest(g, x, y, size, isEnabled);
break;
case RIGHT:
case EAST:
paintTriangleEast(g, x, y, size, isEnabled);
break;
}
g.setColor(savedColor);
}
private void paintTriangleSouth(Graphics g, int x, int y, int size,
boolean isEnabled) {
int tipX = x + (size - 2) / 2;
int tipY = y + (size - 1);
int baseX1 = tipX - (size - 1);
int baseX2 = tipX + (size - 1);
int baseY = y;
Polygon triangle = new Polygon();
triangle.addPoint(tipX, tipY);
triangle.addPoint(baseX1, baseY);
triangle.addPoint(baseX2, baseY);
if (isEnabled)
{
g.setColor(Color.CYAN);
g.fillPolygon(triangle);
g.drawPolygon(triangle);
} else
{
g.setColor(Color.CYAN);
g.fillPolygon(triangle);
g.drawPolygon(triangle);
}
}
}
我应该怎么做?
这里有两个问题
- Invoking parent's private methods
是的,您可以调用父级的私有方法。请检查 How to invoke parent private method from child? 了解具体方法。 现在的问题是,这样做可以吗?只有当该方法没有任何副作用时才可以这样做。请检查 Side effect--what's this? 以了解方法的副作用。
- Overriding parent's private methods
不,不可能覆盖父级的私有方法。请检查此
所以在你的情况下, 如果您只想调用父级的私有方法,请确保该方法没有任何副作用。 但是如果你想覆盖父级的私有方法,从头开始创建一个新的class。