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

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

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

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

Swing

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

Q&A

解決済

1回答

2165閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Swing

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

0グッド

0クリップ

投稿2017/03/04 02:15

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(); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

エラーの内容は分かっているのですが、私としてはうまい具合にクラス分割したいと思っています。

しかし、そのクラス分割の方法が思いつかないのでご教示いただきたいです。

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

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

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

投稿2017/03/04 04:34

KSwordOfHaste

総合スコア18394

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

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

退会済みユーザー

退会済みユーザー

2017/03/04 06:58

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問