我需要创建一个数据输入的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);
}
}
1条答案
按热度按时间gfttwv5a1#
另保存为对话框无法执行此操作,因为提示覆盖在GTK源文件中硬编码为
TRUE
:JDK-8299969已针对此问题进行了记录,需要先解决此问题,然后才能忽略覆盖提示。
使用"打开“对话框是一种变通方法,尽管它有缺点。
对于KeenWrite,我选择了一个热键,通过重复之前的导出操作来完全绕过保存为对话框。这可以通过创建一个能够重新运行
javafx.concurrent.Task
的javafx.concurrent.Service
来实现,例如:这样,如果用户经常使用保存为功能,则可以将其替换为不提示任何对话框的“静默”版本。第一次除外,它创建的初始操作将在后续的“静默”执行中重新运行。