我还在学习接口,所以我的问题可能很简单!
我read a bit about interfaces并试图玩弄他们。我想出的一个用例是“强制”实现类以使用某种布局。
示例:
我有几个扩展JPanel
的类(page1,page2,...)。所有这些都在构造函数中使用MigLayout
via setLayout(new MigLayout())
。如果您忘记设置MigLayout
,这些类可能仍然有效,可能仍然看起来很正常或有时完全破坏。因此,最好始终为所有类设置相同的布局。
我的想法是,创建一个接口并在其中添加一些方法,这些方法在类中使用,尤其是setLayout(new MigLayout())
- 方法,因此您不会忘记在您的类中使用此方法。
但这会给我一个错误:
令牌“setLayout”上的语法错误,@在此令牌之前预期
我还尝试在界面中使用匿名内部类:
ForcedLayout testLayout = new ForcedLayout(){
{
setLayout(new MigLayout());
}};
但我没有找到任何方法在实现类中使用testLayout
,因此强制布局。
所以:
答案 0 :(得分:1)
由于所有类都在扩展JPanel
,因此您可以创建自己的MigLayoutPanel
,其中JPanel
已经设置MigLayout
。
public abstract class MigLayoutPanel extends JPanel {
public MigLayoutPanel() {
this(new MigLayout());
}
private MigLayoutPanel(LayoutManager layout) {
super(layout);
}
@Override
public void setLayout(LayoutManager layout) {
if(!(layout instanceof MigLayout)){
throw new UnsupportedOperationException("not allowed to change the layout");
}
}
}
现在你自定义类。
public class MyPanel extends MigLayoutPanel {
....
}
接口只是声明或定义一个具体的子类必须实现所有这些的合同(方法集)。 Java 7支持Default Methods,使您可以在界面中添加默认功能。
注意:这不是一个完整的证明解决方案。任何子类都可以覆盖它。
答案 1 :(得分:0)
您是在寻找一些基类(而不是接口)并让其他类扩展此类?
所以基本上你写...
public class BaseLayOutClass extends JPanel
{
public BaseLayOutClass()
{
// somebasic code if you want
setLayout(new MigLayout());
}
// Have all other methods defined here.
}
然后你要求所有人扩展这个课程
public class Panel1 extends BaseLayOutClass
{
}