从数组循环中的另一个类访问JTextArea的实例。什么是最好的方式?

时间:2011-11-14 15:59:13

标签: java arrays swing

我在概念上遇到了如何使我的应用程序工作的问题。

我有15个JTextField组件和15个JButton组件以及1个JTextArea。我希望每个按钮在每个相应的文本字段中插入textarea中的文本。

如果您希望看到图形来解释此设置 - [http://i.imgur.com/Vnc3C.png]here1

我设法将frame.finaltext添加到Curriculum主题类中,但是在actionPerformed方法中没有看到它。

获取frame.finaltext.append(textfields [i])

的最佳方式是什么?

TIA 亚当

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import net.miginfocom.swing.MigLayout;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.JButton;
    import java.awt.Dimension;

    public class CurriculumSubject extends JPanel implements ActionListener{
    /**
     * This is an class that will hold  details for each subject. 
     */

    // First we want some variables 
    String subjectName;

    public CurriculumSubject (final JReport frame){
        MigLayout layout = new MigLayout("wrap 2");//, debug 4000");
        this.setLayout(layout);
        final JTextField [] textfields = new JTextField[15];
        JButton [] buttons = new JButton[15];

        for (int i=0;i<15;i++){
            String content = "This is a test. " + i; 
            textfields[i] = new JTextField(content);
            this.add(textfields[i], "width 500:700:1000");
            buttons[i] = new JButton(">>>");
            buttons[i].addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e){
                    //Execute when button is pressed
                    String text = textfields[i].getText();
                    frame.finaltext.append(text);
                }});
            buttons[i].setPreferredSize(new Dimension(10,10));  
            this.add(buttons[i]);
        }
    }
}

3 个答案:

答案 0 :(得分:0)

我不知道JReport是什么,但为什么不提供一个接受字符串的方法(或者创建一个提供此方法的JReport子类):

class ReportThingy extends JReport {
   public void addText(String text) {
        finaltext.append(text);
   }
 }

更新:

您似乎有许多小部件需要跟踪。我建议引入Model-View-Controller模式,以使您的应用程序更易于管理。在短期内,您可以尝试通过setter或构造函数参数使CurriculumSubject类可以使用finaltext小部件。

答案 1 :(得分:0)

好的,我想我理解你想要的东西。您应该将JTextArea定义为类变量,因此在一个表单对象中有一个实例,然后只需将文本附加到该对象。方法示例:

public class CurriculumSubject extends JPanel implements ActionListener {

    private JTextArea mainArea = new JTextArea();

    public CurriculumSubject(final JReport frame) {
        MigLayout layout = new MigLayout("wrap 2");//, debug 4000");
        this.setLayout(layout);
        final JTextField[] textfields = new JTextField[15];
        JButton[] buttons = new JButton[15];

        for (int i = 0; i < 15; i++) {
            String content = "This is a test. " + i;
            textfields[i] = new JTextField(content);
            this.add(textfields[i], "width 500:700:1000");
            buttons[i] = new JButton(">>>");
            buttons[i].addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    //Execute when button is pressed
                    String text = textfields[i].getText();
                    addTextToFinalArea(text);
                }
            });
            buttons[i].setPreferredSize(new Dimension(10, 10));
            this.add(buttons[i]);
        }
    }

    public void addTextToFinalArea(String text) {
        mainArea.append(text);
    }
}

答案 2 :(得分:0)

我想知道编译器没有抱怨你的代码:你在匿名内部i实现中使用了非最终局部变量ActionListener。尝试将i存储在最终变量中,并在内部类中使用该变量:

for (int i = 0; i < 15; i++) {
...
  final int index = i;
  buttons[i].addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e){
      //Execute when button is pressed
      String text = textfields[index].getText();
      frame.finaltext.append(text + "\n");
  }});
...
}