创建包含多个组件的swing组件

时间:2016-11-18 16:40:47

标签: java swing

我尝试创建一个组件(父组件),其中包含3个子组件JLabel作为字段名称,JTextFieldJLabel表示我的字段错误,如下所示:< / p>

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

3 个答案:

答案 0 :(得分:2)

根据您的方案,您可以检索YLabel面板的子组件,然后修改它们的属性,但是您需要记住子组件的顺序。下面是检索子组件的代码

getBackendData()

答案 1 :(得分: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(...)以将属性应用于每个子组件。

答案 2 :(得分:1)

项目中应该有一个Source and Design按钮,因此当您选择Design按钮时,它可以让您更新所有对象的属性。你有吗?