2017年9月16日土曜日

テキストエディタをJavaで作成する計画2

前回に続きまして、じっくり一晩考えてみてテキストエディタの機能を決めました。

メニュー
├── ファイル
   ├── 新規作成
   ├── 開く
   ├── 上書き保存
   ├── 名前を付けて保存
   ├── 印刷
   └── 閉じる
├── 編集
   ├── 元に戻す
   ├── やり直す
   ├── すべて選択
   ├── 切り取り
   ├── コピー
   ├── 貼り付け
   ├── 検索
   └── 置換
├── 表示
   ├── 右端で折り返す
   └── フォント
└── ヘルプ
    └── バージョン情報

もう十分ですね。これくらいならなんとかなるでしょう。というかほとんどメモ帳と同じになってしまいました。
右クリックの機能は一旦保留にします。

問題なのは印刷ですね。作ったことないのでどう実装するのか分かりません。
あとフォントは設定が残るようにしないといけないので、設定ファイルがいりそうです。

まだまだ仕様がふわふわしてますけど、SceneBuilderを使ってとりあえず画面だけ作ってみます。



画面だけなら5分でできました!
もう完成したような気持ちになるけど、保存とかできませんからね。
青空文庫から「吾輩は猫である」をそのまま貼ってみますと、動作が結構重くなりました。
そして長い横スクロールもあってすごく使いにくいです。
TextAreaにwrapText="true" を付け加えると治りました。

<TextArea prefHeight="200.0" prefWidth="200.0" wrapText="true" BorderPane.alignment="CENTER" />



この部分はメニューの[右端で折り返す]の機能なので、またコードを少しいじらないといけないですね。
ちなみに動作はさらに重たくなった感じしますが、どうしようもないですね。

次はメニューで何か選択された時に呼び出されるメソッドの名前を定義します。

メニュー
├── ファイル
   ├── 新規作成・・・・・・private void newAction(ActionEvent event)
   ├── 開く・・・・・・・・private void openAction(ActionEvent event)
   ├── 上書き保存・・・・・private void saveAction(ActionEvent event)
   ├── 名前を付けて保存・・private void saveAsAction(ActionEvent event)
   ├── 印刷・・・・・・・・private void printAction(ActionEvent event)
   └── 閉じる・・・・・・・private void closeAction(ActionEvent event)
├── 編集
   ├── 元に戻す・・・・・・private void undoAction(ActionEvent event)
   ├── やり直す・・・・・・private void redoAction(ActionEvent event)
   ├── すべて選択・・・・・private void selectAllAction(ActionEvent event)
   ├── 切り取り・・・・・・private void cutAction(ActionEvent event)
   ├── コピー・・・・・・・private void copyAction(ActionEvent event)
   ├── 貼り付け・・・・・・private void pasteAction(ActionEvent event)
   ├── 検索・・・・・・・・private void findAction(ActionEvent event)
   └── 置換・・・・・・・・private void replaceAction(ActionEvent event)
├── 表示
   ├── 右端で折り返す・・・private void wrapAction(ActionEvent event)
   └── フォント・・・・・・private void fontAction(ActionEvent event)
└── ヘルプ

    └── バージョン情報・・・private void aboutAction(ActionEvent event)

こんな感じでしょうか。
あと下の方に、行数とか処理内容とか表示されたら良さそうなので、Labelも画面に追加しました。




例えばフォントを選択すると下に「フォント」と出てきます。
「右端で折り返す」はデフォルトがtrueのCheckMenuItemにしてあります。

【FXMLDocumentController.java】
public class FXMLDocumentController implements Initializable {
 
    @FXML
    private Label bottomLabel;
 
    @FXML
    private void newAction(ActionEvent event) {
        bottomLabel.setText("新規作成");
    }
    ・
    ・
    ・
}

【FXMLDocument.fxml】
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="textediter01.FXMLDocumentController">
    <top>
        <MenuBar BorderPane.alignment="CENTER">
            <menus>
                <Menu mnemonicParsing="false" text="ファイル">
                    <items>
                        <MenuItem mnemonicParsing="false" onAction="#newAction" text="新規作成" />
                        <MenuItem mnemonicParsing="false" onAction="#openAction" text="開く" />
                        <MenuItem mnemonicParsing="false" onAction="#saveAction" text="上書き保存" />
                        <MenuItem mnemonicParsing="false" onAction="#saveAsAction" text="名前を付けて保存" />
                        <MenuItem mnemonicParsing="false" onAction="#printAction" text="印刷" />
                        <MenuItem mnemonicParsing="false" onAction="#closeAction" text="閉じる" />
                    </items>
                </Menu>
                <Menu mnemonicParsing="false" text="編集">
                    <items>
                        <MenuItem mnemonicParsing="false" onAction="#undoAction" text="元に戻す" />
                        <MenuItem mnemonicParsing="false" onAction="#redoAction" text="やり直す" />
                        <MenuItem mnemonicParsing="false" onAction="#selectAllAction" text="すべて選択" />
                        <MenuItem mnemonicParsing="false" onAction="#cutAction" text="切り取り" />
                        <MenuItem mnemonicParsing="false" onAction="#copyAction" text="コピー" />
                        <MenuItem mnemonicParsing="false" onAction="#pasteAction" text="貼り付け" />
                        <MenuItem mnemonicParsing="false" onAction="#findAction" text="検索" />
                        <MenuItem mnemonicParsing="false" onAction="#replaceAction" text="置換" />
                    </items>
                </Menu>
                <Menu mnemonicParsing="false" text="表示">
                    <items>
                        <CheckMenuItem mnemonicParsing="false" onAction="#wrapAction" selected="true" text="右端で折り返す" />
                        <MenuItem mnemonicParsing="false" onAction="#fontAction" text="フォント" />
                    </items>
                </Menu>
                <Menu mnemonicParsing="false" text="ヘルプ">
                    <items>
                        <MenuItem mnemonicParsing="false" onAction="#aboutAction" text="バージョン情報" />
                    </items>
                </Menu>
            </menus>
        </MenuBar>
    </top>
    <center>
        <TextArea prefHeight="200.0" prefWidth="200.0" wrapText="false" BorderPane.alignment="CENTER" />
    </center>
   <bottom>
      <Label fx:id="bottomLabel" BorderPane.alignment="CENTER_LEFT" />
   </bottom>
</BorderPane>

次回に続く。。。かも



0 件のコメント:

コメントを投稿