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

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

ただいまの
回答率

90.35%

  • Java

    14388questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swing

    231questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

JavaのSwingを使用したテキストフィールドの「元に戻す」機能実装について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 532
退会済みユーザー

退会済みユーザー

Swingを使ってメモ帳を作成しており「元に戻す」機能を追加したいです。
下記サイトを参考に実装しようとしましたが、119行目でエラーが出てしまいます。
エラーの内容は分かっているのですが、私としてはうまい具合にクラス分割したいと思っています。
しかし、そのクラス分割の方法が思いつかないのでご教示いただきたいです。

8.2.1 テキストのデータモデル

package component;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.UndoableEdit;

import common.FilePopUp;

public class MainFrame extends JFrame implements UndoableEditListener {

    private UndoableEdit undo = null;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainFrame frame = new MainFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public MainFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 639, 379);

        JMenuBar menuBar = new JMenuBar();
        setJMenuBar(menuBar);
        // ファイルメニュー ここから
        JMenu faileMenu = new JMenu("ファイル(F) ");
        faileMenu.setFont(new Font("メイリオ", Font.PLAIN, 15));
        menuBar.add(faileMenu);

        JMenuItem fileSave = new JMenuItem("新規(N)                        Ctrl+N");
        fileSave.setFont(new Font("メイリオ", Font.PLAIN, 15));
        fileSave.setHorizontalAlignment(SwingConstants.LEFT);
        faileMenu.add(fileSave);

        JMenuItem fileOpen = new JMenuItem("開く(O)...                     Ctrl+O");
        fileOpen.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                FilePopUp.fileLoad();
            }
        });
        fileOpen.setFont(new Font("メイリオ", Font.PLAIN, 15));
        fileOpen.setHorizontalAlignment(SwingConstants.LEFT);
        faileMenu.add(fileOpen);

        JMenuItem fileOverwriteSave = new JMenuItem("上書き保存(S)               Ctrl+S");
        fileOverwriteSave.setFont(new Font("メイリオ", Font.PLAIN, 15));
        fileOverwriteSave.setHorizontalAlignment(SwingConstants.LEFT);
        faileMenu.add(fileOverwriteSave);

        JMenuItem fileNameSave = new JMenuItem("名前を付けて保存(A)...");
        fileNameSave.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                FilePopUp.fileSave();
            }
        });
        fileNameSave.setFont(new Font("メイリオ", Font.PLAIN, 15));
        fileNameSave.setHorizontalAlignment(SwingConstants.LEFT);
        faileMenu.add(fileNameSave);

        faileMenu.addSeparator();

        JMenuItem filePageConfig = new JMenuItem("ページ設定(U)...");
        filePageConfig.setFont(new Font("メイリオ", Font.PLAIN, 15));
        filePageConfig.setHorizontalAlignment(SwingConstants.LEFT);
        faileMenu.add(filePageConfig);

        JMenuItem filePagePrint = new JMenuItem("印刷(P)...                      Ctrl+P");
        filePagePrint.setFont(new Font("メイリオ", Font.PLAIN, 15));
        filePagePrint.setHorizontalAlignment(SwingConstants.LEFT);
        faileMenu.add(filePagePrint);

        faileMenu.addSeparator();

        JMenuItem fileMemoExit = new JMenuItem("メモ帳の終了(X)");
        fileMemoExit.setHorizontalAlignment(SwingConstants.LEFT);
        fileMemoExit.setFont(new Font("メイリオ", Font.PLAIN, 15));
        faileMenu.add(fileMemoExit);
        // ファイルメニュー ここまで

        // 編集メニュー ここから
        JMenu editMenu = new JMenu("編集(E) ");
        editMenu.setFont(new Font("メイリオ", Font.PLAIN, 15));
        menuBar.add(editMenu);

        JMenuItem editUndo = new JMenuItem("元に戻す(U)          Ctrl+Z");
        editUndo.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                // ここに「元に戻す」機能を追加したい!!
                undoableEditHappened(e);
                editUndo.setEnabled(undo.canUndo());
            }
        });
        editUndo.setHorizontalAlignment(SwingConstants.LEFT);
        editUndo.setFont(new Font("メイリオ", Font.PLAIN, 15));
        editMenu.add(editUndo);

        editMenu.addSeparator();

        JMenuItem editTrim = new JMenuItem("切り取り(T)          Ctrl+X");
        editTrim.setHorizontalAlignment(SwingConstants.LEFT);
        editTrim.setFont(new Font("メイリオ", Font.PLAIN, 15));
        editMenu.add(editTrim);

        JMenuItem editCopy = new JMenuItem("コピー(C)             Ctrl+C");
        editCopy.setHorizontalAlignment(SwingConstants.LEFT);
        editCopy.setFont(new Font("メイリオ", Font.PLAIN, 15));
        editMenu.add(editCopy);

        JMenuItem editDel = new JMenuItem("削除(L)                     Del");
        editDel.setHorizontalAlignment(SwingConstants.LEFT);
        editDel.setFont(new Font("メイリオ", Font.PLAIN, 15));
        editMenu.add(editDel);

        editMenu.addSeparator();

        JMenuItem editFind = new JMenuItem("検索(F)                Ctrl+F");
        editFind.setHorizontalAlignment(SwingConstants.LEFT);
        editFind.setFont(new Font("メイリオ", Font.PLAIN, 15));
        editMenu.add(editFind);

        JMenuItem editFindNext = new JMenuItem("次を検索(N)                F3");
        editFindNext.setHorizontalAlignment(SwingConstants.LEFT);
        editFindNext.setFont(new Font("メイリオ", Font.PLAIN, 15));
        editMenu.add(editFindNext);

        JMenuItem editReplace = new JMenuItem("置換(R)...             Ctrl+H");
        editReplace.setHorizontalAlignment(SwingConstants.LEFT);
        editReplace.setFont(new Font("メイリオ", Font.PLAIN, 15));
        editMenu.add(editReplace);

        JMenuItem editGoRow = new JMenuItem("行へ移動(G)...       Ctrl+G");
        editGoRow.setHorizontalAlignment(SwingConstants.LEFT);
        editGoRow.setFont(new Font("メイリオ", Font.PLAIN, 15));
        editMenu.add(editGoRow);

        editMenu.addSeparator();

        JMenuItem editSelectAll = new JMenuItem("すべて選択(A)       Ctrl+A");
        editSelectAll.setHorizontalAlignment(SwingConstants.LEFT);
        editSelectAll.setFont(new Font("メイリオ", Font.PLAIN, 15));
        editMenu.add(editSelectAll);

        JMenuItem editTime = new JMenuItem("日付と時刻(D)             F5");
        editTime.setHorizontalAlignment(SwingConstants.LEFT);
        editTime.setFont(new Font("メイリオ", Font.PLAIN, 15));
        editMenu.add(editTime);
        // 編集メニュー ここまで

        // 書式メニュー ここから
        JMenu fontMenu = new JMenu("書式(O) ");
        fontMenu.setFont(new Font("メイリオ", Font.PLAIN, 15));
        menuBar.add(fontMenu);

        JMenuItem fontRightReturn = new JMenuItem("右端で折り返す(W)     ");
        fontRightReturn.setFont(new Font("メイリオ", Font.PLAIN, 15));
        fontRightReturn.setHorizontalAlignment(SwingConstants.LEFT);
        fontMenu.add(fontRightReturn);

        JMenuItem fontFont = new JMenuItem("フォント(F)...");
        fontFont.setFont(new Font("メイリオ", Font.PLAIN, 15));
        fontFont.setHorizontalAlignment(SwingConstants.LEFT);
        fontMenu.add(fontFont);
        // 書式メニュー ここまで

        // 表示メニュー ここから
        JMenu viewMenu = new JMenu("表示(E) ");
        viewMenu.setFont(new Font("メイリオ", Font.PLAIN, 15));
        menuBar.add(viewMenu);

        JMenuItem viewStatus = new JMenuItem("ステータスバー(S)");
        viewStatus.setFont(new Font("メイリオ", Font.PLAIN, 15));
        viewStatus.setHorizontalAlignment(SwingConstants.LEFT);
        viewMenu.add(viewStatus);
        // 表示メニュー ここまで

        // ヘルプメニュー ここから
        JMenu helpMenu = new JMenu("ヘルプ(H) ");
        helpMenu.setFont(new Font("メイリオ", Font.PLAIN, 15));
        menuBar.add(helpMenu);

        JMenuItem helpHelp = new JMenuItem("ヘルプの表示(H)");
        helpHelp.setFont(new Font("メイリオ", Font.PLAIN, 15));
        helpHelp.setHorizontalAlignment(SwingConstants.LEFT);
        helpMenu.add(helpHelp);

        helpMenu.addSeparator();

        JMenuItem helpVersion = new JMenuItem("バージョン情報(A)");
        helpVersion.setFont(new Font("メイリオ", Font.PLAIN, 15));
        helpVersion.setHorizontalAlignment(SwingConstants.LEFT);
        helpMenu.add(helpVersion);
        // ヘルプメニュー ここまで

        getContentPane().setLayout(null);
        getContentPane().setLayout(new BorderLayout(0, 0));

        JScrollPane scrollPane = new JScrollPane();
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setViewportBorder(null);

        // テキストエリア
        JTextArea textArea = new JTextArea();
        textArea.setFont(new Font("MS ゴシック", Font.PLAIN, 18));
        scrollPane.setViewportView(textArea);
    }

    @Override
    public void undoableEditHappened(UndoableEditEvent e) {
        undo = e.getEdit();
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

119行目でエラーが出てしまいます。

閲覧者に119行目がどこか非常に分かりにくいです。本件に関係ないコードを削除してコードを整理した上で「ここの行でこのコンパイルエラーが出る」というように発生している問題点を明快にすべきです。

エラーの内容は分かっているのですが、私としてはうまい具合にクラス分割したいと思っています。
しかし、そのクラス分割の方法が思いつかないのでご教示いただきたいです。 

エラーの内容がわかっているならまずそれを直し、そのコードを提示した上で「これをクラス分割したい」というような質問にすべきだと思います。今の質問文だと「どこになんというエラーが出ているのかが分かりにくい上に質問者さんがエラーの内容をどうわかっているのか曖昧」ですので読者がどこに焦点を当てればよいかわからないと思います。

コードを見た限りではエディターのドキュメントへUndoableEditListenerを登録するという基本的な部分のコードが欠落しています。このため私には「あなたが必要としているのはUndo/RedoをとりあえずMainFrameクラスへ実装することであり、クラス分割を気にするのはその後でもよい」という気がしました。参照されているページを参考にしてとりあえずこのMainFrameクラス上へ最も単純な1段階のみのUndo/Redo機能を実装してみてはいかがでしょうか?(MainFrameクラスがごちゃごちゃしすぎるほど複雑にはならないと思います)

Undo/Redoの実装はとりあえずできるがクラス分割したいということであればUndo/Redo実装後のコードを提示した上で助言を求める方がより的確なアドバイスが得られると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/04 15:58

    ご回答ありがとうございます。
    そうします。

    キャンセル

同じタグがついた質問を見る

  • Java

    14388questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Swing

    231questions

    SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。