Java 从数组循环中的另一个类访问JTextArea的实例。什么';这是最好的办法吗?

Java 从数组循环中的另一个类访问JTextArea的实例。什么';这是最好的办法吗?,java,arrays,swing,Java,Arrays,Swing,我在概念上遇到了一些问题,无法理解如何使我的应用程序工作 我有15个JTextField组件、15个JButton组件和1个JTextArea。我希望每个按钮在文本区域内插入来自每个对应文本字段的文本 如果您希望看到解释此设置的图形-[http://i.imgur.com/Vnc3C.png]这里 我已经设法将frame.finaltext添加到课程主题类中,但在actionPerformed方法中看不到它 获取frame.finaltext.append(textfields[i])的最佳方式

我在概念上遇到了一些问题,无法理解如何使我的应用程序工作

我有15个JTextField组件、15个JButton组件和1个JTextArea。我希望每个按钮在文本区域内插入来自每个对应文本字段的文本

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

我已经设法将frame.finaltext添加到课程主题类中,但在actionPerformed方法中看不到它

获取frame.finaltext.append(textfields[i])的最佳方式是什么

短暂性脑缺血发作 亚当

导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入net.miginfocom.swing.MigLayout;
导入javax.swing.JPanel;
导入javax.swing.JTextField;
导入javax.swing.JButton;
导入java.awt.Dimension;
公共课程主题扩展JPanel实现ActionListener{
/**
*这是一个包含每个主题详细信息的类。
*/
//首先我们需要一些变量
字符串subjectName;
公共课程科目(最终报告框架){
MigLayout布局=新的MigLayout(“包装2”);/,调试4000”);
这个.setLayout(布局);
最终JTextField[]textfields=新JTextField[15];
JButton[]按钮=新JButton[15];

对于(int i=0;i我不知道JReport是什么,但是为什么不在其中提供一个方法来接受字符串(或者创建一个提供此方法的JReport子类):

更新:


您似乎有许多小部件需要跟踪。我建议引入一种模式,使您的应用程序更易于管理。短期内,您可以尝试通过setter或构造函数参数将finaltext小部件提供给CoursulumSubject类。

好的,我想我理解您的要求。您应该定义y我们的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);
    }
}
公共类课程主题扩展JPanel实现ActionListener{
私有JTextArea mainArea=新JTextArea();
公共课程科目(最终报告框架){
MigLayout布局=新的MigLayout(“包装2”);/,调试4000”);
这个.setLayout(布局);
最终JTextField[]textfields=新JTextField[15];
JButton[]按钮=新JButton[15];
对于(int i=0;i<15;i++){
String content=“这是一个测试。”+i;
textfields[i]=新的JTextField(内容);
添加(文本字段[i],“宽度500:700:1000”);
按钮[i]=新的JButton(“>>”);
按钮[i].addActionListener(新建ActionListener()){
已执行的公共无效操作(操作事件e){
//按下按钮时执行
String text=textfields[i].getText();
addTextToFinalArea(文本);
}
});
按钮[i].setPreferredSize(新尺寸(10,10));
添加(按钮[i]);
}
}
公共无效addTextToFinalArea(字符串文本){
mainArea.append(文本);
}
}

我想知道编译器是否在抱怨您的代码:您在匿名内部
ActionListener
实现中使用了非最终局部变量
I
。请尝试将
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");
  }});
...
}
for(int i=0;i<15;i++){
...
最终int指数=i;
按钮[i].addActionListener(新建ActionListener()){
已执行的公共无效操作(操作事件e){
//按下按钮时执行
String text=textfields[index].getText();
frame.finaltext.append(text+“\n”);
}});
...
}

JReport是一个启动整个过程的类(包含名为finaltext的JTextArea)。图中显示了这里发生的情况——右侧区域位于JReport内,是一个JTextArea,选项卡位于选项卡窗格类中,每个选项卡窗格都是课程主题。如何访问JReport.finaltext(JTextArea)从课程实例来看?ThanksThanks-setter和getter似乎是合适的-我想我通过两种不同的方法来处理这个问题。然而,当我使用actionPerformed方法时,很难获得JReport的实例-但这并不是说其他方法无法获得它。这有意义吗?我会的看看MVC——几年前我对django做过一点工作,我对它很熟悉。再次感谢。我还得到了错误java.lang.ArrayIndexOutOfBoundsException——对于数组——每次我点击一个按钮,我是15,有15个元素0-14。如果我移动这个方法,我猜我将能够传递I的值。谢谢您的回答。唯一的问题是JReport中贴花了mainArea,而不是CoursulumSubject类。我已经在JReport框架中传递了JReport的实例,我真正想要访问的是frame.finaltext(这是一个JReport实例,有一个JTextArea实例)。在JReport类上执行相同的操作。在类变量列表中将
JTextArea
声明为
final
变量。然后在JReport类中创建一个方法:
public void addTextToFinalArea(String text){mainArea.append(text);}
然后可以通过
frame.addTextToFinalArea(text)获得文本区域;
谢谢-我正在看的另一个论坛建议这样做。getParent()。这个。getParent()并不总是有效。如果将面板放入另一个面板,则getParent()将返回JPanel元素,而不是JFrame。我会怎么做(尽管我不知道这是否是最佳解决方案)-我将为主窗口创建一个静态对象,并静态调用它
JFrameClassName.staticInstanceObject
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);
    }
}
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");
  }});
...
}