【问题标题】:Clicking on java JTextArea or other methods单击 java JTextArea 或其他方法
【发布时间】:2014-05-23 00:36:23
【问题描述】:

我目前在 Windows 上工作,正在编写一个简单的 Java 应用程序。

应用程序对某些文件进行简单搜索,我创建了一个 JPanel 和一个 JTextArea 并将文本区域添加到面板,然后我在文本区域使用追加。

到目前为止一切顺利。

现在,我想知道,如果我希望能够单击这些路径(就像它们是链接一样)来打开这些文件(它们是 Word 或 PDF 文件),我该怎么做?

我想这可能需要不止几行代码来编写,但如果有人能指出我正确的方向,我将不胜感激。

【问题讨论】:

    标签: java swing file pdf jtextarea


    【解决方案1】:

    我在JTextArea上输出结果,文件路径

    How to use listsJList 将是一个更自然的组件。例如。如this answer 所示。

    另请参阅FileBro,它使用JTree 来列出文件和@MadProgrammer 提到的Desktop 类。

    【讨论】:

      【解决方案2】:

      看看How to Integrate with the Desktop Class

      基本上你想使用类似...

      File file = new File(...);
      Desktop desktop = Desktop.getDesktop();
      desktop.edit(file);
      

      desktop.open(file);
      

      取决于您是否要编辑或查看文件(有时它们是相同的)

      查看JavaDocs for java.awt.Desktop了解更多详情

      更新了文件打开示例

      根据反馈,我建议使用 JTextArea 中的 JList 来列出与 Files 匹配的内容,这样您就可以更好地控制用户实际选择和设计的内容,以及列出内容

      本例需要用户双击打开文件...

      import java.awt.Desktop;
      import java.awt.Dimension;
      import java.awt.EventQueue;
      import java.awt.Graphics;
      import java.awt.Graphics2D;
      import java.awt.event.MouseAdapter;
      import java.awt.event.MouseEvent;
      import java.io.File;
      import java.io.IOException;
      import javax.swing.DefaultListModel;
      import javax.swing.JFrame;
      import javax.swing.JList;
      import javax.swing.JPanel;
      import javax.swing.JScrollPane;
      import javax.swing.SwingUtilities;
      import javax.swing.UIManager;
      import javax.swing.UnsupportedLookAndFeelException;
      
      public class FileListExample {
      
          public static void main(String[] args) {
              new FileListExample();
          }
      
          public FileListExample() {
              EventQueue.invokeLater(new Runnable() {
                  @Override
                  public void run() {
                      try {
                          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                          ex.printStackTrace();
                      }
      
                      File[] files = new File("...").listFiles();
                      DefaultListModel<File> model = new DefaultListModel<>();
                      for (File file : files) {
                          model.addElement(file);
                      }
                      JList<File> list = new JList<>(model);
                      list.addMouseListener(new MouseAdapter() {
      
                          @Override
                          public void mouseClicked(MouseEvent e) {
                              if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2) {
                                  JList list = (JList) e.getComponent();
                                  File file = (File) list.getSelectedValue();
                                  try {
                                      Desktop desktop = Desktop.getDesktop();
                                      desktop.open(file);
                                  } catch (IOException exp) {
                                      exp.printStackTrace();
                                  }
                              }
                          }
      
                      });
      
                      JFrame frame = new JFrame("Testing");
                      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                      frame.add(new JScrollPane(list));
                      frame.pack();
                      frame.setLocationRelativeTo(null);
                      frame.setVisible(true);
                  }
              });
          }
      
      }
      

      如果你想做一些更花哨的事情,你甚至可以提供自己的ListCellRenderer,例如...

      public class FileListCellRenderer    extends DefaultListCellRenderer {
      
          @Override
          public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
      
              Icon icon = null;
              if (value instanceof File) {
                  File file = (File) value;
                  value = file.getName();
                  FileSystemView view = FileSystemView.getFileSystemView();
                  icon = view.getSystemIcon(file);
              }
      
              super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      
              setIcon(icon);
      
              return this;
      
          }
      
      }
      

      可以使用...

      list.setCellRenderer(new FileListCellRenderer());
      

      【讨论】:

      • 感谢您抽出宝贵时间回复。我知道如何打开文件,我的问题是如何使文本可点击?我想以某种方式允许用户单击文件列表并打开该文件。一旦我知道用户选择了哪个文件,我就可以打开该文件,但我不知道如何创建 jTextArea 或其他用户可以实际选择文件的地方。
      • @user79303 真的,你需要重新表达你的问题。文件名如何显示?没有上下文很难为你提供建议。尝试提供一个实际的runnable example that demonstrates your problem。它将减少猜测工作并提供更好的响应
      • @MadProgrammer 我怀疑(但不确定)“选择文件”是问题的一部分。这个问题本来可以更好地说明的。
      • @AndrewThompson 鉴于人们不断投票,这两个答案都可以证明......
      • @MadProgrammer,我认为这个问题很清楚,如果不是很抱歉。问题很简单:我正在对一个单词进行查询,然后我得到一个文件列表,按单词出现的次数排序。我把名单拿回来了,没问题。现在我想允许用户在该列表中选择一个文件,并将其视为网页上的链接,以便单击它会打开它。
      猜你喜欢
      • 2012-04-17
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2015-12-18
      • 2012-09-27
      相关资源
      最近更新 更多