※ ChatGPTを利用し、要約された質問です(原文:JTextAreaの文字列が表示されない)
JTextAreaの文字列が表示されない
このQ&Aのポイント
EclipseでJavaの勉強をしており、Apache POIを用いてエクセルの操作を行いたい場合、JTextAreaの文字列が表示されない問題が発生しています。
質問者は、WindowBuilderを使用してフレームの設計を行っていますが、ボタンの方は正常に動作する一方で、メニューの方が正常に動作しないことに気づきました。
さらに、質問者はWindowBuilderを始めたばかりであるため、各コンポーネントのアクセス修飾子についても疑問を抱えています。
閲覧ありがとうございます。
現在eclipseでjavaの勉強をしており、Apache POIを使ってエクセルの操作をしたいと思い以下のプログラムを組んでみたのですが、ボタンの方は上手く動作したのですがメニューの方が上手く動作しません・・・やりたい事は以下の通りです。
・[ファイル]-[ファイルを作成]をクリックすると、保存ダイアログが表示され指定したディレクトリにtextAreaの内容が1行目、1列目のセルに表示されているxlsファイルを作成する
また、ついでに教えて頂きたいのですが、WindowBuilderを使用しフレームの設計をする際、Button等各コンポーネントのアクセス修飾子はデフォルトだと全てprivateなのですが、この修飾子はプログラム中で変更しても問題無いでしょうか?WindowBuilderはつい最近使い始めたばかりでまだ慣れてないので・・・
以下がソースです。開発環境はeclipse Indigo3.7で、WindowBuilderを使用しています。言語はJavaです。(字数オーバーしたので、import文は省略しています。
■ExcelTest.java
public class ExcelTest implements ActionListener {
private JFrame frame;
private JTextArea textArea;
private JButton btnwo;
private menu menu;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ExcelTest window = new ExcelTest();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public ExcelTest() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textArea = new JTextArea();
frame.getContentPane().add(textArea, BorderLayout.CENTER);
btnwo = new JButton("ファイルを作成");
btnwo.addActionListener(this);
frame.getContentPane().add(btnwo, BorderLayout.WEST);
menu = new menu();
frame.getContentPane().add(menu, BorderLayout.NORTH);
}
//ボタンの動作
// こちらは上手く動作する
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
int selected = chooser.showSaveDialog(null);
if (selected == JFileChooser.APPROVE_OPTION) {
String path = chooser.getSelectedFile().getPath(); // パスを取得
System.out.println(path); // パスを表示
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(0); // 1行目を作成
Cell cell = row.createCell(0); // 1行目の1列目にセルを作成
cell.setCellValue(getTextAreaText()); // テキストエリアの文字列を表示
try {
FileOutputStream fo = new FileOutputStream(path + ".xls");
wb.write(fo);
fo.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
public String getTextAreaText() {
return textArea.getText(); // テキストエリアの文字列を取得
}
}
■menu.java
public class menu extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private JMenuItem menuItem;
public menu() {
setLayout(new BorderLayout(0, 0));
JMenuBar menuBar = new JMenuBar();
add(menuBar, BorderLayout.NORTH);
JMenu menu = new JMenu("ファイル");
menuBar.add(menu);
menuItem = new JMenuItem("ファイルを作成");
menuItem.addActionListener(this);
menu.add(menuItem);
}
//メニューの動作
// こちらが上手く動作しない
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
int selected = chooser.showSaveDialog(null);
if (selected == JFileChooser.APPROVE_OPTION) {
String path = chooser.getSelectedFile().getPath(); // パスを取得
System.out.println(path); // パスを表示
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(0); // 1行目を作成
Cell cell = row.createCell(0); // 1行目の1列目にセルを作成
ExcelTest excel = new ExcelTest();
cell.setCellValue(excel.getTextAreaText());
try {
FileOutputStream fo = new FileOutputStream(path + ".xls");
wb.write(fo);
fo.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
お礼
成程・・・勉強になりました!ご回答、ありがとうございます。