【问题标题】:Accessing an instance of JTextArea from another class in an array loop. What's the best way?从数组循环中的另一个类访问 JTextArea 的实例。最好的方法是什么?
【发布时间】:2011-11-14 15:59:13
【问题描述】:

我在思考如何使我的应用程序正常工作时遇到了一些概念上的问题。

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

如果您希望查看解释此设置的图形 - [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]);
        }
    }
}

【问题讨论】:

    标签: java arrays swing


    【解决方案1】:

    好的,我想我明白你想要什么了。您应该将 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);
        }
    }
    

    【讨论】:

    • 感谢您的回复。唯一的问题是 mainArea 在 JReport 中被贴花 - 而不是 CurriculumSubject 类。我已经在 J​​Report 框架中传递了 JReport 的实例——我真正想要访问的是 frame.finaltext(它是一个具有 JTextArea 实例的 JReport 实例)。
    • 在 JReport 类上做同样的事情。在类变量列表中将JTextArea 声明为final 变量。然后在JReport类中创建一个方法:public void addTextToFinalArea(String text) { mainArea.append(text); },然后就可以通过frame.addTextToFinalArea(text);获取文本区域了
    • 谢谢 - 我正在查看的另一个论坛建议 this.getParent()。
    • this.getParent() 并不总是有效。如果您将面板放入另一个面板,则 getParent() 将返回 JPanel 元素而不是 JFrame。我会做什么(虽然我不知道这是否是最好的解决方案) - 我会制作一个主窗口的静态对象并静态调用它JFrameClassName.staticInstanceObject
    【解决方案2】:

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

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

    更新:

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

    【讨论】:

    • JReport 是启动整个事情的类(并保存名为 finaltext 的 JTextArea)。图像显示了这里发生的事情 - i.imgur.com/Vnc3C.png - 右侧的区域在 JReport 内,是一个 JTextArea,选项卡在 TabbedPane 类中,每个 TabbedPane 都是一个课程主题。如何从 Curriculum 实例访问 JReport.finaltext (JTextArea)?谢谢
    • 谢谢 - setter 和 getter 似乎很合适 - 我想我通过两种不同的方法来处理它。但是,当我在 actionPerformed 方法中时,很难获得 JReport 的实例——但这并不是说其他​​方法无法获得它。那有意义吗?我将不得不看看 MVC - 我在几年前对 django 所做的一些工作中对它很熟悉。再次感谢。
    • 我也收到错误 java.lang.ArrayIndexOutOfBoundsException - 对于数组 - 每次单击按钮时,我都是 15,并且有 15 个元素 0-14。如果我移动该方法,我猜我将能够将 i 的值传递给它。
    【解决方案3】:

    我想知道编译器没有抱怨您的代码:您在匿名内部 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");
      }});
    ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-06
      • 2016-01-15
      • 2020-03-19
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      相关资源
      最近更新 更多