gpt4 book ai didi

java - JFileChooser 和 RMI

转载 作者:太空宇宙 更新时间:2023-11-04 12:15:48 25 4
gpt4 key购买 nike

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

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

enter image description here

换言之:我构建了一个 RemoteFileView (extends FileView)、RemoteFileSystemView (extends FileSystemView)和一个 RemoteFile (extends File),并覆盖了父类(super class)的所有方法,除了 File.hashCode()FileSystemView.createFileSystemRoot(File) (此方法在 FileSystemView 中受到保护)。所有重写的方法都调用 RMI 服务器上的方法,其中来自服务器的 FileView 和 FileSystemView 调用服务器方法(如 JFileChooser 所做的那样)。我从虚拟实例化的 JFileChooser 中获取服务器端的 FileViewFileSystemView

现在系统做什么:
- 启动 RMI 服务器
- 启动 RMI 客户端
- JFileChooser 获取RemoteFileView
- JFileChooser 获取RemoteFileSystemView
- JFileChooser 从服务器获取所有 RemoteFiles 并显示 JFileChooser 中的文件夹和文件

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

因此,我决定编写一个自己的鼠标监听器来识别 JFileChooser 上的双击。但是,如果我双击一个文件夹(在 JFileChooser 中),则什么也不会发生。如果我突出显示一个文件夹(通过单击),然后双击 JFileChooser 中的某个位置(不是在文件 View 或按钮中),监听器会识别我的双击并跳转到突出显示的文件夹(希望这足够清晰)。

我认为FileView(在JFileChooser上)位于JFileChooser之上,并且应该拥有它自己的监听器。或者我忘记了要编码的内容。

RMI 接口(interface)包含从 RemoteFileViewRemoteFileSystemViewRemoteFile 调用的所有方法,从系统的行为来看,这应该没问题。

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

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

编辑2:我在这个问题中看到:Repurposing JFileChooser每当通过双击选择文件时,JFileChooser 都会在 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。两种 View 都可以通过单击按钮进行切换。 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);
}
}
});

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

关于java - JFileChooser 和 RMI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39425114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com