繁体   English   中英

JFileChooser和RMI

[英]JFileChooser and RMI

我试图用java和RMI构建一个FileChooser来浏览远程机器的文件系统。

到目前为止我所做的最好如下图所示。 exists()方法调用是一个示例, RemoteFileViewRemoteFileSystemViewRemoteFile所有方法RemoteFile转发到服务器。

在此输入图像描述

用语言:我构建一个RemoteFileViewextends FileView ), RemoteFileSystemViewextends FileSystemView )和一个RemoteFileextends File )并覆盖超类的所有方法,除了File.hashCode()FileSystemView.createFileSystemRoot(File) (这个方法是在FileSystemView受保护)。 所有重写的方法都调用RMI-Server上的方法,其中来自服务器的FileViewFileSystemView调用服务器方法(如JFileChooser所做的那样)。 我从虚拟实例化的JFileChooser获取服务器端的FileViewFileSystemView

那么现在系统做了什么:
- 启动RMI-Server
- 启动RMI-Client
- JFileChooser获取RemoteFileView
- JFileChooser获取RemoteFileSystemView
- JFileChooser从服务器获取所有RemoteFiles并显示文件夹以及JFileChooser文件

所以直到现在这种行为都很好。 现在问题(我无法摆脱): JFileChooser (客户端)的初始视图显示服务器主目录的所有文件。 我可以(按下每个按钮)切换到父目录,直到系统根目录(在Windows上,例如系统驱动器“C:\\”)。 从那里(或从其他地方)我可以双击文件夹跳转到它,只要该路径存在于客户端系统上,但显示的文件和文件夹来自服务器。 如果客户端上不存在该路径,则无法跳转到该文件夹​​并浏览该文件夹。 所以,如果有人知道这种行为,请帮助(我感谢任何解决方案:))。

所以我决定编写一个自己的鼠标监听器来识别JFileChooser上的双击。 但是,如果我双击一个文件夹(在JFileChooser )没有任何反应。 如果我突出显示一个文件夹(通过单击),然后双击JFileChooser某个位置(不在文件视图或按钮中),则侦听器会识别我的双击并跳转到突出显示的文件夹(希望这很清楚)。

我认为FileView (在JFileChooser )位于JFileChooser ,应该得到它自己的监听器。 或者我忘记了要编码的东西。

RMI接口包含从RemoteFileViewRemoteFileSystemViewRemoteFile调用的所有方法,以及系统的行为,这应该没问题。

我当然可以提供一些代码以及关于整个程序的更多信息。 我想发布所有代码太多了。

编辑:因为这个问题可能“太宽泛”更具体的版本(这可能解决我的问题):哪个监听器在双击JFileChooser中的文件夹时触发? 可以删除或设置此侦听器吗?

EDIT2:我在这个问题中看到: 重新调整JFileChooser ,只要双击选择文件, JFileChooser.APPROVE_SELECTION就会触发JFileChooser.APPROVE_SELECTION 所以我实现了这段代码:

fileChooser.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent e) {
    System.out.println("Some action");
    String command = e.getActionCommand();
    if (command.equals(JFileChooser.APPROVE_SELECTION)) {
      File file = fileChooser.getSelectedFile();
      fileChooser.setCurrentDirectory(file);
      fileChooser.rescanCurrentDirectory();
    }
  }
});

但遗憾的是,动作侦听器无法识别FileView(显示文件的组件)中的任何操作,但会在按钮单击(我使用System.out ..检测到)上触发动作事件。

我上面描述的问题是组件及其鼠标监听器。 首先,您必须获取组件,然后将侦听器添加到其中。 所以在JFileChooser我们得到了一个JList和一个JTable 两个视图都可以通过按钮klick切换。 JList保存文件以及JTable

我在这里找到了一些解决方案: https//community.oracle.com/thread/1350166?start = 0&tstart = 0

所以我从那里使用了一些代码并实现了我的鼠标监听器:

JList的监听器:

JList<?> list = SwingUtils.getDescendantOfType(JList.class, fileChooser, "Enabled", true);

MouseListener listener = new MouseAdapter() {

  @Override
  public void mousePressed(MouseEvent e) {
    File file = fileChooser.getSelectedFile();

   if (e.getClickCount() == 2 && file != null) {
      if (e.getSource() == list) {
        // Do your stuff
        operateOnFile(file);
      } 
      else {
        // Default operation
      }
    }       
  }
};

list.addMouseListener(listener);

和JTable的听众:

final Container filePane = SwingUtilities.getAncestorOfClass(sun.swing.FilePane.class, list);

filePane.addContainerListener(new ContainerAdapter() {

  @Override
  public void componentAdded(ContainerEvent e) {
    JTable table = SwingUtils.getDescendantOfType(JTable.class, fileChooser, "Enabled", true);
    if (table != null) {
      for (MouseListener l : table.getMouseListeners()) {
        if (l == listener) {
          return;
        }
      }          
      table.addMouseListener(listener);
    }
  }
});

通过这个解决方案,我得到了我想要的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM