【问题标题】:Updating dynamic TextArea in Java在 Java 中更新动态 TextArea
【发布时间】:2013-05-20 16:56:53
【问题描述】:

我正在尝试使用 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 键后如何转到下一个文本区域?

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

【问题讨论】:

    标签: java swing jtextarea enter text-editor


    【解决方案1】:

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

    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);
        }    
    }
    

    `

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

    【讨论】:

    • 谢谢!!第二个和第三个问题怎么样..哈哈。顺便说一句,你能解释一下private static final long serialVersionUID = 1L;这一行吗?
    • 我有第二个问题的想法。如果我可以在 textarea 字符串中插入“退格”,我会得到答案!你能做到吗?
    • 你可以去掉'private static final long serialVersionUID = 1L;' ,我添加它是因为警告。我刚刚更新了您的问题 2 和 3 的代码,您可以再次检查它是否可以解决您的问题。解决方案是“requestFocus()”
    • 不错!还有一个问题..哈哈哈。假设我们已经有 3 个文本区域。我们可以检测我们现在使用的文本区域吗?所以,我想将我的动态数组文本区域更改为列表。这样我就可以在中间列表中插入新的文本区域。但是,我不知道我是如何知道以前文本区域的索引的。假设我单击第二个文本区域。结果将是:TextArea1 - TextArea2 - TextArea4 - TextArea3
    • 检测哪个文本区域正在使用,我认为方法是getFocusOwner(),API可以参考以下链接:getFocusOwner()
    【解决方案2】:

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

    如果您想动态创建文本区域,请使用动态存储,如 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);
    

    请参阅Key Bindings 了解更多信息,包括指向键绑定的 Swing 教程的链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多