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

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

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

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

Swing

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

Q&A

解決済

2回答

1033閲覧

TextListenerを実装できない

araucaria321

総合スコア5

Java

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

Swing

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

1グッド

0クリップ

投稿2019/11/24 14:05

前提・実現したいこと

JavaでSwingを使ってオリジナルのアプリケーションとしてテキストエディタを製作しています。
ファイルを読み込んだ直後、または新規ファイルを作った後に、表示されているテキストエリアに何かしらの変更が行われたとき、ウィンドウのタイトルに*を表示させるたいと思い、TextListenerを実装しようとしているのですが、コンパイルが上手くいきません。

発生している問題・エラーメッセージ

Sample007_2.java:28: エラー: シンボルを見つけられません textarea.addTextListener(this); ^ シンボル: メソッド addTextListener(Sample007_2) 場所: タイプJTextAreaの変数 textarea エラー1個

該当のソースコード

Java

1import javax.swing.*; 2import java.awt.Container; 3import java.awt.BorderLayout; 4import java.awt.event.*; 5import java.awt.Font; 6import java.io.*; 7 8class Sample007_2 extends JFrame implements ActionListener, TextListener { 9 10 11 File file; 12 FileReader filereader; 13 FileWriter filewriter; 14 JTextArea textarea; 15 JMenuItem menuitem0_0, menuitem0_1, menuitem0_2, menuitem0_3; 16 JMenuItem menuitem1_0, menuitem1_1, menuitem1_2; 17 StringBuilder sb = new StringBuilder(); 18 19 /*コンストラクタ*/ 20 Sample007_2(String title) { 21 setTitle(title); 22 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 23 setSize(1024, 768); 24 25 textarea = new JTextArea(); 26 textarea.setLineWrap(true); 27 textarea.setFont(new Font("MS 明朝", Font.PLAIN, 24) ); 28 textarea.addTextListener(this); 29 JScrollPane scrollpane = new JScrollPane(textarea); 30 scrollpane.setViewportView(textarea); 31 32 JMenuBar menubar = new JMenuBar(); 33 JMenu menu0 = new JMenu("ファイル"); 34 JMenu menu1 = new JMenu("編集"); 35 36 menuitem0_0 = new JMenuItem("新規作成"); 37 menuitem0_1 = new JMenuItem("開く"); 38 menuitem0_2 = new JMenuItem("上書き保存"); 39 menuitem0_3 = new JMenuItem("名前を付けて保存"); 40 41 menuitem1_0 = new JMenuItem("コピー"); 42 menuitem1_1 = new JMenuItem("切り取り"); 43 menuitem1_2 = new JMenuItem("貼り付け"); 44 45 menuitem0_0.addActionListener(this); 46 menuitem0_1.addActionListener(this); 47 menuitem0_2.addActionListener(this); 48 menuitem0_3.addActionListener(this); 49 menuitem1_0.addActionListener(this); 50 menuitem1_1.addActionListener(this); 51 menuitem1_2.addActionListener(this); 52 53 menubar.add(menu0); 54 menubar.add(menu1); 55 menu0.add(menuitem0_0); 56 menu0.add(menuitem0_1); 57 menu0.add(menuitem0_2); 58 menu0.add(menuitem0_3); 59 menu1.add(menuitem1_0); 60 menu1.add(menuitem1_1); 61 menu1.add(menuitem1_2); 62 63 setJMenuBar(menubar); 64 65 getContentPane().add(scrollpane, BorderLayout.CENTER); 66 } 67 68 public void actionPerformed(ActionEvent eAct) { 69 Object obj = eAct.getSource(); 70 if(obj == menuitem0_0) { /*新規作成*/ 71 file = null; 72 textarea.setText(""); 73 setTitle("無題 - テキストエディタ007_2"); 74 } else if(obj == menuitem0_1) { /*開く*/ 75 JFileChooser filechooser = new JFileChooser(); 76 77 int selected = filechooser.showOpenDialog(this); 78 if (selected == JFileChooser.APPROVE_OPTION) { 79 file = filechooser.getSelectedFile(); 80 81 try { 82 filereader = new FileReader(file); 83 84 int ch; 85 while ( (ch = filereader.read() ) != -1) { 86 sb.append( (char)ch); 87 } 88 89 textarea.setText(sb.toString() ); 90 sb.setLength(0); 91 setTitle(file.getName() + " - テキストエディタ007_2"); 92 filereader.close(); 93 } catch (FileNotFoundException e_FNF) { 94 System.out.println(e_FNF); 95 } catch (IOException e_IO) { 96 System.out.println(e_IO); 97 } 98 } 99 } else if(obj == menuitem0_2) { /*上書き保存*/ 100 try { 101 if (file == null) { 102 saveAs(); 103 } else { 104 filewriter = new FileWriter(file); 105 filewriter.write(textarea.getText() ); 106 filewriter.close(); 107 setTitle(file.getName() + " - テキストエディタ007_2"); 108 } 109 } catch (IOException e_IO) { 110 System.out.println(e_IO); 111 } 112 } else if(obj == menuitem0_3) { /*名前を付けて保存*/ 113 saveAs(); 114 } else if(obj == menuitem1_0) { /*コピー*/ 115 textarea.copy(); 116 } else if(obj == menuitem1_1) { /*切り取り*/ 117 textarea.cut(); 118 } else if(obj == menuitem1_2) { /*貼り付け*/ 119 textarea.paste(); 120 } 121 } 122 123 void saveAs() { 124 JFileChooser filechooser = new JFileChooser(); 125 126 int selected = filechooser.showSaveDialog(this); 127 if (selected == JFileChooser.APPROVE_OPTION) { 128 file = filechooser.getSelectedFile(); 129 try { 130 filewriter = new FileWriter(file); 131 filewriter.write(textarea.getText() ); 132 filewriter.close(); 133 setTitle(file.getName() + " - テキストエディタ007_2"); 134 } catch (IOException e_IO) { 135 System.out.println(e_IO); 136 } 137 } 138 } 139 140 public void textValueChanged(TextEvent e_TE) { 141 if(file == null) { 142 setTitle("*無題 - テキストエディタ007_2"); 143 } else { 144 setTitle("*" + file.getName() + " - テキストエディタ007_2"); 145 } 146 } 147 148 public static void main(String[] args) { 149 Sample007_2 frame = new Sample007_2("無題 - テキストエディタ007_2"); 150 frame.setVisible(true); 151 } 152 153}

試したこと

TextListenerをコンストラクターの中で匿名クラスとして記述するやり方を試してみましたが上手くいきませんでした。
8行目のTextListenerの部分
28行目、
140行目から146行目までの内容を削除したところ、コンパイルもプログラムの実行も成功しています。
本プログラムを書くにあたって、以下のサイトを参考にしています。

「Let'sプログラミング」
https://www.javadrive.jp/

補足

teratailを使わせていただくのは初めてになります。
またコードを他人に見せるのも初めてです。
コードを書いて、それで動いたらその上に機能を建て増しする、というやり方でプログラムを書いていて、コードの見やすさや作法なんかも意識せずにこれまで書いてきました。
他の人にとって見づらいかどうかすらわからない身ですが、

TN8001👍を押しています

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

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

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

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

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

guest

回答2

0

addTextListener は TextArea(AWT) のメソッドで, JTextArea(Swing) には無いと思います.

投稿2019/11/24 16:52

jimbe

総合スコア12543

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

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

araucaria321

2019/12/01 07:05

ありがとうございます TextListenerはJFrameでは使えないというのは全く知りませんでした。 おかげさまで無事解決できました。 返信遅れて大変申し訳ありません。
jimbe

2019/12/01 09:02

まずドキュメントを見る癖(?)を付けるようにされますと宜しいかと思います.
guest

0

ベストアンサー

textarea.addTextListener()は、AWT(Jが付かない方)のメソッドみたいですね。
JTextAreaで同等のものはtextarea.getDocument().addDocumentListener()になるようです。


追記
細かい動作は見ていませんが、タイトルに*がつくのは確認できました。

Java

1import java.awt.BorderLayout; 2import java.awt.Font; 3import java.awt.event.ActionEvent; 4import java.awt.event.ActionListener; 5import java.io.*; 6import javax.swing.*; 7import javax.swing.event.DocumentEvent; 8import javax.swing.event.DocumentListener; 9 10class Sample007_2 extends JFrame implements ActionListener, /*TextListener,*/ DocumentListener { 11 12 13 File file; 14 FileReader filereader; 15 FileWriter filewriter; 16 JTextArea textarea; 17 JMenuItem menuitem0_0, menuitem0_1, menuitem0_2, menuitem0_3; 18 JMenuItem menuitem1_0, menuitem1_1, menuitem1_2; 19 StringBuilder sb = new StringBuilder(); 20 21 /*コンストラクタ*/ 22 Sample007_2(String title) { 23 setTitle(title); 24 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 25 setSize(1024, 768); 26 27 textarea = new JTextArea(); 28 textarea.setLineWrap(true); 29 textarea.setFont(new Font("MS 明朝", Font.PLAIN, 24)); 30// textarea.addTextListener(this); 31 textarea.getDocument().addDocumentListener(this); 32 JScrollPane scrollpane = new JScrollPane(textarea); 33 scrollpane.setViewportView(textarea); 34 35 JMenuBar menubar = new JMenuBar(); 36 JMenu menu0 = new JMenu("ファイル"); 37 JMenu menu1 = new JMenu("編集"); 38 39 menuitem0_0 = new JMenuItem("新規作成"); 40 menuitem0_1 = new JMenuItem("開く"); 41 menuitem0_2 = new JMenuItem("上書き保存"); 42 menuitem0_3 = new JMenuItem("名前を付けて保存"); 43 44 menuitem1_0 = new JMenuItem("コピー"); 45 menuitem1_1 = new JMenuItem("切り取り"); 46 menuitem1_2 = new JMenuItem("貼り付け"); 47 48 menuitem0_0.addActionListener(this); 49 menuitem0_1.addActionListener(this); 50 menuitem0_2.addActionListener(this); 51 menuitem0_3.addActionListener(this); 52 menuitem1_0.addActionListener(this); 53 menuitem1_1.addActionListener(this); 54 menuitem1_2.addActionListener(this); 55 56 menubar.add(menu0); 57 menubar.add(menu1); 58 menu0.add(menuitem0_0); 59 menu0.add(menuitem0_1); 60 menu0.add(menuitem0_2); 61 menu0.add(menuitem0_3); 62 menu1.add(menuitem1_0); 63 menu1.add(menuitem1_1); 64 menu1.add(menuitem1_2); 65 66 setJMenuBar(menubar); 67 68 getContentPane().add(scrollpane, BorderLayout.CENTER); 69 } 70 71 public void actionPerformed(ActionEvent eAct) { 72 Object obj = eAct.getSource(); 73 if (obj == menuitem0_0) { /*新規作成*/ 74 file = null; 75 textarea.setText(""); 76 setTitle("無題 - テキストエディタ007_2"); 77 } else if (obj == menuitem0_1) { /*開く*/ 78 JFileChooser filechooser = new JFileChooser(); 79 80 int selected = filechooser.showOpenDialog(this); 81 if (selected == JFileChooser.APPROVE_OPTION) { 82 file = filechooser.getSelectedFile(); 83 84 try { 85 filereader = new FileReader(file); 86 87 int ch; 88 while ((ch = filereader.read()) != -1) { 89 sb.append((char) ch); 90 } 91 92 textarea.setText(sb.toString()); 93 sb.setLength(0); 94 setTitle(file.getName() + " - テキストエディタ007_2"); 95 filereader.close(); 96 } catch (FileNotFoundException e_FNF) { 97 System.out.println(e_FNF); 98 } catch (IOException e_IO) { 99 System.out.println(e_IO); 100 } 101 } 102 } else if (obj == menuitem0_2) { /*上書き保存*/ 103 try { 104 if (file == null) { 105 saveAs(); 106 } else { 107 filewriter = new FileWriter(file); 108 filewriter.write(textarea.getText()); 109 filewriter.close(); 110 setTitle(file.getName() + " - テキストエディタ007_2"); 111 } 112 } catch (IOException e_IO) { 113 System.out.println(e_IO); 114 } 115 } else if (obj == menuitem0_3) { /*名前を付けて保存*/ 116 saveAs(); 117 } else if (obj == menuitem1_0) { /*コピー*/ 118 textarea.copy(); 119 } else if (obj == menuitem1_1) { /*切り取り*/ 120 textarea.cut(); 121 } else if (obj == menuitem1_2) { /*貼り付け*/ 122 textarea.paste(); 123 } 124 } 125 126 void saveAs() { 127 JFileChooser filechooser = new JFileChooser(); 128 129 int selected = filechooser.showSaveDialog(this); 130 if (selected == JFileChooser.APPROVE_OPTION) { 131 file = filechooser.getSelectedFile(); 132 try { 133 filewriter = new FileWriter(file); 134 filewriter.write(textarea.getText()); 135 filewriter.close(); 136 setTitle(file.getName() + " - テキストエディタ007_2"); 137 } catch (IOException e_IO) { 138 System.out.println(e_IO); 139 } 140 } 141 } 142 143// public void textValueChanged(TextEvent e_TE) { 144// if (file == null) { 145// setTitle("*無題 - テキストエディタ007_2"); 146// } else { 147// setTitle("*" + file.getName() + " - テキストエディタ007_2"); 148// } 149// } 150 151 @Override 152 public void insertUpdate(DocumentEvent e) { 153 if (file == null) { 154 setTitle("*無題 - テキストエディタ007_2"); 155 } else { 156 setTitle("*" + file.getName() + " - テキストエディタ007_2"); 157 } 158 } 159 160 @Override 161 public void removeUpdate(DocumentEvent e) { 162 if (file == null) { 163 setTitle("*無題 - テキストエディタ007_2"); 164 } else { 165 setTitle("*" + file.getName() + " - テキストエディタ007_2"); 166 } 167 } 168 169 @Override 170 public void changedUpdate(DocumentEvent e) { 171 } 172 173 public static void main(String[] args) { 174 Sample007_2 frame = new Sample007_2("無題 - テキストエディタ007_2"); 175 frame.setVisible(true); 176 } 177}

投稿2019/11/24 17:27

編集2019/11/30 12:46
TN8001

総合スコア9242

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

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

araucaria321

2019/12/01 07:05

ありがとうございます。 細かく書いていただき大変助かります。 おかげさまで無事解決できました。 今回はよりこちらの回答の方が個人的に分かりやすく感じたため、こちらの回答をベストアンサーにさせていただきます。 返信遅れて大変申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問