如何在追加到文件时关闭JavaFX FileChooser的覆盖警告?

gg58donl  于 2023-01-19  发布在  Java
关注(0)|答案(1)|浏览(135)

我需要创建一个数据输入的JavaFx类,它可以在append模式下输出到一个文件。在下面这个简化的可运行的例子中(imports deleted),我可以创建一个文件,放入初始数据,然后毫无问题地向其追加数据。但是,如果我关闭程序,稍后再次运行它,FileChooser将帮助找到该文件,但警告:“确认保存为__TryFile. txt已存在。__是否要替换它?"。
如果我选择确认,新数据将按预期追加,文件不会被替换。如何关闭该警告?我在Windows 7上使用Java 8_20。
注意:我已经根据下面的建议更正了代码。请参见AppendToFile()。

public class TryAppend extends Application
{
  static File file;

  static void initiatefile( String setupInfo )
  {
    FileChooser choose = new FileChooser();
    choose.getExtensionFilters().add(
            new FileChooser.ExtensionFilter( "Text doc(*.txt)", "*.txt" ) );
    choose.setInitialFileName( "*.txt" );
    choose.setInitialDirectory( new File(System.getProperty("user.home") ) );
    file = choose.showSaveDialog( null );
    if ( file != null )
    {
        if ( file.getName().endsWith( ".txt" ) )
        {
           try( PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter( file )))) 
           {
               out.println( setupInfo );
           }catch (IOException e) {
               System.err.println(e);
           }
        }
    }
  }

  static void appendToFile( String appendString )
  {
    if (file == null)
    {
        FileChooser choose = new FileChooser();
        choose.getExtensionFilters().add(
                new FileChooser.ExtensionFilter( "Text doc(*.txt)", "*.txt" ) );
        choose.setInitialDirectory( new File(System.getProperty("user.home") ) );
        file = choose.showOpenDialog( null ); //Now corrected. Previously 
                                              //was: choose.showSaveDialog( null );                    
    }

    if ( file != null )
    {   

        try( PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter( file, true )))) 
        {
            out.println( appendString );
        }catch (IOException e) {
            System.err.println(e);
        }
    }
  }

  @Override
  public void start(Stage primaryStage) 
  { 
     primaryStage.setTitle( "Try Append to File" ); 
     Group root = new Group(); 
     Scene scene = new Scene( root, 300, 200 ); 
     Button initBtn = new Button(); 
     initBtn.setLayoutX( 100 ); 
     initBtn.setLayoutY( 40 ); 
     initBtn.setText( "Initiate File" ); 
     initBtn.setOnAction( new EventHandler<ActionEvent>() 
     { 
        public void handle(ActionEvent event) 
        { 
            initiatefile( "Initial data" ); 
        } 
     } ); 
     Button appendBtn = new Button(); 
     appendBtn.setLayoutX( 90 ); 
     appendBtn.setLayoutY( 100 ); 
     appendBtn.setText( "Append to File" ); 
     appendBtn.setOnAction( new EventHandler<ActionEvent>() 
     { 
        public void handle(ActionEvent event) 
        { 
            appendToFile( "Appended data" );
        } 
     } ); 
     root.getChildren().add( initBtn ); 
     root.getChildren().add( appendBtn ); 
     primaryStage.setScene( scene ); 
     primaryStage.show(); 
  }
  public static void main(String[] args) 
  {
    launch(args);
  }
}
gfttwv5a

gfttwv5a1#

另保存为对话框无法执行此操作,因为提示覆盖在GTK源文件中硬编码为TRUE

gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER (chooser), TRUE);

JDK-8299969已针对此问题进行了记录,需要先解决此问题,然后才能忽略覆盖提示。
使用"打开“对话框是一种变通方法,尽管它有缺点。
对于KeenWrite,我选择了一个热键,通过重复之前的导出操作来完全绕过保存为对话框。这可以通过创建一个能够重新运行javafx.concurrent.Taskjavafx.concurrent.Service来实现,例如:

final var service = new Service<Path>() {
  @Override
  protected Task<Path> createTask() {
    final var task = new Task<Path>() {
      @Override
      protected Path call() throws Exception {
        // Do the work that Save As would do.
      }
    };

    // Handle the success functionality.
    task.setOnSucceeded( this::successs );

    // Handle the failure functionality.
    task.setOnFailed( this::failure );

    return task;
  }
};

这样,如果用户经常使用保存为功能,则可以将其替换为不提示任何对话框的“静默”版本。第一次除外,它创建的初始操作将在后续的“静默”执行中重新运行。

相关问题