Javaで2つのJTextareasを接続する(更新) -- java フィールド と swing フィールド と actionlistener フィールド と jtextarea フィールド 関連 問題

connecting two JTextAreas in java (updating)












2
vote

問題

日本語

私はユーザーが束を入力できる大きなJtextareaを持っています。私のプログラムでは、ユーザーはいくつかのテキストを選択して、選択したテキストを狭い分析(編集など)で小さいJTextareasを作成できます。

ユーザは、より大きなまたは小さいJTextAreasを更新することができ、そうすると、他のテキストもこの新しいテキストに更新されます。

私の問題は、大きなJtextareaと小さいもののテキストを取得しています。これを行うのに良い方法はありますか?私は、大きなテキスト領域を上に分割し、同時にドキュメントリスナーを使用している時間が困難です。小さいテキスト領域からのテキストの重なりがあると困難になります。

ex。 「大文字の大文字」 こんにちは。私の名前はMatthieuで、私はこれらすべてのテキストボックスにイライラしています:p。

「小さいテキスト領域」

  1. こんにちは。

  2. これらすべてのテキストボックス:p。

  3. テキストボックス:p。

  4. 2の「apple」に「テキストボックス」を変更した場合、ボックス3と全文がそれに応じて更新する必要があります。

英語

I have a large JTextArea where users can input a bunch of text. My program allows users to select some text and create smaller JTextAreas with the selected text for closer analysis (editing, etc).

The users can update the larger or smaller JTextAreas and when they do, I want the other to update to this new text as well.

My problem is getting the text in the large JTextArea and the smaller ones to reference each other. Is there a good way of doing this? I am having a difficult time splitting up the large text area and using document listeners at the same time. It becomes difficult when there is an overlap of text from the smaller text areas..

ex. "large text area" Hello. My name is Matthieu and I am getting frustrated with all these text boxes :p.

"smaller text areas"

  1. Hello.

  2. all these text boxes :p.

  3. text boxes :p.

if I change "text boxes" to "apple" in 2, then box 3 and the full text should update accordingly!

</div
           
   
   

回答リスト

1
 
vote

これはあなたが聞きたいものではなく、それは非常に悪い考えのように聞こえます...最初の理由は、コードとデザインで管理することが非常に複雑であるという事実です。 2番目の理由は、ユーザーが使用するのが複雑になることです...

本当にこれを実装したいのなら、編集中のスニペットのリストを保持し、開始インデックス、元のテキストを含むそのリストにアイテムを追加することです。テキストボックスそれは編集中です。

それから任意のテキストボックス内で変更されたときはいつでも、メソッドを実行してすべてのテキストボックスへの変更を実行し、リスト内のすべての項目を更新したオリジナルのテキストと開始インデックスを使用して更新します。

私は正直にこれを行うための簡単な方法を見ることができず、あなたが持っているテキストボックスがより遅くなるでしょう。

私の意見のはるかに良いデザインは、(大きなテキストボックスとして)静的テキストを表示しているテキストを表示するだけで、選択したテキストを表示し、編集を許可する単一のテキストボックスを表示するだけです。これは符号化をかなり簡潔にするが(おそらくさらに重要なことに)、それはユーザインタフェースをはるかに単純で洗浄機にする。

これを必要とする理由を正確に知らずに、2番目の方法がより良いことを確信できませんが、私はむしろユーザーとしてより単純なアプリを使用します。

 

This is probably not what you want to hear, but that sounds like a very bad idea... The first reason is the fact that it is very complicated to manage in the code and design. The second reason is that it makes it more complex for the user to use...

If you really want to implement it this way, I would say the best way would be to keep a list of snippets that are being edited, and add an item to that list that contains the starting index, the original text and which textbox it is being edited in.

Then whenever any changes are made in any textbox, run a method to make the changes to all the textboxes and also updates all the items in the list with updated original text and starting indexes.

I honestly can't see a simple way to do this, and the more textboxes you have, the slower it will get as well.

A much better design in my opinion would be something like a JEditorpane to just display the text (As the big textbox) showing the static text, with a single textbox that displays the selected text and allows editing. This makes the coding pretty trivial, but (Possibly even more importantly), it makes the user interface much simpler and cleaner.

Without knowing exactly why you need this, i can't be sure that the second way would be better, but I would rather use a simpler app as a user.

</div
 
 
 
 
1
 
vote

これはあなたが最終結果が得られるものに応じて、非常に難しいかもしれません。それはあなたが選択開始を追跡し、各ボックスと一緒に終わる必要があるように見えます。 #2でテキストが変更されると、#2の起動索引から始まりEnd Indexで終わる元の長いテキストを置き換えることができます。それは大丈夫かもしれません。

#2の途中で「ダム」を挿入するようなものをするのであれば、問題があると思う場合です。 #3でそれをどのように処理しますか? #3のスタートインデックスを修正するか、#3が参照しているテキストをシフトさせるように、「ダムテストB」と表示されますか?

これをコードする前に、あなたが少なくとも起こりたいのか、少なくとも:

のために論理的に働くべきだと思います。
  • 文字の挿入
  • 文字を削除する
  • 文字を変更する

で、おそらくあなたのリスナーと文字ベースでそれを処理します。それはすべてあなたが最終結果を得たいものに依存します。

 

This could be very difficult, depending on what you want the end result to be. It looks to me like you'd need to track the selection beginning and ending along with each of the boxes. As the text is changed in #2, you could replace the original long text starting at the #2 start index and ending at the end index. That could be ok.

Where I see a problem is if you do something like insert "dumb" in the middle of #2. How would you handle that in #3? Would you shift the start index of #3 to compensate, or would you shift the text that #3 is referencing so it says "dumb test b"?

Before you code this more, I think you should logically work through what you want to happen for, at the least:

  • inserting characters
  • deleting characters
  • changing characters

And probably handle it on a character by character basis with your listeners. It all depends on what you want the end result to be.

</div
 
 
1
 
vote

あなたがする必要があるのは、Jtextareaをサブクラス化してインターフェースを使用することだけです。インターフェースは、メインテキスト領域が更新されたことをサブテキスト領域に知らせるために使用できます。

2つのサブクラスが必要になります。 1つはメインテキスト領域になり、もう1つはサブパネルのためのものです。サブパネルにインターフェイスを実装しても、親が更新されるとデータが表示されます。それから彼らは彼らがどのように選ぶかを処理することができます。

サブテキスト領域はメインテキスト領域

に登録されています

これは実用的な例です:

main.java. これはデモ

を実行します <前> <コード> package Text; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JScrollPane; /** * * @author dvargo */ public class Main { public static void main(String [] args) { //build the main text area JFrame mainFrame = new JFrame(); mainFrame.setSize(700,700); mainFrame.setTitle("Main Frame"); mainFrame.setLayout(new GridLayout()); //build a sub text area JFrame subFrameA = new JFrame(); subFrameA.setTitle("Sub Frame A"); subFrameA.setSize(300,300); subFrameA.setLayout(new GridLayout()); subFrameA.setLocation(mainFrame.getX() + mainFrame.getWidth() + 25, mainFrame.getY()); //build another sub text area JFrame subFrameB = new JFrame(); subFrameB.setTitle("Sub Frame b"); subFrameB.setSize(300,300); subFrameB.setLayout(new GridLayout()); subFrameB.setLocation(subFrameA.getX() + subFrameA.getWidth() + 50, subFrameA.getY()); //this is the main text area. Anything typed into here will be sent to the sub text areas TextField mainTextField = new TextField("Type here and text will appear in the sub frames!!!"); //this sub text area will just mirror the main text area SubTextField subTextFieldA = new SubTextField(); //this sub text area will add a "-" to the begining of every line SubTextField subTextFieldB = new SubTextField() { @Override public void update(String text, char lastPressedChar) { super.update("- " + text.replace(" ", " - "),lastPressedChar); } }; //register the sub text areas with the main text areas mainTextField.register(subTextFieldA); mainTextField.register(subTextFieldB); //add them to their frames mainFrame.add(new JScrollPane(mainTextField)); subFrameA.add(new JScrollPane(subTextFieldA)); subFrameB.add(new JScrollPane(subTextFieldB)); //make everything visible mainFrame.setVisible(true); subFrameA.setVisible(true); subFrameB.setVisible(true); } }

i_subtextfield.java.

を実装するためのすべてのサブテキスト領域のインタフェース <前> <コード> package Text; /** * Interface to implement to be notified when the text has changed * @author dvargo */ public interface I_SubTextField { public void update(String text, char lastChar); }

TextField.java. これをメインテキスト領域として使用する

<前> <コード> package Text; import java.util.ArrayList; import java.util.List; import javax.swing.JTextArea; /** * Text area * @author dvargo */ public class TextField extends JTextArea { //holds all registered sub text areas that are registered for updates List &lt I_SubTextField &gt registeredSubTextAreas = new ArrayList &lt I_SubTextField &gt (); /** * Default constructor */ public TextField() { this(""); } /** * Constructor * @param text Sets this text area to display this text */ public TextField(String text) { super(text); addListener(); } /** * Registers a sub text area to get updates when this text area is updated * @param subTextArea */ public void register(I_SubTextField subTextArea) { registeredSubTextAreas.add(subTextArea); } /** * Unregisters a sub text area to stop receiving updates * @param subTextField */ public void unRegister(I_SubTextField subTextField) { registeredSubTextAreas.remove(subTextField); } /** * Notifies all registered classes when the data in the main window has changed */ private void addListener() { addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent evt) { for (I_SubTextField registeredField : registeredSubTextAreas) { registeredField.update(TextField.this.getText(), evt.getKeyChar()); } } }); } }

subtextfield.java. これをすべてのサブテキスト領域に使用する

<前> <コード> package Text; /** * Represents a sub text area. This can be registered with a TextField to be notified * when the data has been updated * @author dvargo */ public class SubTextField extends TextField implements I_SubTextField { /** * Default constructor */ public SubTextField() { super(); } /** * Constructor * @param text Text to display in the text area */ public SubTextField(String text) { super(text); } /** * Called when the parent TextField is updated. Handle the text as you want * @param text The text for the main parent * @param lastPressedChar The last char the user pressed */ public void update(String text, char lastPressedChar) { setText(text); } }

サブテキストフィールドがTextFieldのサブクラスのクラスであるため、サブテキストフィールドをサブテキストフィールドに登録できます。

互いに登録するように設定し、未処理のテキストを互いに送信することができます。それから各サブテキストフィールドはそれが望む方法をテキストを処理することができます。すべてのY OUは更新(​​)

を上書きすることです。
 

All you need to do is subclass the JTextArea and use an interface. The interface can be used to let the sub text areas know that the main text area has been updated.

You will need two subclasses. One will be the main text area, the other will be for the sub panels. Have the sub panels implement an interface so when the parent is updated, they receive the data. Then they can process it how they choose.

The sub text areas are registered with the main text area

Here is a working example:

Main.java This runs the demo

   package Text;  import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JScrollPane;   /**  *  * @author dvargo  */ public class Main {     public static void main(String [] args)     {         //build the main text area         JFrame mainFrame = new JFrame();         mainFrame.setSize(700,700);         mainFrame.setTitle("Main Frame");         mainFrame.setLayout(new GridLayout());          //build a sub text area         JFrame subFrameA = new JFrame();         subFrameA.setTitle("Sub Frame A");         subFrameA.setSize(300,300);         subFrameA.setLayout(new GridLayout());         subFrameA.setLocation(mainFrame.getX() + mainFrame.getWidth() + 25, mainFrame.getY());          //build another sub text area         JFrame subFrameB = new JFrame();         subFrameB.setTitle("Sub Frame b");         subFrameB.setSize(300,300);         subFrameB.setLayout(new GridLayout());         subFrameB.setLocation(subFrameA.getX() + subFrameA.getWidth() + 50, subFrameA.getY());          //this is the main text area. Anything typed into here will be sent to the sub text areas         TextField mainTextField = new TextField("Type here and text will appear in the sub frames!!!");          //this sub text area will just mirror the main text area         SubTextField subTextFieldA = new SubTextField();          //this sub text area will add a "-" to the begining of every line         SubTextField subTextFieldB = new SubTextField()         {              @Override             public void update(String text, char lastPressedChar)             {                 super.update("- " + text.replace(" ", " - "),lastPressedChar);             }         };          //register the sub text areas with the main text areas         mainTextField.register(subTextFieldA);         mainTextField.register(subTextFieldB);          //add them to their frames         mainFrame.add(new JScrollPane(mainTextField));         subFrameA.add(new JScrollPane(subTextFieldA));         subFrameB.add(new JScrollPane(subTextFieldB));          //make everything visible         mainFrame.setVisible(true);         subFrameA.setVisible(true);         subFrameB.setVisible(true);      } }   

I_SubTextField.java Interface for all sub text areas to implement

  package Text;  /**  * Interface to implement to be notified when the text has changed  * @author dvargo  */ public interface I_SubTextField {     public void update(String text, char lastChar); }   

TextField.java Use this as your main text area

  package Text;  import java.util.ArrayList; import java.util.List; import javax.swing.JTextArea;  /**  * Text area  * @author dvargo  */ public class TextField extends JTextArea {     //holds all registered sub text areas that are registered for updates     List &lt I_SubTextField &gt registeredSubTextAreas = new ArrayList &lt I_SubTextField &gt ();      /**      * Default constructor      */     public TextField()     {         this("");     }      /**      * Constructor      * @param text Sets this text area to display this text      */     public TextField(String text)     {         super(text);         addListener();     }      /**      * Registers a sub text area to get updates when this text area is updated      * @param subTextArea      */     public void register(I_SubTextField subTextArea)     {         registeredSubTextAreas.add(subTextArea);     }      /**      * Unregisters a sub text area to stop receiving updates      * @param subTextField      */     public void unRegister(I_SubTextField subTextField)     {         registeredSubTextAreas.remove(subTextField);     }      /**      * Notifies all registered classes when the data in the main window has changed      */     private void addListener()     {         addKeyListener(new java.awt.event.KeyAdapter()         {             public void keyReleased(java.awt.event.KeyEvent evt)             {                 for (I_SubTextField registeredField : registeredSubTextAreas)                 {                     registeredField.update(TextField.this.getText(), evt.getKeyChar());                 }             }         });     }  }   

SubTextField.java Use this for all sub text areas

  package Text;  /**  * Represents a sub text area. This can be registered with a TextField to be notified  * when the data has been updated  * @author dvargo  */ public class SubTextField extends TextField implements I_SubTextField {      /**      * Default constructor      */     public SubTextField()     {         super();     }      /**      * Constructor      * @param text Text to display in the text area      */     public SubTextField(String text)     {         super(text);     }      /**      * Called when the parent TextField is updated. Handle the text as you want      * @param text The text for the main parent      * @param lastPressedChar The last char the user pressed      */     public void update(String text, char lastPressedChar)     {         setText(text);     }  }   

Notice that the SubTextField is a sub class of TextField so you can register additional SubTextFields to a SubTextField.

You can set them up to register with each other and send the unprocessed text to each other. Then each SubTextField can process the text the way it wants. All y ou need to do is override the update()

</div
 
 
 
 
1
 
vote

すべてのテキスト領域で同じモデル(文書)を使用します。希望のフラグメントのみを表示するには、JTextAreaで使用されているビューを上書きしてください。 (プレーンビューソースを参照)。

 

I would use the same model (Document) in all the text areas. Try to override the View used in JTextArea to show only desired fragment. (See PlainView sources).

</div
 
 

関連する質問

1  各タブにテキストエリアが異なるJavaを持つTextAreaがあるJTabbedPaneにタブを追加する  ( Add tab to jtabbedpane where each tab has a textarea with a different name java ) 
JTabbedPaneにタブを動的に追加しようとしています次のコードでこれを行います。 <事前> <コード> private tab = new JTabbedPane(); frame.add(tab, BorderLayout.CENTER); pu...

1  JTextAreaに整数の配列を表示する方法  ( How to display an array of integers in a jtextarea ) 
<事前> <コード> for (int j =0; j < marks.size(); j++) { analyzeTextArea.setText(j + marks.get(j)); } 上記のコードは、次のエラーを与えます: <事前> <コー...

2  JTextarea Scrollableを作ります  ( Make a jtextarea scrollable ) 
次の JTextArea Scrollable? <事前> <コード> private JTextArea getJTextArea1() { if (jTextArea1 == null) { jTextArea1 = ne...

0  GUI JTextareaでのJTIDYエラー/警告メッセージの表示  ( Displaying jtidy error warning messages in a gui jtextarea ) 
URLから取得したソースコードからHTMLをクリーンアップするためにJTIDYを使用するプログラムを書いています。 JTextareaのGUIでエラーや警告を表示したいです。印刷から標準地への警告を「Reroute」になるのでしょうか。私はJTIDY API...

0  Javaのテキストエリアに.BATファイルをリダイレクト  ( Redirecting bat file to java textarea ) 
それはJTextAreaの内部に内容のJButtonと出力とのonclick実行されているバッチファイルをリダイレクトすると表示され、CMDプロンプトウィンドウを維持することは可能ですか?だから、基本的にJTextAreaには、コンソールとして機能します。 ...

10  ラッピングによって引き起こされたものを含む、JTextareaの行数を数える方法?  ( How to count the number of lines in a jtextarea including those caused by wrapp ) 
私はJTextareaを持っています。指定された幅を考えると、JTextareaを最低限の高さに「パック」したいです。 これを行うには、フォントの高さを計算しています... <事前> <コード> Font font = jTextArea.getFont...

0  JavaアプリケーションでJTextAreaにインポートするときに.txtファイルのレイアウトを保つ方法は?  ( How to keep same layout of txt file when importing it into jtextarea in a java ) 
私は.txtファイルから読み取られ、それから書き込みよりも JTextArea に読み込んでいます。しかし問題は、レイアウトが一貫していないことです(この写真に見られるように: テキスト領域はタブレータを認識しないと思います。誰かがテキスト領域に同じレイ...

1  JTextareaがスクロールすることができません。  ( Unable to make the jtextarea scrollable ) 
これは私のコードです: <事前> <コード> final JTextArea textArea = new JTextArea(); textArea.setFont(new Font("MS UI Gothic", Font.PLAIN, 13)); tex...

0  jtextareaが親JScrollPaneを強制的にスクロールします  ( Jtextarea forces the parent jscrollpane to scroll down ) 
私はJScrollPaneの内側にパネルを持っており、データがサービスから受信したときにパネルにパネルをコンポーネントに入力します。パネルはGridBagLayoutを使用します(ただし、それは無関係なはずです)。サービスから戻ってきたレコードごとに、いくつか...

-1  jtextarea / fieldでテキストが設定されていません  ( Text not setting in jtextarea field ) 
JTextareaとJTextFieldにテキストを設定する問題が発生しています...私は以前にテキストを設定したので少し混乱しています。実際には、この同じプログラムの別のクラスでそれらを設定しました問題がない... NULLでないか空の「」を確認するように...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有