我正在上课,并且有几个问题,我希望得到帮助。分配是一个GUI,允许用户选择要复制的文件,并选择您要将文件复制到的位置。
我已经完成了作业,但是如果我能改变的话,有几件事我想看看......
选择源文件时,我只想要在Label中显示源文件的名称,但程序需要整个路径才能复制文件,每次我尝试将其切换为显示文件名只是程序不会运行,因为它不知道文件的位置。第二个问题,无论如何都要让程序自动复制一个文件作为.bak文件...说源文件是一个文本文件,用户选择一个目标文件夹并点击副本,它保存一个同名的文件但.bak扩展名?
我把代码放在***之间,并留下我试图用来显示文件名的代码并将其注释掉。谢谢你的帮助!!
public class CopyFile extends JFrame{
private JFileChooser fc;
private JButton copyButton;
private JButton chooseFileButton;
private JButton destinationButton;
private File workingDirectory;
private JLabel sourceLabel;
private JLabel destinationLabel;
private JTextField sourceText;
private JTextField sourceFileText;
private JTextField destinationText;
public static void main(String [] args) {
CopyFile go = new CopyFile();
go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
go.setSize(500, 150);
go.setVisible(true);
}
public CopyFile() {
super("Copy a text file");
setLayout(new GridLayout(3, 3, 5, 5));
fc = new JFileChooser();
//Open dialog box inside project folder to make easier to find files
workingDirectory = new File(System.getProperty("user.dir"));
fc.setCurrentDirectory(workingDirectory);
//create labels and buttons for window
chooseFileButton = new JButton("CHOOSE SOURCE FILE");
destinationButton = new JButton("DESTINATION FOLDER");
copyButton = new JButton("COPY FILE");
sourceLabel = new JLabel("SOURCE FILE: ");
sourceText = new JTextField(10);
sourceText.setEditable(false);
destinationLabel = new JLabel("DESTINATION: ");
destinationText = new JTextField(10);
//add everything to JFrame
add(sourceLabel);
add(sourceText);
add(chooseFileButton);
add(destinationLabel);
add(destinationText);
add(destinationButton);
add(copyButton);
//Create TheHandler object to add action listeners for the buttons.
TheHandler handler = new TheHandler();
chooseFileButton.addActionListener(handler);
destinationButton.addActionListener(handler);
copyButton.addActionListener(handler);
}
//Inner class to create action listeners
private class TheHandler implements ActionListener {
public void actionPerformed(ActionEvent event) {
int returnVal;
String selectedFilePath;
File selectedFile;
******************************************************************************
//Selecting a source file and displaying what the user is doing.
if(event.getSource() == chooseFileButton) {
returnVal = fc.showOpenDialog(null);
//Set the path for the source file.
if(returnVal == JFileChooser.APPROVE_OPTION) {
/*The two next lines of code are what I was trying to do to get only the
file name but I get a whole page of errors, mainly I think it's saying no
such file exists*/
//selectedFile = fc.getSelectedFile();
//sourceText.setText(selectedFile.getName());
selectedFilePath = fc.getSelectedFile().getAbsolutePath();
sourceText.setText(selectedFilePath);
}
}//end if
******************************************************************************
//Handle destination button.
if(event.getSource() == destinationButton) {
returnVal = fc.showSaveDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {
selectedFilePath = fc.getSelectedFile().getAbsolutePath();
destinationText.setText(selectedFilePath);
}
}//end if
//Handle copy button
if(event.getSource() == copyButton) {
File sourceFile = new File(sourceText.getText());
File destinationFile = new File(destinationText.getText());
Path sourcePath = sourceFile.toPath();
Path destinationPath = destinationFile.toPath();
try {
Files.copy(sourcePath, destinationPath);
} catch (IOException e) {
e.printStackTrace();
}
}//end if
}//end actionPerformed
}//end TheHandler class
}//end class
答案 0 :(得分:2)
当选择源文件时,我只想要在Label中显示的源文件的名称,但是,程序需要整个路径才能复制文件,每次我尝试切换它以显示文件仅命名该程序不会运行,因为它不知道文件的位置。
您可以使用File#getName
,它将返回文件的名称并将其用作标签的文本,但保留对原始File
的引用。您不应该使用标签文字生成新的File
参考,只需保留对来源File
和目标File
以及实例字段的引用
第二个问题,无论如何都要使程序自动复制一个文件作为.bak文件...说源文件是一个文本文件,用户选择一个目标文件夹并点击副本,它保存一个文件与同名,但.bak扩展名?
String name = selectedFile.getName();
name = name.substring(0, name.lastIndexOf("."));
name += ".bak";
File destinationFile = new File(destinationPath, name);
会将selectedFile
的扩展名更改为.bak
,但您应该添加一项检查,看看它是否有一个以
答案 1 :(得分:2)
您必须将来源和目标文件路径保留为
File
s,而非String
s。将TheHandler
类的代码修改为 如下:
添加selectedSourceFile
和selectedDestinationFile
个本地字段。
private class TheHandler implements ActionListener {
private File selectedSourceFile;
private File selectedDestinationFile;
选择文件时更新它们并设置文件名而不是文本字段的路径。
源文件按钮
if (event.getSource() == chooseFileButton) {
returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedSourceFile = fc.getSelectedFile();
sourceText.setText(selectedSourceFile.getName());
}
}
目标按钮
if (event.getSource() == destinationButton) {
returnVal = fc.showSaveDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedDestinationFile = fc.getSelectedFile();
destinationText.setText(selectedDestinationFile.getName());
}
}
复制时使用selectedSourceFile
和selectedDestinationFile
。
if (event.getSource() == copyButton) {
Path sourcePath = selectedSourceFile.toPath();
Path destinationPath = selectedDestinationFile.toPath();
try {
Files.copy(sourcePath, destinationPath);
} catch (IOException e) {
e.printStackTrace();
}
}
现在你完成了第一个要求。你可以在什么时候制作backfile 选择目标文件。所以,添加你的代码来制作备份文件 选择目的地按钮。
if (event.getSource() == destinationButton) {
returnVal = fc.showSaveDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedDestinationFile = fc.getSelectedFile();
destinationText.setText(selectedDestinationFile.getName());
//copy backup
String name = selectedSourceFile.getName();
name = selectedSourceFile.getName().substring(0, name.lastIndexOf(".")) + ".bak";
File destinationFile = new File(selectedDestinationFile.getParentFile(), name);
try {
Files.copy(selectedSourceFile.toPath(), destinationFile.toPath());
} catch (IOException ex) {
ex.printStackTrace();
}
}
}