質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Q&A

解決済

1回答

1134閲覧

テキストエリア内でキャレット位置の1行を取得する

sakuraicamp

総合スコア16

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

1グッド

0クリップ

投稿2021/06/20 14:58

JavaFXにてノートアプリを作っており、ロジックについて悩んでいます。

テキストエリア内にて、Ctrl + Cキーを押すと、
現在のキャレット位置から1行を取得し、クリップボードにコピーをしたいと考えております。

JavaFXのTextInputControlには、ちょうどよく対応するメソッドが無いので、
どのように実装するか調べてますが見つからなく困っております。

JavaFXで主題の処理が可能なメソッドはありますでしょうか。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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で主題の処理が可能なメソッドはありますでしょうか。

こう聞かれるとお調べになった通り、「ないです。」ということになりそうですが^^;

何か実現方法がないかと考え、↓で行けるかなーと思い試してみました。

  1. アンカー・カーソル位置を保存
  2. Homeキーを送る
  3. Shift + Endキーを送る
  4. コピー
  5. アンカー・カーソル位置を復元

注)ショートカットは面倒なので参考サイトのままメニュー経由

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}

非常に雑な感じですが、これでできました^^;
一瞬選択が見えたりするかなとも思いましたが、手元では全く感じませんでした。

KeyEvent (JavaFX 8)


TextAreaはエディタとして使うには、メソッドが少なすぎですね(内部にはあるはずなんですが)

この先さらに機能追加を考えているのであれば、サードパーティーのコントロールを検討したほうがいいかもしれません。
使ったことないので何ができるか知りませんが、このようなもの。
FXMisc/RichTextFX: Rich-text area for JavaFX

投稿2021/06/21 10:08

TN8001

総合スコア9396

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakuraicamp

2021/06/21 13:27

TN8001さん 返信ありがとうございます。 代替え案まで投稿いただきまして、本当にありがとうございます。 参考にさせていただきます(おそらくそのまま使います)。 確かにメソッドがちょっと少ない印象でした。。 記載いただいたRichTextFXも利用を検討させたいただきます。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問