2016-04-15 48 views
0

我还在学习接口,所以我的问题可能是一种基本的!是否可以在接口中使用setLayout()以“强制”实现类来使用特定布局?

我已经read a bit about interfaces并试图与他们玩弄。我提出的一个用例是“强制”实现类来使用特定的布局。

实施例:

我有几个类(第1页,第2页,...)延伸JPanel。他们都在构造函数中通过setLayout(new MigLayout())使用MigLayout。如果您忘记设置MigLayout,这些类可能仍然有效,但仍可能看起来相当正常,或者有时会完全崩溃。因此,最好始终为所有类设置相同的布局。

我的想法是创建一个接口并将其应用到类中,这些类在类中使用,尤其是setLayout(new MigLayout())-方法,因此您不会忘记在您的类中使用此方法。

但是这会给我的错误:

Syntax error on token "setLayout", @ expected before this token

我也试过在界面上使用匿名内部类:

ForcedLayout testLayout = new ForcedLayout(){ 
{ 
    setLayout(new MigLayout()); 
}}; 

但我没有发现任何方式使用testLayout在实施班级,因此强制布局。

所以:

  • 是否有可能“强迫”的实现类,以通过该接口使用特定的布局?
  • 使用这种方法是否有意义? (方法= I种使用接口来不要忘记使用某些方法),因为所有的类都扩展JPanel因此你可以创建

回答

1

自己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,使您可以在接口本身中添加默认功能。

注意:这不是一个完整的证明解决方案。任何子类都可以覆盖它。

+0

很好的方式来设置相同的布局的类!但我的问题是,如果我可以使用一个接口来强制实现类来做到这一点。我想更好地理解接口。 – hamena314

+0

您可以使用[接口默认方法](https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html),但可以在不是完全验证解决方案的子类中覆盖 – Braj

+0

啊,那么我可以在接口中执行'setLayout(MigLayout migLayout)',并让其他类实现它,而方法的缺点不会被覆盖。你可以张贴这个答案,我可以接受吗?我想,这实际上是我想了解的接口。 – hamena314

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 
{ 
} 
+0

谢谢你的答案,但我的问题是关于如果我可以使用接口来强制实现类来设置布局。我想更多地了解接口。 – hamena314

+1

即使您强制使用接口并要求他们编写方法,谁会调用该方法?一些基类本身。在界面中你不能有执行方法 – Optional

+0

好的一点,我可以强制执行类让**有一定的方法,但不强制类调用**方法。这是原因,我不能直接在界面中使用'setLayout(new MigLayout())'? – hamena314

相关问题