1

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.

Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
Olive
  • 149
  • 1
  • 4
  • 13
  • See [What is a stack trace, and how can I use it to debug my application errors?](http://stackoverflow.com/q/3988788/418556) & [What is a Null Pointer Exception, and how do I fix it?](http://stackoverflow.com/q/218384/418556) – Andrew Thompson Oct 13 '17 at 08:20
  • Or in case you cannot solve it on your own with info. from those two threads: For better help sooner, post a [MCVE] or [Short, Self Contained, Correct Example](http://www.sscce.org/). – Andrew Thompson Oct 13 '17 at 08:31
  • @AndrewThompson Okay. thanks for your suggestion. – Olive Oct 13 '17 at 09:34

0 Answers0