JavaFXにてノートアプリを作っており、ロジックについて悩んでいます。
テキストエリア内にて、Ctrl + Cキーを押すと、
現在のキャレット位置から1行を取得し、クリップボードにコピーをしたいと考えております。
JavaFXのTextInputControlには、ちょうどよく対応するメソッドが無いので、
どのように実装するか調べてますが見つからなく困っております。
JavaFXで主題の処理が可能なメソッドはありますでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
テキストエリア内にて、Ctrl + Cキーを押すと、
現在のキャレット位置から1行を取得し、クリップボードにコピーをしたいと考えております。
Ctrl + C
の動作をオーバーライドすることはできました。
java - how to overwrite system default keyboard shortcuts like Ctrl+C, Ctrl+V by using Javafx KeyCombination? - Stack Overflow
JavaFXで主題の処理が可能なメソッドはありますでしょうか。
こう聞かれるとお調べになった通り、「ないです。」ということになりそうですが^^;
何か実現方法がないかと考え、↓で行けるかなーと思い試してみました。
- アンカー・カーソル位置を保存
Home
キーを送るShift + End
キーを送る- コピー
- アンカー・カーソル位置を復元
注)ショートカットは面倒なので参考サイトのままメニュー経由
Java
1import java.util.Set; 2 3import javafx.application.Application; 4import javafx.event.Event; 5import javafx.event.EventDispatchChain; 6import javafx.event.EventDispatcher; 7import javafx.scene.Scene; 8import javafx.scene.control.Menu; 9import javafx.scene.control.MenuBar; 10import javafx.scene.control.MenuItem; 11import javafx.scene.control.TextArea; 12import javafx.scene.input.KeyCode; 13import javafx.scene.input.KeyCombination; 14import javafx.scene.input.KeyEvent; 15import javafx.scene.layout.Priority; 16import javafx.scene.layout.VBox; 17import javafx.stage.Stage; 18 19public class Main extends Application { 20 public static void main(String[] args) { launch(args); } 21 22 private static KeyEvent HOME = new KeyEvent(KeyEvent.KEY_PRESSED, null, null, KeyCode.HOME, false, false, false, false); 23 private static KeyEvent SHIFT_END = new KeyEvent(KeyEvent.KEY_PRESSED, null, null, KeyCode.END, true, false, false, false); 24 25 private TextArea area = new TextArea(); 26 27 @Override public void start(Stage primaryStage) { 28 var copyItem = new MenuItem("Copy"); 29 copyItem.setAccelerator(KeyCombination.valueOf("shortcut+c")); 30 copyItem.setOnAction(e -> { 31 var anchor = area.getAnchor(); 32 var caret = area.getCaretPosition(); 33 34 Event.fireEvent(area, HOME); 35 Event.fireEvent(area, SHIFT_END); 36 area.copy(); 37 area.selectRange(anchor, caret); 38 }); 39 40 var dispatcher = new FilteringEventDispatcher(area.getEventDispatcher(), copyItem.getAccelerator()); 41 area.setEventDispatcher(dispatcher); 42 43 var root = new VBox(new MenuBar(new Menu("Edit", null, copyItem)), area); 44 VBox.setVgrow(area, Priority.ALWAYS); 45 46 primaryStage.setScene(new Scene(root, 600, 400)); 47 primaryStage.show(); 48 } 49 50 //[java - how to overwrite system default keyboard shortcuts like Ctrl+C, Ctrl+V by using Javafx KeyCombination? - Stack Overflow](https://stackoverflow.com/questions/61072150/how-to-overwrite-system-default-keyboard-shortcuts-like-ctrlc-ctrlv-by-using) 51 private static class FilteringEventDispatcher implements EventDispatcher { 52 private final EventDispatcher delegate; 53 private final Set<KeyCombination> blacklistedCombos; 54 55 public FilteringEventDispatcher(EventDispatcher delegate, KeyCombination... blacklistedCombos) { 56 this.delegate = delegate; 57 this.blacklistedCombos = Set.of(blacklistedCombos); 58 } 59 60 @Override public Event dispatchEvent(Event event, EventDispatchChain tail) { 61 if (!(event instanceof KeyEvent) || isPermitted((KeyEvent) event)) { 62 return delegate.dispatchEvent(event, tail); 63 } 64 return event; 65 } 66 67 private boolean isPermitted(KeyEvent event) { 68 return blacklistedCombos.stream().noneMatch(combo -> combo.match(event)); 69 } 70 } 71}
非常に雑な感じですが、これでできました^^;
一瞬選択が見えたりするかなとも思いましたが、手元では全く感じませんでした。
TextAreaはエディタとして使うには、メソッドが少なすぎですね(内部にはあるはずなんですが)
この先さらに機能追加を考えているのであれば、サードパーティーのコントロールを検討したほうがいいかもしれません。
使ったことないので何ができるか知りませんが、このようなもの。
FXMisc/RichTextFX: Rich-text area for JavaFX
投稿2021/06/21 10:08
総合スコア9884
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/21 13:27