1

我正在尝试保存选项卡式窗格内面板上的文本区域的内容。

到目前为止,我已经尝试过:

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

并且一直在查看 tabbedpane 的所有方法,但我似乎无法解决。我知道我必须从 中获取选定的组件tabbedPane,然后以某种方式从中获取 textarea,然后将其转换为我假设的字符串?

我打开文件时的代码是:

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.");
    }
}

我已经添加了类,因为您坚持更新当前 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

这里没有魔法,而是你如何编码。拥有 JTextArea 的类应该有一个公共方法,类似于getTextArea()返回 JTextArea 的方法。然后,当您通过 获取选定选项卡的组件时getSelectedComponent(),您在返回的组件上调用此方法。


编辑
根据您发布的代码,您需要重新考虑您的程序设计。您的 JTextArea 是一个局部变量,因此不容易访问,这就是您的问题。我建议:

  • 首先,停止使用 Swing 代码生成器软件,至少在您了解 Java 和 Swing 的基础知识之前不要这样做,因为它会阻止您获得这种理解。
  • 阅读 Java 和 Swing 教程,了解如何手动编写 Swing 代码。
  • 如果您需要访问特定组件,请确保它们是类字段,并且可以通过 getter 方法访问它们,或者更好的是只有感兴趣的组件的特定属性可以访问。例如,如果您希望将文本保存在 JTextArea 中,而不是使用getTextArea()返回 JTextArea 的方法,请使用getTextAreaText()仅返回 JTextArea 保存的文本的方法。您的代码对外部扰动和副作用的限制越多越好。

编辑 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 时,请确保它不为空,将其强制转换为 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 回答