【问题标题】:Retrieving textarea from tabbedpane从选项卡式窗格中检索文本区域
【发布时间】:2013-08-25 00:16:55
【问题描述】:

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

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

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

我已经按照你的要求添加了课程 更新当前的 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 中就可以了?

【问题讨论】:

  • 就像我在您的other question 中提到的那样。发布 SSCCE,复制/粘贴错误和异常输出。
  • 如果您包含更多实际代码可能会有所帮助。也许您在哪里创建了文本区域和选项卡等。
  • @leigero “如果您包含更多实际代码可能会有所帮助” 问题通常是 OP 不知道哪些代码相关,哪些不相关. SSCCE 解决了这个问题。
  • @tbodt:为什么要删除你的答案?在我投票之前你删除了它。

标签: java swing file-io jtextarea


【解决方案1】:

这里没有魔法,而是你如何编写代码。拥有 JTextArea 的类应该有一个公共方法,例如返回 JTextArea 的 getTextArea()。然后当你通过getSelectedComponent()获取选中标签的组件时,在返回的组件上调用这个方法。


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

  • 首先,停止使用 Swing 代码生成器软件,至少在您了解 Java 和 Swing 的基础知识之前不要这样做,因为它会妨碍您获得这种理解。
  • 阅读 Java 和 Swing 教程,了解如何手动编写 Swing 代码。
  • 如果您需要访问特定组件,请确保它们是类字段,并且它们可以通过 getter 方法访问,或者更好的是只能访问感兴趣的组件的特定属性。例如,如果您希望将文本保存在 JTextArea 中,而不是使用返回 JTextArea 的 getTextArea() 方法,请使用仅返回 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 时,请确保它不为空,将其强制转换为 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;
   }

}

【讨论】:

  • 我做了所有的事情,但除非我这样做,否则我仍然无法访问方法 getTextArea: FilePanel no = (FilePanel) tabbedPane.getSelectedComponent(); JTextArea bo = (JTextArea) no.getTextArea();它会抛出一个错误:java.lang.ClassCastException: javax.swing.JPanel cannot be cast to texteditor.FilePanel
  • @Steve:不要复制我的代码。复制我的想法,编写自己的代码,它可能会奏效。
  • @Steve:也相信错误消息告诉你的内容。如果它给您一个错误,说明您正在尝试将通用 JPanel 转换为其他东西,那么您实际上正在这样做 - 尝试将 JPanel 转换为其他东西,解决方案是不这样做。跨度>
  • 我明白,但我想做的是访问当前选定的选项卡,并在其上调用 getTextArea 方法,但我不知道该怎么做。我正在为一个大学副项目做这个:)
  • @Steve:我已经解释过了。您必须使用自定义类对象填充 JTabbedPane,然后我向您展示了一个示例。您还没有这样做,所以我不知道如何进一步帮助您。
猜你喜欢
  • 2012-05-11
  • 2012-05-14
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多