2

我在使用简单的绘图程序保存 BufferedImage 时遇到了问题。当我从绘画中保存图像时,例如我之前画的蛇的图片,它可以很好地保存图像,但它并没有像您想象的那样保存它。它不是将图像保存到 C:\ 驱动器(或用户可能使用的任何驱动器),而是将图像保存到 eclipse 工作区。这当然是不可接受的,因为这需要直接提供给用户的主要访问位置。这是用于保存缓冲图像的方法。

static void saveImage() {
        try {
            ImageIO.write(background, "png",
                    new File(fileName + ".png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

所以在这里,背景显然是要保存的图像,png 是扩展名,而 fileName 是一个字符串,它是使用先前的方法保存的,在这里并不重要。此方法将图像保存到eclipse 工作区。这是不好的。我们需要将其保存到默认驱动器。我该如何做到这一点?如果您需要其他任何东西来帮助您回答问题,请告诉我。

编辑:因此,根据要求,这是更改文件名的代码。它在一个完全不同的 UI 的不同类中,因为我不确定要发布多少,所以我将发布 actionListener 和getName()方法。这里发生的是JTextField,一旦JButton按下 a ,就会从其中提取字符串并将其用作fileName. 这是代码:

`finishButton.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                   ProgramUI.fileName = getName();
                   ProgramUI.fileHasName = true;
                   ProgramUI.saveImage();
                   frame.dispose();
               }
        });
    }

    public String getName() {
        return nameField.getText();
    }
`
4

3 回答 3

4

为用户提供一个JFileChooser(如 本答案所示)以允许他们导航到路径并选择一个名称。

使用 a 限制路径,如此FileSystemView所示。

于 2013-06-09T03:09:39.670 回答
2

如果该代码保存到 Eclipse 工作区,那是因为:

  1. 您在 中提供相对路径名filename,并且
  2. 当前目录是从 Eclipse 中运行应用程序时的 Eclipse 工作区目录。

尝试从命令提示符运行命令。使用相同的输入(即与您当前使用的文件名相同),它应该保存到当前目录。


不可能给你一个简单的方法来解决这个问题。正确的解决方案取决于您希望程序如何实际工作:

  • 您希望将文件保存在何处(即在哪个目录中)。
  • 您是否(以及如何)希望用户能够说出保存文件的位置。
  • 此应用程序是否需要可移植;即在 Windows 以外的其他东西上工作。

我建议您首先阅读“当前目录”的概念,然后阅读java.io.File该类的 javadoc ......这将解释当您尝试打开一个文件时 Java 如何决定您“意味着”什么文件。

于 2013-06-09T03:03:54.963 回答
2

创建 File 对象时,您没有给出保存文件的路径。默认情况下,它将文件保存在当前工作目录中。

试试这个 :

static void saveImage() {
        try {
            ImageIO.write(background, "png",
                    new File("C:\\" + fileName + ".png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

或者更好地在方法中添加路径参数:

static void saveImage(String filePath) {
        try {
            ImageIO.write(background, "png",
                    new File(filePath + fileName + ".png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

但请确保您使用正确的斜杠 (//)

于 2013-06-09T03:04:12.847 回答