2

単純なペイント プログラムを使用して BufferedImage を保存する際に問題が発生しました。先ほど描いた蛇の絵などの絵の具から画像を保存すると、ちゃんと保存されるのですが、思ったように保存されません。イメージを C:\ ドライブ (またはユーザーが使用している任意のドライブ) に保存する代わりに、イメージを Eclipse ワークスペースに保存します。もちろん、これはユーザーの主なアクセス場所に直接与える必要があるため、受け入れられません。バッファリングされた画像を保存するために使用されるメソッドは次のとおりです。

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

ここで、background は明らかに保存される画像、png は拡張子、fileName は以前の方法を使用して以前に保存された文字列ですが、ここでは重要ではありません。このメソッドは、イメージをEclipse ワークスペースに保存します。これは悪いです。これは、デフォルトのドライブに保存するために必要です。どうすればこれを達成できますか? 回答に役立つものが他に必要な場合はお知らせください。

編集:したがって、要求に応じて、fileName を変更するコードを次に示します。UIが全く違う別クラスで、どこまで載せればいいのか分からないので、actionListenerとgetName()メソッドを載せます。ここで何が起こるかというとJTextField、 aJButtonが押されると、そこから文字列が抽出され、それを として使用する があり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

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 に答える