1

タブ付きペイン内のパネルにあるテキストエリアの内容を保存しようとしています。

これまでのところ、私は試しました:

bw.write(tabbedPane.getComponent(tabbedPane.getSelectedIndex()).toString());

タブペインのすべての方法を調べてきましたが、うまくいかないようです。から選択したコンポーネントを取得しtabbedPane、そこからテキストエリアを取得してから、それを文字列に変換する必要があることはわかっていますか?

ファイルを開くときのコードは次のとおりです。

private void btnOpenActionPerformed(java.awt.event.ActionEvent evt) {

    int returnVal = fileChooser.showOpenDialog(this);

    if (returnVal == fileChooser.APPROVE_OPTION) {
        File file = fileChooser.getSelectedFile();
        try {
            JPanel p = new JPanel();
            p.setLayout(new BorderLayout());

            JTextArea x = new JTextArea();
            JScrollPane scroll = new JScrollPane(x);
            p.add(scroll, BorderLayout.CENTER);            

            x.read( new FileReader( file.getAbsolutePath() ), null );
            File selectedFile = fileChooser.getSelectedFile();
            String name = selectedFile.getName();
            tabbedPane.add(p,name);
            tabbedPane.setSelectedComponent(p);
        } catch (IOException ex) {
            System.out.println("problem accessing file"+file.getAbsolutePath());
        }
    } else {
        System.out.println("File access cancelled by user.");
    }
}

Update Current SaveAs メソッドを主張したので、クラスを追加しました。

private void btnSaveAsActionPerformed(java.awt.event.ActionEvent evt) {

    int returnVal = fileChooser.showSaveDialog(this);

    if (returnVal == fileChooser.APPROVE_OPTION) {
        File dir1 = fileChooser.getCurrentDirectory();
        String dir = dir1.getPath();
        String name = fileChooser.getSelectedFile().getName() + ".txt";

        try {
            File file = new File(dir,name);
            FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);
            JPanel no = (JPanel) tabbedPane.getSelectedComponent();
            JTextArea bo = (JTextArea) no.get
            bw.write(bo.getText());
            bw.close();
            tabbedPane.setTitleAt(tabbedPane.getSelectedIndex(), name);
        } catch(Exception e) {
            System.out.println(e);
        }
    }
}

現在開いているファイルの方法:

private void btnOpenActionPerformed(java.awt.event.ActionEvent evt) {

    int returnVal = fileChooser.showOpenDialog(this);

    if (returnVal == fileChooser.APPROVE_OPTION) {
        File file = fileChooser.getSelectedFile();

        try {
            FilePanel p = new FilePanel(file);
            tabbedPane.add(p,p.getName());
            tabbedPane.setSelectedComponent(p);
        } catch (IOException ex) {
            System.out.println("problem accessing file"+file.getAbsolutePath());
        }
    } else {
        System.out.println("File access cancelled by user.");
    }
}

新しいクラスの新しいオブジェクトを配列に追加する必要がありますか?それとも、それらを tabbedPane に挿入するだけで問題ありませんか?

4

1 に答える 1

2

ここに魔法はありませんが、代わりに、コード化の方法がすべてです。getTextArea()JTextArea を保持するクラスには、JTextAreaを返すような public メソッドが必要です。次に、選択したタブのコンポーネントを 経由getSelectedComponent()で取得するときに、返されたコンポーネントでこのメソッドを呼び出します。


編集
投稿したコードに基づいて、プログラムの設計を再考する必要があります。JTextArea はローカル変数であるため、簡単にアクセスできません。そこに問題があります。私は提案します:

  • 何よりもまず、少なくとも Java と Swing の基本を理解するまでは、Swing コード生成ソフトウェアの使用をやめてください。この理解が妨げられるからです。
  • Java と Swing のチュートリアルを読んで、Swing を手作業でコーディングする方法を学んでください。
  • 特定のコンポーネントにアクセスする必要がある場合は、それらがクラス フィールドであることを確認し、ゲッター メソッドを介してアクセスできるようにするか、対象のコンポーネントの特定のプロパティのみにアクセスできるようにすることをお勧めします。たとえば、テキストを JTextArea に保持する必要がある場合はgetTextArea()、JTextArea を返すメソッドではなく、JTextArea がgetTextAreaText()保持するテキストを返すだけの を使用します。コードが外部の摂動と副作用に制限されているほど、より良い結果が得られます。

編集 2
たとえば、次のような JPanel で JTextArea を保持するクラスを作成できます。

class FilePanel extends JPanel {

   private File file;
   private JTextArea textArea;
   private String name;

   public FilePanel(File file) throws FileNotFoundException, IOException {
      this.file = file;
      setLayout(new BorderLayout());

      textArea = new JTextArea();
      JScrollPane scroll = new JScrollPane(textArea);
      add(scroll, BorderLayout.CENTER);

      textArea.read(new FileReader(file.getAbsolutePath()), null);
      name = file.getName();
   }

   public File getFile() {
      return file;
   }

   public JTextArea getTextArea() {
      return textArea;
   }

   public String getName() {
      return name;
   }

}

そして、JTextPane から selectedComponent を取得するたびに、それが null でないことを確認し、それを FilePanel にキャストして、getTextArea() を呼び出します。


編集 3
例:

import java.awt.*;
import java.awt.event.*;
import java.io.*;

import javax.swing.*;

public class FooSwing extends JFrame {
   private static final int PREF_W = 600;
   private static final int PREF_H = 450;
   private JFileChooser fileChooser = new JFileChooser();
   private JTabbedPane tabbedPane = new JTabbedPane();

   public FooSwing() {
      JPanel btnPanel = new JPanel();
      btnPanel.add(new JButton(new AbstractAction("Open") {

         @Override
         public void actionPerformed(ActionEvent e) {
            btnOpenActionPerformed(e);
         }
      }));
      btnPanel.add(new JButton(new AbstractAction("Get Selected Text") {

         @Override
         public void actionPerformed(ActionEvent e) {
            FilePanel selectedComp = (FilePanel)tabbedPane.getSelectedComponent();
            if (selectedComp != null) {
               String text = selectedComp.getTextArea().getText();
               System.out.println(text);
            } else {
               System.out.println("No component selected");
            }
         }
      }));

      add(tabbedPane, BorderLayout.CENTER);
      add(btnPanel, BorderLayout.SOUTH);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private void btnOpenActionPerformed(java.awt.event.ActionEvent evt) {

      int returnVal = fileChooser.showOpenDialog(this);

      if (returnVal == JFileChooser.APPROVE_OPTION) {
         File file = fileChooser.getSelectedFile();

         try {
            JPanel filePanel = new FilePanel(file);

            tabbedPane.add(filePanel, filePanel.getName());
            tabbedPane.setSelectedComponent(filePanel);
         } catch (IOException ex) {
            System.out.println("problem accessing file"
                  + file.getAbsolutePath());
         }
      } else {
         System.out.println("File access cancelled by user.");
      }
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShow();
         }
      });
   }

   private static void createAndShow() {
      FooSwing fooSwing = new FooSwing();
      fooSwing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      fooSwing.pack();
      fooSwing.setLocationRelativeTo(null);
      fooSwing.setVisible(true);
   }
}

class FilePanel extends JPanel {

   private File file;
   private JTextArea textArea;
   private String name;

   public FilePanel(File file) throws FileNotFoundException, IOException {
      this.file = file;
      setLayout(new BorderLayout());

      textArea = new JTextArea();
      JScrollPane scroll = new JScrollPane(textArea);
      add(scroll, BorderLayout.CENTER);

      textArea.read(new FileReader(file.getAbsolutePath()), null);
      name = file.getName();
   }

   public File getFile() {
      return file;
   }

   public JTextArea getTextArea() {
      return textArea;
   }

   public String getName() {
      return name;
   }

}
于 2013-08-25T00:24:02.647 に答える