2016-11-18 96 views
0

我嘗試創建一個組件(父組件),包含現場和JTextFieldJLabel名3子組件JLabel我場這樣的錯誤Swing組件:創建包含多個組件

public class YLabel extends JPanel { 

    public YLabel() { 
     super(); 
     JLabel name = new JLabel("Some text"); 
     JTextField field = new JTextField(); 
     JLabel error = new JLabel("Error text"); 
     super.add(name); 
     super.add(field); 
     super.add(error); 
    } 
} 

所以,當我使用這個組件我不能改變這三個組件的屬性,我可以改變父組件JPanel

MY Component

任何想法如何使用此組件以及如何更改所有子組件?

編輯 MY COMPONENT

+2

製作類的字段屬性,並提供get/set方法以根據需要更改內容。這是基本的OO(在嘗試創建GUI之前應該先排序 - 這是一個高級主題)。 –

+0

哈哈這個工作真的很好@AndrewThompson非常感謝你,我與Netbeans合作,所以我在調色板中添加我的組件,當我拖放我的組件時,我不能編輯像其他組件一樣的子組件,但是我可以編輯它們我的構造函數,你有什麼想法我可以從GUI編輯它們嗎?我會編輯我的問題,這樣你就可以瞭解更多謝謝你 –

+1

我使用Netbeans(沒有GUI設計器),但不提供對它的支持。另外:'JTextField field = new JTextField();'最好是類似的東西(調整需要的整數)'JTextField field = new JTextField(8);'.. –

回答

2

不知道這是否會幫助,但對於一些屬性(我不知道有多少?)如果孩子值爲null父值會被使用

例如:

JLabel label= new JLabel("hello"); 
label.setForeground(null); 
label.setFont(null); 
JTextField textField = new JTextField(10); 
textField.setForeground(null); 
textField.setFont(null); 

JPanel panel = new JPanel(); 
panel.setForeground(Color.RED); 
panel.setFont(new Font("monospaced", Font.PLAIN, 24)); 

panel.add(label); 
panel.add(textField); 

對於那些不支持此操作,你需要重寫面板的setXXX(...)方法來更新其所有子組件的屬性。

編輯:

所以我假設你有一個自定義組件是這樣的:

public class CustomComponent extends JPanel 
{ 
    private JLabel heading = new JLabel(...); 
    private JTextField textField = new JTextField(5); 
    private JLabel error = new JLabel(...); 

    public CustomComponent() 
    { 
     add(heading); 
     add(textField); 
     add(error); 

     clearProperties(heading); 
     clearProperties(textField); 
     clearProperties(error); 

    } 

    private void clearProperties(JComponent component) 
    { 
     component.setForeground(null); 
     component.setFont(null); 
    } 
} 

現在,當您使用的組件,你可以這樣做:

CustomComponent component = new CustomComponent(); 
component.setForeground(...); 
component.setFont(..); 

使用此您不必重寫面板的setForeground(...),setFont(...)以將屬性應用於每個子組件。

+0

謝謝@camickr這是我什麼在第一次做但沒有幫助我,我的類擴展JPanel,所以我使用超級添加組件,我不返回一個JPanel,現在好主意是Andrew Thompson的想法 –

+0

@YoucefLaidani,'我的類擴展JPanel,所以我使用超級添加組件,' - 這沒有任何意義。如果您有自定義組件,則直接將組件添加到面板。沒有必要調用super.add(...)。你有一個設計問題。 – camickr

+0

謝謝@camuckr,也許我誤解了你的答案:) –

1

你應該在你的項目中的源代碼和設計按鍵,所以當你選擇設計按鈕,它可以讓你更新所有對象的屬性。你擁有了它?

+0

謝謝@Claudiu M,但我的組件在一個罐子裏,所以你認爲這是解決這個問題的唯一想法嗎? –

+0

@Youcef Laidani,我有一個項目,我想用''Panel'類的jar,就像你想做的一樣。我無法修改子組件,所以我離開了包含在我的項目文件夾中的那個類,並且在主類中我創建了一個'Panel'類型的對象並且使用它。每次當我需要修改'Panel'類的屬性時,我都可以在「面板」類的設計 – Linksx

+0

好吧,我明白@Claudiu M,非常感謝你,我會等一下,如果沒有我會驗證你的答案 –

2

根據您的場景,您可以檢索YLabel面板的子組件,然後修改它們的屬性,但是您需要記住子組件的順序。下面以檢索子組件

代碼
YLabel panel = new YLabel(); 
for(Component component : panel.getComponents()) { 
    System.out.println("component "+component.getClass().getCanonicalName()); 
    //Change the properties here for your components 
}