package application.root; import javafx.application.Platform; import javafx.embed.swing.SwingNode; import javafx.scene.Node; import javax.swing.*; import javax.swing.text.DefaultCaret; import java.awt.*; public class SwingTextAreaWrapper implements TextAreaWrapper { private static final int FONT_SIZE = 14; private static final String FONT_NAME = "monospaced"; public static final Font FONT = new Font(FONT_NAME, Font.PLAIN, FONT_SIZE); private final JTextArea textArea; private final SwingNode node; private final JPopupMenu popupMenu = new JPopupMenu(); private JMenuItem saveToFileMenu = new JMenuItem("Save to file");; public SwingTextAreaWrapper(JTextArea textArea) { this.textArea = textArea; textArea.setEditable(true); textArea.setFont(FONT); final DefaultCaret caret = (DefaultCaret) textArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); node = new SwingNode(); JScrollPane sp = new JScrollPane(textArea); textArea.setComponentPopupMenu(popupMenu); node.setContent(sp); popupMenu.add(saveToFileMenu); } @Override public void setText(String localBuffer) { textArea.setText(localBuffer); } @Override public void appendText(String s) { textArea.append(s); } @Override public void clear() { textArea.setText(""); } @Override public Node asNode() { return node; } @Override public void setPopupSaveToAction(Executable saveContentToFile) { saveToFileMenu.addActionListener(e -> Platform.runLater(saveContentToFile::execute)); } }