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 キーを押した後、次のテキスト エリアに移動するにはどうすればよいですか?

すみません、質問が多すぎます..ははは。前にThx :)

4

2 に答える 2

1

配列は、固定サイズのデータ​​構造に使用するためのものです。新しく作成されたテキスト領域を追跡しようとするコードは、混乱しすぎてエラーが発生しやすくなっています。新しい配列を作成し、古い配列からデータをコピーすることは、非常に混乱し、エラーが発生しやすく、不必要です。

テキストエリアを動的に作成したい場合は、ArrayList のような動的ストレージを使用してください。次に、新しく作成したテキスト領域を ArrayList に追加するだけです。したがって、クラス変数として、次のような ArrayList を作成します。

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

使用するテキストコンポーネントを追加するには:

components.add(...);

ArrayList から要素を「取得」する方法については、API を参照してください。

ENTER キーを押すたびに、テキスト エリアが作成され、前のテキスト エリアに改行が追加されます。ブレークラインを削除するアイデアはありますか?

Enter キーのデフォルト アクションは、改行文字列をテキスト領域に追加します。このアクションは引き続き 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 に答える