创建包含多个组件
我尝试创建一个组件(父组件),包含现场和JTextField
和JLabel
名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
任何想法如何使用此组件以及如何更改所有子组件?
不知道这是否会帮助,但对于一些属性(我不知道有多少?)如果孩子值为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(...)以将属性应用于每个子组件。
谢谢@camickr这是我什么在第一次做但没有帮助我,我的类扩展JPanel,所以我使用超级添加组件,我不返回一个JPanel,现在好主意是Andrew Thompson的想法 –
@YoucefLaidani,'我的类扩展JPanel,所以我使用超级添加组件,' - 这没有任何意义。如果您有自定义组件,则直接将组件添加到面板。没有必要调用super.add(...)。你有一个设计问题。 – camickr
谢谢@camuckr,也许我误解了你的答案:) –
你应该在你的项目中的源代码和设计按键,所以当你选择设计按钮,它可以让你更新所有对象的属性。你拥有了它?
谢谢@Claudiu M,但我的组件在一个罐子里,所以你认为这是解决这个问题的唯一想法吗? –
@Youcef Laidani,我有一个项目,我想用''Panel'类的jar,就像你想做的一样。我无法修改子组件,所以我离开了包含在我的项目文件夹中的那个类,并且在主类中我创建了一个'Panel'类型的对象并且使用它。每次当我需要修改'Panel'类的属性时,我都可以在“面板”类的设计 – Linksx
好吧,我明白@Claudiu M,非常感谢你,我会等一下,如果没有我会验证你的答案 –
根据您的场景,您可以检索YLabel面板的子组件,然后修改它们的属性,但是您需要记住子组件的顺序。下面以检索子组件
代码YLabel panel = new YLabel();
for(Component component : panel.getComponents()) {
System.out.println("component "+component.getClass().getCanonicalName());
//Change the properties here for your components
}
制作类的字段属性,并提供get/set方法以根据需要更改内容。这是基本的OO(在尝试创建GUI之前应该先排序 - 这是一个高级主题)。 –
哈哈这个工作真的很好@AndrewThompson非常感谢你,我与Netbeans合作,所以我在调色板中添加我的组件,当我拖放我的组件时,我不能编辑像其他组件一样的子组件,但是我可以编辑它们我的构造函数,你有什么想法我可以从GUI编辑它们吗?我会编辑我的问题,这样你就可以了解更多谢谢你 –
我使用Netbeans(没有GUI设计器),但不提供对它的支持。另外:'JTextField field = new JTextField();'最好是类似的东西(调整需要的整数)'JTextField field = new JTextField(8);'.. –