Windows operating system can implement rename files, but cannot implement batch renaming. This example implements the batch renaming function, and can batch renaming files of the same type in a folder according to certain rules. Users can give rename templates, and programs can rename corresponding files according to the templates. In addition, you can add special symbols to the rename template, and the program will replace these special symbols with the renamed file number.
Idea Analysis:
1. First look at the view layer. Some JLabel controls need to display information indicating the user. The three JTextField controls display the selected path, input the file name template, and input the extension. The two JButton controls are used to browse folders and start repetition. Name, a JSeparator control represents the split line, a JSpinner control represents the start number, and a JScrollPane control acts as a container, and a JTable control is placed inside to list the old file name and the new file name.
2. Look at the model layer again. First, define the event handling method of the browsing button, create a JFileChooser file selector in this method, use the setFileSelectionMode() method of the JFileChooser class to set select only folders, and display the open dialog box through the showOpenDialog() of the JFileChooser class. If the user clicks to confirm The button uses the getSelectedFile() method of the JFileChooser class to get the selected folder, and finally uses the setText() method of the JTextField control to display the folder information.
3. Define a class to implement the FileFilter interface, save the file extension in the constructor of the class, and then define a method, in which the endsWith() method of the String class is used to filter the file extension.
4. Then define the event handling method of the start button. First, use the getText() method of the JTextField control to get the template string. If it is empty, the user will be prompted to enter the template through the showMessageDialog() method of the JOptionPane class, and then create a DefaultTableModel object and use the JTable class. The getModel() method of gets the table data model, clear the table data using the setRowCount(0); method of the JTable class, use the getValue() method of the JSpinner class to get the starting number, and use the indexOf method of the String class to get the first "#" The index of the String class substring() method is used to obtain the number placeholder string in the template, and the replacement() method of the String class is used to obtain the number placeholder string in the template. Replace the number placeholder string in the template with the specified format. In order to standardize the use of the toLowerCase() method of the String class to convert the extension entered by the user to lowercase. If the user does not enter ".", then use the File class listFiles() method gets the file list array in the folder, uses foreach() to loop through each file, format each file name through the format() method of the String class, and uses the addRow() method of the DefaultTableModel class to turn the old file Add the name and new name to the table's data model. Use the getParentFile() method of the File class to get the folder object where the target file is located, create a File object and initialize it to a new file name, and finally use the renameTo() method of the File class Implement file renaming.
The code is as follows:
The code copy is as follows:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileFilter;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
/**
* Get the filter for the file list
*
* @author Li Zhongwei
*/
public class RenameFiles extends JFrame {
/**
*
*/
private static final long serialVersionUID = 4534371106024773867L;
private final class ExtNameFileFilter implements FileFilter {
private String extName;
public ExtNameFileFilter(String extName) {
this.extName = extName;// Save file extension
}
@Override
public boolean accept(File pathname) {
// Filter file extensions
if (pathname.getName().toUpperCase()
.endsWith(extName.toUpperCase()))
return true;
return false;
}
}
private JPanel contentPane;
private JTextField forwardField;
private JTextField templetField;
private File dir;
private JTable table;
private JTextField extNameField;
private JSpinner startSpinner;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
RenameFiles frame = new RenameFiles();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public RenameFiles() {
setResizable(false);
setTitle("File batch renaming");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 383, 409);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
GridBagLayout gbl_contentPane = new GridBagLayout();
gbl_contentPane.columnWidths = new int[] { 72, 54, 60, 87, 91, 0 };
gbl_contentPane.rowHeights = new int[] { 25, 25, 10, 25, 24, 25, 2,
216, 0 };
gbl_contentPane.columnWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0,
Double.MIN_VALUE };
gbl_contentPane.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, Double.MIN_VALUE };
contentPane.setLayout(gbl_contentPane);
JLabel label = new JLabel();
label.setText("File batch rename module:");
GridBagConstraints gbc_label = new GridBagConstraints();
gbc_label.fill = GridBagConstraints.VERTICAL;
gbc_label.insets = new Insets(0, 0, 5, 5);
gbc_label.gridwidth = 3;
gbc_label.gridx = 1;
gbc_label.gridy = 0;
contentPane.add(label, gbc_label);
JLabel label_1 = new JLabel();
label_1.setText("file path:");
GridBagConstraints gbc_label_1 = new GridBagConstraints();
gbc_label_1.anchor = GridBagConstraints.EAST;
gbc_label_1.fill = GridBagConstraints.VERTICAL;
gbc_label_1.insets = new Insets(0, 0, 5, 5);
gbc_label_1.gridx = 0;
gbc_label_1.gridy = 1;
contentPane.add(label_1, gbc_label_1);
forderField = new JTextField();
forderField.setText("");
GridBagConstraints gbc_forderField = new GridBagConstraints();
gbc_forderField.fill = GridBagConstraints.HORIZONTAL;
gbc_forderField.insets = new Insets(0, 0, 5, 5);
gbc_forderField.gridwidth = 3;
gbc_forderField.gridx = 1;
gbc_forderField.gridy = 1;
contentPane.add(forderField, gbc_forderField);
JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_button_actionPerformed(e);
}
});
button.setText("Browse");
GridBagConstraints gbc_button = new GridBagConstraints();
gbc_button.anchor = GridBagConstraints.NORTHWEST;
gbc_button.insets = new Insets(0, 0, 5, 0);
gbc_button.gridx = 4;
gbc_button.gridy = 1;
contentPane.add(button, gbc_button);
JSeparator separator_1 = new JSeparator();
GridBagConstraints gbc_separator_1 = new GridBagConstraints();
gbc_separator_1.fill = GridBagConstraints.BOTH;
gbc_separator_1.insets = new Insets(0, 0, 5, 0);
gbc_separator_1.gridwidth = 5;
gbc_separator_1.gridx = 0;
gbc_separator_1.gridy = 2;
contentPane.add(separator_1, gbc_separator_1);
JLabel label_5 = new JLabel();
label_5.setText("Use # to specify the position occupied by the number count, and use * to insert the original file name:");
GridBagConstraints gbc_label_5 = new GridBagConstraints();
gbc_label_5.fill = GridBagConstraints.VERTICAL;
gbc_label_5.insets = new Insets(0, 0, 5, 0);
gbc_label_5.gridwidth = 5;
gbc_label_5.gridx = 0;
gbc_label_5.gridy = 3;
contentPane.add(label_5, gbc_label_5);
JLabel label_3 = new JLabel();
label_3.setText(" template: ");
GridBagConstraints gbc_label_3 = new GridBagConstraints();
gbc_label_3.anchor = GridBagConstraints.EAST;
gbc_label_3.fill = GridBagConstraints.VERTICAL;
gbc_label_3.insets = new Insets(0, 0, 5, 5);
gbc_label_3.gridx = 0;
gbc_label_3.gridy = 4;
contentPane.add(label_3, gbc_label_3);
templetField = new JTextField();
templetField.setText("catrestaurant###");
GridBagConstraints gbc_templetField = new GridBagConstraints();
gbc_templetField.anchor = GridBagConstraints.SOUTH;
gbc_templetField.fill = GridBagConstraints.HORIZONTAL;
gbc_templetField.insets = new Insets(0, 0, 5, 5);
gbc_templetField.gridwidth = 3;
gbc_templetField.gridx = 1;
gbc_templetField.gridy = 4;
contentPane.add(templetField, gbc_templetField);
JLabel label_4 = new JLabel();
label_4.setText("starts:");
GridBagConstraints gbc_label_4 = new GridBagConstraints();
gbc_label_4.fill = GridBagConstraints.VERTICAL;
gbc_label_4.insets = new Insets(0, 0, 5, 5);
gbc_label_4.gridx = 0;
gbc_label_4.gridy = 5;
contentPane.add(label_4, gbc_label_4);
startSpinner = new JSpinner();
GridBagConstraints gbc_startSpinner = new GridBagConstraints();
gbc_startSpinner.fill = GridBagConstraints.HORIZONTAL;
gbc_startSpinner.insets = new Insets(0, 0, 5, 5);
gbc_startSpinner.gridx = 1;
gbc_startSpinner.gridy = 5;
contentPane.add(startSpinner, gbc_startSpinner);
JLabel label_2 = new JLabel();
label_2.setText(" extension: ");
GridBagConstraints gbc_label_2 = new GridBagConstraints();
gbc_label_2.fill = GridBagConstraints.HORIZONTAL;
gbc_label_2.insets = new Insets(0, 0, 5, 5);
gbc_label_2.gridx = 2;
gbc_label_2.gridy = 5;
contentPane.add(label_2, gbc_label_2);
JButton startButton = new JButton();
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_startButton_actionPerformed(e);
}
});
extNameField = new JTextField();
extNameField.setText("jpg");
GridBagConstraints gbc_extNameField = new GridBagConstraints();
gbc_extNameField.fill = GridBagConstraints.HORIZONTAL;
gbc_extNameField.insets = new Insets(0, 0, 5, 5);
gbc_extNameField.gridx = 3;
gbc_extNameField.gridy = 5;
contentPane.add(extNameField, gbc_extNameField);
startButton.setText("Start");
GridBagConstraints gbc_startButton = new GridBagConstraints();
gbc_startButton.anchor = GridBagConstraints.NORTH;
gbc_startButton.insets = new Insets(0, 0, 5, 0);
gbc_startButton.gridx = 4;
gbc_startButton.gridy = 5;
contentPane.add(startButton, gbc_startButton);
JSeparator separator_2 = new JSeparator();
GridBagConstraints gbc_separator_2 = new GridBagConstraints();
gbc_separator_2.anchor = GridBagConstraints.NORTH;
gbc_separator_2.fill = GridBagConstraints.HORIZONTAL;
gbc_separator_2.insets = new Insets(0, 0, 5, 0);
gbc_separator_2.gridwidth = 5;
gbc_separator_2.gridx = 0;
gbc_separator_2.gridy = 6;
contentPane.add(separator_2, gbc_separator_2);
JScrollPane scrollPane = new JScrollPane();
GridBagConstraints gbc_scrollPane = new GridBagConstraints();
gbc_scrollPane.fill = GridBagConstraints.BOTH;
gbc_scrollPane.gridwidth = 5;
gbc_scrollPane.gridx = 0;
gbc_scrollPane.gridy = 7;
contentPane.add(scrollPane, gbc_scrollPane);
table = new JTable();
table.setModel(new DefaultTableModel(new Object[][] {}, new String[] {
"Old file name", "New file name" }));
scrollPane.setViewportView(table);
}
/**
* How to handle event of browsing buttons
*
* @param e
*/
protected void do_button_actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();// Create a file selector
// Set only folder selection
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int option = chooser.showOpenDialog(this);// Show open dialog box
if (option == JFileChooser.APPROVE_OPTION) {
dir = chooser.getSelectedFile();// Get the selected folder
} else {
dir = null;
}
forderField.setText(dir + "");// Display folder information
}
/**
* Start button event handling method
*
* @param e
*/
protected void do_startButton_actionPerformed(ActionEvent e) {
String templet = templetField.getText();// Get the template string
if (templet.isEmpty()) {
JOptionPane.showMessageDialog(this, "Please confirm rename template", "Information dialog",
JOptionPane.WARNING_MESSAGE);
return;
}
// Get the table data model
DefaultTableModel model = (DefaultTableModel) table.getModel();
model.setRowCount(0);// Clear table data
int bi = (Integer) startSpinner.getValue();// Get the start number
int index = templet.indexOf("#");// Get the index of the first "#"
String code = templet.substring(index);// Get the number placeholder string in the template
// Replace the number placeholder string in the template with the specified format
templet = templet.replace(code, "%0" + code.length() + "d");
String extName = extNameField.getText().toLowerCase();
if (extName.indexOf(".") == -1)
extName = "." + extName;
// Get the file list array in the file
File[] files = dir.listFiles(new ExtNameFileFilter(extName));
for (File file : files) {// Array of variable files
// Format each file name
String name = String.format(templet, bi++) + extName;
// Add the old and new names of the file to the table's data model
model.addRow(new String[] { file.getName(), name });
File parentFile = file.getParentFile();// Get the folder object where the file is located
File newFile = new File(parentFile, name);
file.renameTo(newFile);// File rename
}
}
}
The effect is shown in the picture: