Все, что вам нужно сделать, это создать подкласс JTextArea и использовать интерфейс. Интерфейс может использоваться, чтобы сообщить областям подтекста, что основная область текста обновлена.
Вам понадобятся два подкласса. Одна будет основной текстовой областью, другая - для вспомогательных панелей. Пусть вспомогательные панели реализуют интерфейс, чтобы при обновлении родительского элемента они получали данные. Затем они могут обработать его так, как они выберут.
Подтекстовые области зарегистрированы с основной текстовой областью
Вот рабочий пример:
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("\n", "\n- "),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 < I_SubTextField > registeredSubTextAreas = new ArrayList < I_SubTextField > ();
/**
* 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);
}
}
Обратите внимание, что SubTextField является подклассом TextField, поэтому вы можете зарегистрировать дополнительные SubTextFields в SubTextField.
Вы можете настроить их на регистрацию друг друга и отправку необработанного текста друг другу. Затем каждый SubTextField может обрабатывать текст так, как он хочет. Все, что вам нужно сделать, это переопределить обновление ()