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

它将根据不同的类型布置不同的组件:一种是Label,另一种是分隔符,第三种是其他所有内容。

如果创建方法,我可以轻松实现此功能并确定不同类型的组件的不同位置:

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


是否有更好的方法可以执行此操作而不使用instanceOf

(而且不,我没有制作自己的LayoutManager,但是如果我这样做,它会使事情变得非常简单;))

提前致谢

/ B

最佳答案

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

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);
  }
}


现在,您可以为所有组件注册单独的PositionCalculators

MyLayoutManager.registerPositionCalculator(JLabel.class, new JLabelCalculator());
MyLayoutManager.registerPositionCalculator(JRadioButton.class, new JRadioButtonCalculator());
// ...


当然,此解决方案可能具有以下缺点:


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


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

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

10-10 21:37