java - 如何在没有instanceOf的情况下实现我的LayoutManager?

标签 java oop instanceof layout-manager

对于我正在处理的某个布局,我需要制作自己的 LayoutManager

它将根据不同的类型来布局不同的组件:标签以一种方式,分隔符以另一种方式,其他所有内容以第三种方式。

如果我制定一个方法,我可以轻松实现这一点并确定不同类型组件的不同位置:

private Dimension calculatePositionForComponent(Component component) {
  if (component instanceOf JLabel)
     ...
  if (component instanceOf JSeparator)
     ...
}

有没有更好的方法来做到这一点,而不使用 instanceOf

(不,我不必制作自己的 LayoutManager,但如果我这样做,事情就会变得非常容易;))

提前致谢

/B

最佳答案

我还建议某种接口(interface)/子类解决方案来封装不同组件的不同布局计算。我还会添加一些注册机制,以便将来灵活添加(如果您想为新组件类型实现另一个单独的行为)

public interface PositionCalculator {
  Dimension calculatePositionForComponent(MyLayoutManager manager, Component component);
}

class JLabelCalculator implements PositionCalculator {
  public Dimension calculatePositionForComponent(MyLayoutManager manager, Component component) {
    // ...
  }
}

class JRadioButtonPosCalculator impements PositionCalculator {
  public Dimension calculatePositionForComponent(MyLayoutManager manager, Component component) {
    // ...
  }
}

// More classes ...


class MyLayoutManager extends LayoutManager {
  private static HashMap<Class, PositionCalculator> calculators = new HashMap<Class, PositionCalculator>();
  public static registerPositionCalculator(Class c, PositionCalculator p) {
    calculators.put(c, p);
  }
  private static PositionCalculator defaultCalculator = new DefaultPositionCalculator(); // Not shown here ...
  // ...
  private Dimension calculatePositionForComponent(Component c) {
    PositionCalculator calc = calculators.get(c.getClass());
    if (calc == null)
      calc = defaultCalculator;
    return calc.calculatePositionForComponent(this, c);
  }
}

现在,您可以通过输入

为所有组件注册单独的位置计算器
MyLayoutManager.registerPositionCalculator(JLabel.class, new JLabelCalculator());
MyLayoutManager.registerPositionCalculator(JRadioButton.class, new JRadioButtonCalculator());
// ...

当然,该解决方案可能存在以下缺点:

  • 它可能比原来的慢。
  • 它不适用于继承的类:如果您有 JLabel 的子类,则必须单独注册它。该解决方案可以适应这一点,但这将以另一次性能损失为代价......

另一方面,该解决方案具有很好的可扩展性:您可以定义不同的布局行为,而无需触及 MyLayoutManager 类。

关于java - 如何在没有instanceOf的情况下实现我的LayoutManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/704246/

相关文章:

java - 如何使用正则表达式在同一行捕获可变数量的模式?

java - 循环遍历不同的数组列表

java - Android - 在 native 应用程序和 Java 应用程序之间使用管道

java - `instanceof` 检查什么来确定对象类型?

java - 如何获取传递的集合<通用类型>的子集合,其中成员扩展或实现另一个集合?

java - 如何在 Wicket 口中实现具有 2 个相关下拉菜单的可编辑网格?

java - 类型转换可以作为适配器设计模式的一个例子吗?

php - 如何从静态方法中访问属性?

python - 扩展 Python 的内置 Str

Java:如果这是instanceof Something,则显示仅属于Something的变量?