前提・実現したいこと
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を使わせていただくのは初めてになります。
またコードを他人に見せるのも初めてです。
コードを書いて、それで動いたらその上に機能を建て増しする、というやり方でプログラムを書いていて、コードの見やすさや作法なんかも意識せずにこれまで書いてきました。
他の人にとって見づらいかどうかすらわからない身ですが、
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/01 07:05
2019/12/01 09:02