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