替换(不能)覆盖 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);
        }
    }
}

我应该怎么做?

这里有两个问题

  1. Invoking parent's private methods

是的,您可以调用父级的私有方法。请检查 How to invoke parent private method from child? 了解具体方法。 现在的问题是,这样做可以吗?只有当该方法没有任何副作用时才可以这样做。请检查 Side effect--what's this? 以了解方法的副作用。

  1. Overriding parent's private methods

不,不可能覆盖父级的私有方法。请检查此 .

所以在你的情况下, 如果您只想调用父级的私有方法,请确保该方法没有任何副作用。 但是如果你想覆盖父级的私有方法,从头开始创建一个新的class。