动态创建JTextAreas?

时间:2016-07-27 13:58:37

标签: java swing user-interface

使用WindowBuilder在Eclipse中使用GUI并遇到障碍..

我创建了一个带有下拉框的JWindow,用于显示人员阵列中的人员列表。我的课程结构是:

public class Person {
    String name;
    int age;
    ArrayList<Goal> goals;
}

public class Goal {
    String name;
    int daysToComplete;
}

在此JWindow GUI中,下拉框列出了所有Person实例。一旦我选择一个人(让他们说Bob) - 我想动态创建标签和JTextAreas以列出Bob的属性值,例如:

Name: Bob
Age: 20
Goals: 
    - Goal 1, complete in X days
    - Goal 2, complete in Y days

等等..我不想静态添加3个标签(名称,年龄,目标)和他们各自的JTextAreas(Bob,20,目标1 /目标2),因为Person的结构很可能改变未来。

这样做的最佳方式是什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以通过创建JLabelJTextArea的匿名实例并将它们放入数组列表中来获得所需内容。我不知道您的环境的细节,但希望您可以遵循这个想法:

ArrayList<JLabel> nameLabelList = new ArrayList<JLabel>();
ArrayList<JLabel> ageLabelList = new ArrayList<JLabel>();
ArrayList<Goal> goalList = new ArrayList<Goal>();

// Event handler method

public void personSelected(person)
{
    nameLabelList.add(person.name);
    ageLabelList.add(person.age);
    // This assumes each person has a single goal. You can adapt the code
    // for multiple goals easily
    goalLabelList.add(person.goal);
}

然后,在创建列表之后,您所要做的就是遍历这些数组列表并将它们吐出到您的UI中:

for(int counter = 0; counter < nameLabelList.size; counter++)
{
   myContainer.add(nameLabelList.get(counter));
   myContainer.add(ageLabelList.get(counter));
   myContainer.add(new JLabel(goalList.get(counter).toString()));
}

添加数组列表的内容后,请确保它们显示在UI中:

   myContainer.revalidate();
   myContainter.repaint();

答案 1 :(得分:0)

您必须将新面板添加到主面板。因此,您的主面板应提供一个可滚动的内部面板,您可以在其中添加新行。如果您曾经使用过HTML和Tables,那么您将理解我在说什么。 获得此属性显示面板(内部面板)后,您可以根据需要使用for循环加载任意数量的属性。 代码在技术上与goalArray中的每个目标一样 - &gt;将新的linePanel添加到attribute-show-panel。 而linePanel yould存储标签,Attaton等,并且许多行面板将垂直列出