2016-04-15 53 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

相關問題