gpt4 book ai didi

java - JFileChooser "Save As"复合文档 - 覆盖现有

转载 作者:行者123 更新时间:2023-11-29 05:23:28 25 4
gpt4 key购买 nike

我正在开发一个使用复合文档来存储其数据的系统。

一切都运行得很漂亮 - 我什至在打开的对话框上有漂亮的图标和双击打开功能。

我的问题是“另存为”对话框。如果我另存为一个不存在的复合文档,那么一切都很好。如果我双击一个现有的复合文档,那么我的代码会询问您是否要覆盖它,这也没有问题。

但是,如果您输入现有复合文档的名称并单击“保存”,则工作不正常,就像您单击“取消”一样。

我正在使用 FileFilter 和 FileView 来配置文件的所有显示和过滤。

这是我的主对话框打开函数:

public void saveAs() {
JFileChooser fc = new JFileChooser();
javax.swing.filechooser.FileFilter filter = new SketchFolderFilter();
fc.setFileFilter(filter);

javax.swing.filechooser.FileView view = new SketchFileView();
fc.setFileView(view);

fc.setCurrentDirectory(Base.getSketchbookFolder());

int rv = fc.showSaveDialog(this);

System.err.println("Option: " + rv);
if (rv == JFileChooser.APPROVE_OPTION) {
File newFile = fc.getSelectedFile();
System.err.println("Save As: " + newFile.getAbsolutePath());
if (newFile.exists()) {
int n = twoOptionBox(
JOptionPane.WARNING_MESSAGE,
"Overwrite File?",
Translate.w("Do you really want to overwrite the file %1?", 40, "\n", newFile.getName()),
"Yes", "No");
if (n != 0) {
return;
}
newFile.delete();
}
loadedSketch.saveAs(newFile);
}
}

如果您需要,这里是我的过滤器和 View 类:

public class SketchFileView extends javax.swing.filechooser.FileView {
public String getTypeDescription(File f) {
if (Base.isSketchFolder(f)) {
return Translate.t("UECIDE Sketch Folder");
}
return Translate.t("Directory");
}

public Boolean isTraversable(File f) {
if (Base.isSketchFolder(f)) {
return false;
}
return true;
}

public Icon getIcon(File f) {
if (Base.isSketchFolder(f)) {
ImageIcon icon = Base.loadIconFromResource("icon16.png");
return icon;
}
return null;
}
}

public class SketchFolderFilter extends javax.swing.filechooser.FileFilter {
public boolean accept(File f) {
if (Base.isSketchFolder(f)) {
return true;
}
if (f.isDirectory()) {
return true;
}
return false;
}

public String getDescription() {
return Translate.t("Sketch Folders");
}
}

当它工作时,我看到,在 stderr 上:

Option: 0
Save As: /foo/bar/baz

当它不起作用时,我看到:

Option: 1

澄清:

据我所知,这纯粹是复合文档的问题。

重申场景:

  1. 打开 JFileChooser 将您的数据保存到复合文档
  2. 您有一份现有复合文件的 list 。
  3. 您双击一个 - 返回 APPROVE_OPTION 索引,并且 getSelectedFile() 返回 File 对象,或者
  4. 您键入不存在的复合文档 的名称,然后按“保存”或返回键。返回APPROVE_OPTION索引,getSelectedFile()返回File对象,但是
  5. 您键入现有复合文档 的名称,然后按“保存”或返回键。返回CANCEL_OPTION索引,getSelectedFile()返回null,或者
  6. 您按下“取消”按钮。返回 CANCEL_OPTION 索引,getSelectedFile() 返回 null。
  7. 然后,您将 File 对象与您自己的代码一起使用以生成复合文档 - 通常删除旧的(如果它存在并且用户说他想覆盖)并创建目录并填充它与您的文件。

5 是错误的(无论如何在我看来)。它应该返回 APPROVE_OPTION 并且 getSelectedFile() 应该返回一个 File 对象,该对象表示您键入的驻留在 JFileChooser 所在目录中的文件(即与 3 相同)。

编辑:

缩小范围。看起来 JFileChooser 不喜欢当一个文件夹不可遍历并且你在选择器中输入它的名字并点击返回 - 它试图遍历它并且它悲惨地失败了,并且不知道如何处理它,所以只是将您从返回 0 的 JFileChooser 中转储。这是一个演示它的 SSCCE。在一个文件夹上运行这个,其中有一个名为“test.X”的文件夹,然后输入“test.X”。它应该会失败。

import java.io.*;
import javax.swing.*;


class fctest {

public class SketchFileView extends javax.swing.filechooser.FileView {
public Boolean isTraversable(File f) {
if (f.getName().endsWith(".X")) {
return false;
}
if (f.isDirectory()) {
return true;
}
return true;
}
}

public class SketchFolderFilter extends javax.swing.filechooser.FileFilter {
public boolean accept(File f) {
if (f.getName().endsWith(".X")) {
return true;
}
if (f.isDirectory()) {
return true;
}
return false;
}

public String getDescription() {
return "Sketch Folders";
}
}

public void saveAs() {
JFileChooser fc = new JFileChooser();
javax.swing.filechooser.FileFilter filter = new SketchFolderFilter();
fc.setFileFilter(filter);

javax.swing.filechooser.FileView view = new SketchFileView();
fc.setFileView(view);

fc.setCurrentDirectory(new File("."));

int rv = fc.showSaveDialog(null);

System.err.println("Option: " + rv);
if (rv == JFileChooser.APPROVE_OPTION) {
File newFile = fc.getSelectedFile();
System.err.println("Save As: " + newFile.getAbsolutePath());
}
}

public static void main(String[] args) {
fctest main = new fctest();
main.saveAs();
}
}

最佳答案

is if you type in the name of an existing compound document and click save, it acts as if you clicked cancel instead.

我认为您的意思是文件选择器关闭,但您希望它保持打开状态以便让用户有机会更改文件名。如果是这样,那么您可以覆盖 JFileChooser 的 approveSelection() 方法以显示确认对话框:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;

public class FileChooserSave
{
private static void createAndShowUI()
{
final JFileChooser chooser = new JFileChooser( new File(".") )
{
public void approveSelection()
{
if (getSelectedFile().exists())
{
int n = JOptionPane.showConfirmDialog(
this,
"Do You Want to Overwrite File?",
"Confirm Overwrite",
JOptionPane.YES_NO_OPTION);

if (n == JOptionPane.YES_OPTION)
super.approveSelection();

}
else
super.approveSelection();
}
};

chooser.setSelectedFile( new File("something.rob") );
int returnVal = chooser.showSaveDialog(null);

if(returnVal == JFileChooser.APPROVE_OPTION)
{
System.out.println(chooser.getSelectedFile() );
}
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}

编辑:

我添加了以下内容:

fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

它允许您“直接选择化合物”,但您也可以选择非化合物目录,这是一些进步。

然后我重写文件选择器的“approveSelection”方法以仅批准复合目录,现在它似乎工作得相当好?

必须承认我不知道它为什么会这样做,所以它更像是一种蛮力方法。

这是我测试的代码:

import java.io.*;
import javax.swing.*;


class fctest {

public class SketchFileView extends javax.swing.filechooser.FileView
{
@Override
public Boolean isTraversable(File f) {
if (f.getName().startsWith("images")) {
return false;
}
if (f.isDirectory()) {
return true;
}
return false; // added this
}
}

public class SketchFolderFilter extends javax.swing.filechooser.FileFilter {
public boolean accept(File f) {
if (f.getName().startsWith("images")) {
return true;
}
if (f.isDirectory()) {
return true;
}
return false;
}

public String getDescription() {
return "Sketch Folders";
}
}

public void saveAs() {
JFileChooser fc = new JFileChooser()
{
public void approveSelection()
{
if (getSelectedFile().getName().startsWith("images"))
super.approveSelection();
}
};

javax.swing.filechooser.FileFilter filter = new SketchFolderFilter();
fc.setFileFilter(filter);

javax.swing.filechooser.FileView view = new SketchFileView();
fc.setFileView(view);

// fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
fc.setCurrentDirectory(new File("."));
fc.setSelectedFile( new File("blog") );

int rv = fc.showSaveDialog(null);

System.err.println("Option: " + rv);
if (rv == JFileChooser.APPROVE_OPTION) {
File newFile = fc.getSelectedFile();
System.err.println("Save As: " + newFile.getAbsolutePath());
}
}

public static void main(String[] args) {
fctest main = new fctest();
main.saveAs();
}
}

关于java - JFileChooser "Save As"复合文档 - 覆盖现有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23712309/

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