2016-11-18 78 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 
}  
相关问题