0

我正在尝试使用 Java 中的动态文本区域创建简单的文本编辑器。

该应用程序一开始只有 1 个文本区域。每次我按 ENTER 键时,应用程序都会创建一个新的文本区域。这是工作!哈哈。但是,当我尝试更改以前的文本区域时,该文本区域没有改变。问题是因为我以前的文本区域已经在容器中。所以,我的问题是我们如何更新容器中的所有文本区域?

看我的代码:

    import javax.swing.*;
    import javax.swing.text.*;
    import java.awt.*;
    import java.io.*;
    import java.awt.event.*;

    public class SimpleEditor extends JFrame {

            int count = 0;
            Container content = getContentPane();

            private JTextComponent[] textComp;

            public static void main(String[] args) {
                    SimpleEditor editor = new SimpleEditor();
                    editor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    editor.setVisible(true);
            }

            // Create an editor.
            public SimpleEditor() {
                    super("Swing Editor");
                    dinamicTA();
                    content.setLayout(new FlowLayout());

                    for(int i=0;i<count;i++) {
                            content.add(textComp[i]);
                    }

                    pack();
                    content.setSize(content.getPreferredSize());
                    pack();
            }

            //create DINAMIC TEXT AREA
            public void dinamicTA () {
                    if(count==0) {
                            textComp = new JTextComponent[1];
                            textComp[0] = createTextComponent();
                            count+=1;
                    }
                    else {
                            JTextComponent[] texttemp;
                            texttemp = new JTextComponent[count];
                            for(int i=0;i<count;i++) {
                                    texttemp[i] = createTextComponent();
                            }
                            count+=1;
                            textComp = new JTextComponent[count];
                            for(int i=0;i<count-1;i++) {
                                    textComp[i] = createTextComponent();
                                    //textComp[i].setText(texttemp[i].getText()+"wow"); <-- not working
                            }
                            textComp[count-1] = createTextComponent();
                            content.add(textComp[count-1]);
                    }
            }

            // Create the JTextComponent subclass.
            protected JTextComponent createTextComponent() {
                    JTextArea ta = new JTextArea();
                    if (count%2==0)
                            ta.setForeground(Color.red);
                    else
                            ta.setForeground(Color.GREEN);
                    ta.setFont(new Font("Courier New",Font.PLAIN,12));
                    ta.setLineWrap(true);                                                                                                                           
                    ta.setWrapStyleWord(true);  
                    ta.addKeyListener(new java.awt.event.KeyAdapter() {
                            public void keyReleased(java.awt.event.KeyEvent ev) {
                                    taKeyReleased(ev);
                            }
                    });

                    ta.setColumns(15);
                    pack();
                    ta.setSize(ta.getPreferredSize());
                    pack();

                    return ta;
            }

            private void taKeyReleased(java.awt.event.KeyEvent ev) { 
                    int key = ev.getKeyCode();
                    if (key == KeyEvent.VK_ENTER) {
                            dinamicTA();

                            pack();
                            content.setSize(content.getPreferredSize());
                            pack();
                    }
            }
    }

还有2个问题。每次我按 ENTER 键时,都会创建文本区域,并且前一个文本区域会得到一个断线。你有什么想法删除断线吗?下一个问题:按 ENTER 键而不单击新文本区域后如何转到下一个文本区域?

抱歉,问题太多了..哈哈哈。谢谢之前:)

4

2 回答 2

1

数组旨在用于固定大小的数据结构。您尝试跟踪新创建的文本区域的代码太混乱且容易出错。创建新数组并从旧数组复制数据太混乱、容易出错且不必要。

如果要动态创建文本区域,请使用动态存储,如 ArrayList。然后您只需将新创建的文本区域添加到 ArrayList。因此,作为一个类变量,您创建 ArrayList 如下:

ArrayList<JTextComponent> components = new ArrayList<JTextComponent>();

添加您刚刚使用的文本组件:

components.add(...);

我将让您查看 API 以了解如何从 ArrayList 中“获取”元素。

每次我按 ENTER 键时,都会创建文本区域,并且前一个文本区域会得到一个断线。你有什么想法删除断线吗?

Enter 键的默认操作将换行字符串添加到文本区域。此 Action 仍与 KeyListener 一起执行

所以,不要使用 KeyListener。相反,您需要用您的自定义操作替换默认操作。执行此操作的代码类似于:

Action enter = new AbstractAction()
{
    public void actionPerformed(ActionEvent e)
    {
        // add your MouseListener code here
    }
});
textArea.getActionMap().put("insert-break", enter);

有关更多信息,请参阅键绑定,包括指向键绑定的 Swing 教程的链接。

于 2013-05-25T04:58:42.997 回答
0

对于您的第一个问题,我将代码更改为`

import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;

public class SimpleEditor extends JFrame {

        /**
     * 
     */
    private static final long serialVersionUID = 1L;
        int count = 0;
        Container content = getContentPane();

        private JTextComponent[] textComp;
        // Create an editor.
        public SimpleEditor() {
                super("Swing Editor");
                dinamicTA();
                content.setLayout(new FlowLayout());

                for(int i=0;i<count;i++) {
                        content.add(textComp[i]);
                }

                pack();
                content.setSize(content.getPreferredSize());
                pack();
        }

        //create DINAMIC TEXT AREA
        public void dinamicTA () {
                if(count==0) {
                        textComp = new JTextComponent[1];
                        textComp[0] = createTextComponent();
                        count+=1;
                }
                else {
                        JTextComponent[] texttemp;
                        texttemp = textComp;
                        count+=1;
                        textComp = new JTextComponent[count];
                        for(int i=0;i<count-1;i++) {
                                textComp[i] = texttemp[i];
                                textComp[i].setText(textComp[i].getText()+"wow"); //<-- not working
                        }
                        textComp[count-1] = createTextComponent();
                        content.add(textComp[count-1]);
                        textComp[count-1].requestFocus(); //get focus
                }
        }

        // Create the JTextComponent subclass.
        protected JTextComponent createTextComponent() {
                final JTextArea ta = new JTextArea();
                if (count%2==0)
                        ta.setForeground(Color.red);
                else
                        ta.setForeground(Color.GREEN);
                ta.setFont(new Font("Courier New",Font.PLAIN,12));
                ta.setLineWrap(true);                                                                                                                           
                ta.setWrapStyleWord(true);  
                ta.addKeyListener(new java.awt.event.KeyAdapter() {
                        public void keyReleased(java.awt.event.KeyEvent ev) {
                                taKeyReleased(ev);
                        }
                });

                ta.setColumns(15);
                pack();
                ta.setSize(ta.getPreferredSize());
                pack();

                return ta;
        }

        private void taKeyReleased(java.awt.event.KeyEvent ev) { 
                int key = ev.getKeyCode();
                if (key == KeyEvent.VK_ENTER) {
                        dinamicTA();
                        pack();
                        content.setSize(content.getPreferredSize());
                        pack();
                }
        }

        public static void main(String[] args) {
            SimpleEditor editor = new SimpleEditor();
            editor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            editor.setVisible(true);
    }    
}

`

我认为原始代码的问题是:每次添加新组件时,都会丢失对以前组件的引用。

于 2013-05-25T04:31:11.340 回答