对于我正在处理的某个布局,我需要制作自己的 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/