I'm trying to list browsed and drag&dropped files name in JTable. So I have tried to add dropped file names in JTableusing interface, because I will get dropped file path in one class and my JTable in another class. So I have tried to acheive this using interface. But i'm getting an exception like below when I tried to add dropped file names in JTable,
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.example.windowapp.CheckBoxTable.<init>(CheckBoxTable.java:56)
at com.example.windowapp.CheckBoxTable.createAndShowUI(CheckBoxTable.java:125)
at com.example.windowapp.CheckBoxTable.access$2(CheckBoxTable.java:123)
at com.example.windowapp.CheckBoxTable$5.run(CheckBoxTable.java:135)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
I'm using this class to add browsed and dropped file names in JTable,
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import com.ibm.icu.text.SimpleDateFormat;
@SuppressWarnings("serial")
public class CheckBoxTable extends JPanel implements OptionMenuListener{
public static final String[] COLUMNS = {"Selected Files", "File Name", "Date"};
// public static final String[] INITIAL_ITEMS = {"Milk", "Flour", "Rice", "Cooking Oil", "Vinegar"};
// public static final String[] INITIAL_ITEMS1 = {"Milk", "Flour", "Rice", "Cooking Oil", "Vinegar"};
public static final String[] INITIAL_ITEMS = {};
public static final String[] INITIAL_ITEMS1 = {};
private CheckBoxDefaultTableModel model = new CheckBoxDefaultTableModel(COLUMNS, 0);
private JTable table = new JTable(model);
private JTextField itemTextField = new JTextField("item", 10);
public CheckBoxTable() {
JButton addItemBtn = new JButton("Browse");
addItemBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
showSaveFileDialog();
// addItemActionPerformed();
}
});
JButton removeCheckedItemsBtn = new JButton("Remove Checked Items");
removeCheckedItemsBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// removeCheckedItemsActionPerformed();
}
});
JButton showAllBtn = new JButton("Show All");
showAllBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// showAllActionPerformed();
}
});
itemTextField.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent e) {
itemTextField.selectAll();
}
});
JComponent cp = (JComponent) getRootPane();
cp.setTransferHandler(new MyFileTransferHandler(CheckBoxTable.this)); // see below
JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0));
btnPanel.add(itemTextField);
btnPanel.add(addItemBtn);
btnPanel.add(removeCheckedItemsBtn);
btnPanel.add(showAllBtn);
setLayout(new BorderLayout(5, 5));
add(new JScrollPane(table), BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
for (int i = 0; i < INITIAL_ITEMS.length; i++) {
Object[] row = {Boolean.FALSE, INITIAL_ITEMS[i], INITIAL_ITEMS1[i]};
model.addRow(row);
}
}
private void showAllActionPerformed() {
model.showAll();
}
private void removeCheckedItemsActionPerformed() {
model.removeCheckedItems();
}
public static String getFileName(String path) {
int index = path.lastIndexOf(File.separator);
if (index != -1 && (index + 1) < path.length()) {
return path.substring(index + 1);
}
return path;
}
private void addItemActionPerformed() {
String item = itemTextField.getText().trim();
if (!item.isEmpty()) {
Object[] row = {Boolean.FALSE, item,"test"};
model.addRow(row);
}
}
private void showSaveFileDialog() {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setDialogTitle("Specify a file to save");
int userSelection = fileChooser.showSaveDialog(CheckBoxTable.this);
if (userSelection == JFileChooser.APPROVE_OPTION) {
File fileToSave = fileChooser.getSelectedFile();
System.out.println("Save as file: " + fileToSave.getAbsolutePath());
if(!fileToSave.getName().endsWith(".txt")){
JOptionPane.showMessageDialog(null, "Selected file is not text file. Please select another file!");
return;
}
if (fileToSave != null && !fileToSave.getAbsolutePath().isEmpty()) {
Object[] row = {Boolean.FALSE, getFileName(fileToSave.getAbsolutePath()),getTimeFromLong(System.currentTimeMillis(), "dd/MM/yyyy")};
model.addRow(row);
}
}
}
public static String getTimeFromLong(long time, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.getDefault());
return sdf.format(new Date(time));
}
private static void createAndShowUI() {
JFrame frame = new JFrame("File Transfer");
frame.getContentPane().add(new CheckBoxTable());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
@Override
public void onMenuSelectOption(String fileName) {
File file = new File(fileName);
if(!file.getName().endsWith(".txt")){
JOptionPane.showMessageDialog(null, "Selected file is not text file. Please select another file!");
return;
}
if (file != null && !fileName.isEmpty()) {
Object[] row = {Boolean.FALSE, getFileName(fileName),getTimeFromLong(System.currentTimeMillis(), "dd/MM/yyyy")};
model.addRow(row);
}
}
}
@SuppressWarnings("serial")
class CheckBoxDefaultTableModel extends DefaultTableModel {
private List<String> removedItemsList = new ArrayList<String>();
public CheckBoxDefaultTableModel(Object[] columnNames, int rowCount) {
super(columnNames, rowCount);
}
public void showAll() {
if (removedItemsList.size() > 0) {
Iterator<String> iterator = removedItemsList.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
Object[] row = {Boolean.TRUE, next, "test"};
addRow(row);
iterator.remove();
}
}
}
@Override
public Class<?> getColumnClass(int columnNumber) {
if (columnNumber == 0) {
return Boolean.class;
}
return super.getColumnClass(columnNumber);
}
public void removeCheckedItems() {
int rowCount = getRowCount();
for (int row = rowCount - 1; row >= 0; row--) {
if ((Boolean) getValueAt(row, 0)) {
removedItemsList.add(getValueAt(row, 1).toString());
removeRow(row);
}
}
}
}
and the interface is used to update my JTable when some files dropped on my window,
public interface OptionMenuListener {
void onMenuSelectOption(String fileName);
}
I'm new to java application. Could you please suggest me any idea to achieve it? Thanks in advance.