[英]JFileChooser and RMI
我试图用java和RMI构建一个FileChooser来浏览远程机器的文件系统。
到目前为止我所做的最好如下图所示。 exists()
方法调用是一个示例, RemoteFileView
, RemoteFileSystemView
和RemoteFile
所有方法RemoteFile
转发到服务器。
用语言:我构建一个RemoteFileView
( extends FileView
), RemoteFileSystemView
( extends FileSystemView
)和一个RemoteFile
( extends File
)并覆盖超类的所有方法,除了File.hashCode()
和FileSystemView.createFileSystemRoot(File)
(这个方法是在FileSystemView
受保护)。 所有重写的方法都调用RMI-Server上的方法,其中来自服务器的FileView
和FileSystemView
调用服务器方法(如JFileChooser
所做的那样)。 我从虚拟实例化的JFileChooser
获取服务器端的FileView
和FileSystemView
。
那么现在系统做了什么:
- 启动RMI-Server
- 启动RMI-Client
- JFileChooser
获取RemoteFileView
- JFileChooser
获取RemoteFileSystemView
- JFileChooser
从服务器获取所有RemoteFiles
并显示文件夹以及JFileChooser
文件
所以直到现在这种行为都很好。 现在问题(我无法摆脱): JFileChooser
(客户端)的初始视图显示服务器主目录的所有文件。 我可以(按下每个按钮)切换到父目录,直到系统根目录(在Windows上,例如系统驱动器“C:\\”)。 从那里(或从其他地方)我可以双击文件夹跳转到它,只要该路径存在于客户端系统上,但显示的文件和文件夹来自服务器。 如果客户端上不存在该路径,则无法跳转到该文件夹并浏览该文件夹。 所以,如果有人知道这种行为,请帮助(我感谢任何解决方案:))。
所以我决定编写一个自己的鼠标监听器来识别JFileChooser
上的双击。 但是,如果我双击一个文件夹(在JFileChooser
)没有任何反应。 如果我突出显示一个文件夹(通过单击),然后双击JFileChooser
某个位置(不在文件视图或按钮中),则侦听器会识别我的双击并跳转到突出显示的文件夹(希望这很清楚)。
我认为FileView
(在JFileChooser
)位于JFileChooser
,应该得到它自己的监听器。 或者我忘记了要编码的东西。
RMI接口包含从RemoteFileView
, RemoteFileSystemView
和RemoteFile
调用的所有方法,以及系统的行为,这应该没问题。
我当然可以提供一些代码以及关于整个程序的更多信息。 我想发布所有代码太多了。
编辑:因为这个问题可能“太宽泛”更具体的版本(这可能解决我的问题):哪个监听器在双击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.