- ベストアンサー
JTextAreaの文字列が表示されない
- EclipseでJavaの勉強をしており、Apache POIを用いてエクセルの操作を行いたい場合、JTextAreaの文字列が表示されない問題が発生しています。
- 質問者は、WindowBuilderを使用してフレームの設計を行っていますが、ボタンの方は正常に動作する一方で、メニューの方が正常に動作しないことに気づきました。
- さらに、質問者はWindowBuilderを始めたばかりであるため、各コンポーネントのアクセス修飾子についても疑問を抱えています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 どうしてもこのクラス構成で作りたいのであれば以下のようにすれば良いと思います。 (途中は割愛します) ==== Menu.java(先頭大文字にしました。Javaの推奨クラス名です) private JMenuItem menuItem; // ExcelTestを保持する変数 private ExcelTest f_excelTest; public Menu ( ExcelTest _excelTest ) { // コンストラクタにExcelTestを受け取るように引数を追加 // 受け取ったExcelTestをフィールド変数へ f_excelTest = _excelTest } public void actionPerformed(ActionEvent e) { //========= 中略 // TestExcel excel = new TestExcel(); // cell.setCellValue(excel.getTextAreaText()); // 上記では新しくTestExcelクラスを生成しているので取得できない // なのでコンストラクタで受け取ったExcelTestクラスより取得 cell.setCellValue(f_excelTest.getTextAreaText()); } ==== TestExcel.java //menu = new menu(); // コンストラクタにExcelTestすなわち自分自身(this)を渡すように修正 menu = new Menu(this); >Button等各コンポーネントのアクセス修飾子はデフォルトだと全てprivateなのですが WindowBuilderを使ったことが無いのでちがっていたらすみません。 private JButton button; private JTextArea textArea; と定義されるということでしょうか。 変えても良いですが、自分がクラス設計する場合でもそのクラス内で利用されている部品に関してはprivateにします。 外部クラスからのアクセスが必要であればその必要なもののみアクセスできるようにします。 例えばTextAreaの内容を取得したいのであれば private JTextArea textArea = new JTextArea(); public String getText() { return textArea.getText(); } とします。textAreaはあくまでprivateとして外部から参照できるようにpublicのgetText()を用意します。 この辺は「カプセル化」みたいなワードで検索すると有益な情報が出てくると思います。
その他の回答 (1)
- tyatsumi
- ベストアンサー率58% (30/51)
ExcelTest excel = new ExcelTest(); cell.setCellValue(excel.getTextAreaText()); となっているので、main で生成されて表示されているExcelTestインスタンスとは違う新しく生成されたExelTestインスタンスのテキストエリアを読んでしまっている。 対策としては、menuにExcelTestの参照を渡しておいて、menu内のメソッドから表示されているExcelTestのテキストエリアを参照できるようにするなどの方法が考えられる。 対策案。 menuクラスは public class menu extends JPanel implements ActionListener { private ExcelTest exel; public menu(ExcelTest exel) { this.exel = exel; ... } のような感じにして、 ExcelTest.initializeでは menu = new menu(this); のようにExcelTestインスタンスの参照を渡す。 あとはmenuクラス内の ExcelTest excel = new ExcelTest(); の行を削除して、excelとしては新しく作ったメンバ private excel; を使うようにする。 これでどうでしょう。
お礼
お陰様で上手く行きました!丁寧なご回答、ありがとうございます。
お礼
成程・・・勉強になりました!ご回答、ありがとうございます。