是否可以在接口中使用setLayout()以“强制”实现类以使用某个布局?

时间:2016-04-15 09:46:21

标签: java swing interface

我还在学习接口,所以我的问题可能很简单!

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,因此强制布局。

所以:

  • 是否可以通过界面“强制”实现类使用特定的布局?
  • 使用这种方法是否有意义? (方法=我使用接口来忘记使用某些方法)

2 个答案:

答案 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 
{
}