如何获取动态生成组件的值?

时间:2012-02-15 19:29:47

标签: java swing

我正在动态生成名称框,滑块和标签的列表,并试图找出如何访问滑块的值并更改标签。其他帖子建议使用数组,但我不知道从哪里开始。

我的代码是这样的:

public Tailoring(int n) {
    /*initComponents();*/
    JPanel containerPanel = new JPanel();
    containerPanel.setLayout(new BoxLayout(containerPanel, BoxLayout.PAGE_AXIS));
    this.add(containerPanel);
    JLabel Title = new JLabel("Tailoring:");
    containerPanel.add(Title);
    for(int i = 0; i < n; i++){
        JPanel rowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        JTextField NameBox = new JTextField("Guest " + (i+1));
        JSlider TipSlider = new JSlider();
        JLabel TipCost = new JLabel();
        rowPanel.add(NameBox);
        rowPanel.add(TipSlider);
        rowPanel.add(TipCost);
        containerPanel.add(rowPanel);
    }
}

2 个答案:

答案 0 :(得分:1)

您可以创建一个扩展JPanel的新类YourPanel。 而不是声明

JPanel rowPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));

你可以使用

YourPanel rowPanel = new YourPanel(new FlowLayout(FlowLayout.LEFT));

将textfield,slider和label定义为此YourPanel类的属性。 为每个字段提供 getters / setters 。然后在应用程序中使用YourPanel对象的数组或ArrayList。您可以通过以下调用访问 n th 面板的标签:

panels.get(n).getJLabel();

答案 1 :(得分:0)

在修改关联的JSlider时,您似乎想要更改JLabel中显示的值,正确?在Java中关联对象对象的最佳方法是使用 Map 结构:

Map<Component, JSlider> sliderToLabel = new HashMap<Component, JSlider>();

for (int i = 0; i < n; i++) {

    // after your loop code

    sliderToLabel.put(TipSlider, TipCost); // map the slider to its label
}

您将能够在侦听该组件更改的代码中获取对JSlider的引用。

JLabel updateLabel = sliderToLabel.get(targetedSlider);
updateLabel.setText("updated text");

备注

  • 作为惯例,变量名称应以小写字母开头
  • 我提到的事件监听器也应该附加在循环中。请参阅Writing Event ListenersOracle