1

I'm trying to create a program that will take data in from a random access file and sort it based on whichever checkbox the user selects. The data should be sorted by either the bank account number, customer name or balance (when a user clicks that checkbox the data in the text area becomes sorted based on that). Once the data is sorted, it is outputted into the JTextArea. I'm also trying to output the total amount of entries from the file in the text field below the check boxes.

Thanks!

import java.lang.reflect.Array;
import java.nio.file.*;
import java.text.DecimalFormat;
import java.util.Collections;
import java.io.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
import javax.swing.border.Border;

public class  GUIBankAcctSorter extends JFrame implements ItemListener {

    public static void main(String[] args) {

        GUIBankAcctSorter myFrame = new GUIBankAcctSorter();
        myFrame.setVisible(true);

        Path file = Paths.get("C:\\Java\\Bank.txt");

        final String ID_FORMAT = "0000";
        final String NAME_FORMAT = "        ";
        final int NAME_LENGTH = NAME_FORMAT.length();
        final String BALANCE_FORMAT = "00000.00";

        String delimiter = ",";

        String s = ID_FORMAT + delimiter + NAME_LENGTH + delimiter + BALANCE_FORMAT + System.getProperty("line.separator");

        final String EMPTY_ACCT = "0000";

        String[] array = new String[3];
        double balance = 0;

        output(s, array, delimiter,  balance,  EMPTY_ACCT, file);

        }

    private static final long serialVersionUID = 1L;
    private static final int WIDTH = 450;
    private static final int HEIGHT = 310;
    private static final int X_ORIGIN = 200;
    private static final int Y_ORIGIN = 200;

    JLabel title = new JLabel("Bank Account Sorter");
    JLabel sort = new JLabel("Sort By             ");
    JLabel total = new JLabel("Total # of Bank Accounts  ");

    private Container con = getContentPane();
    private FlowLayout layout = new FlowLayout();

    static JTextArea area = new JTextArea(10, 35); 
    static JTextField field = new JTextField(5);

    JCheckBox cust = new JCheckBox(" Cust # ", false);       
    JCheckBox bal = new JCheckBox(" Balance ", false);
    JCheckBox name = new JCheckBox(" Name ", false);


    public static void output(String s, String[] array, String delimiter, double balance, String EMPTY_ACCT, Path file){        
        String temp = "";
        try{
        InputStream iStream = new BufferedInputStream(Files.newInputStream(file));
        BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));     

        while(s != null){
            array = s.split(delimiter);
                if(!array[0].equals(EMPTY_ACCT)){
                    balance = Double.parseDouble(array[2]); 
                    area.append("Cust # " + array[0] + "\t" + " Name: " + array[1] + " Balance " + "\t$" + array[2]  + "\n");                   
                }                               
                    s = reader.readLine();                                          
            } 
            reader.close();

        }catch(Exception e){
            System.out.println("Message: " + e);
        }   
        field.setText(temp);
    }

    public GUIBankAcctSorter(){
        super("Bank Account Sorter");
        Font headFont = new Font("Arial", Font.BOLD, 28);
        con.setLayout(layout);              

        title.setFont(headFont);
        con.add(title);

        area.setEditable(false);
        field.setEditable(false);

        con.add(new JScrollPane(area));

        cust.addItemListener(this);
        bal.addItemListener(this);
        name.addItemListener(this);

        con.add(sort);
        con.add(cust);
        con.add(bal);
        con.add(name);      
        con.add(total);
        con.add(field);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(X_ORIGIN, Y_ORIGIN, WIDTH, HEIGHT);
        setResizable(false);
        setLocationRelativeTo(null);        
    }

    public void itemStateChanged(ItemEvent e) {
        Object source = e.getSource();
        int select = e.getStateChange();

        if(source == cust){
            if(select == ItemEvent.SELECTED){
                bal.setSelected(false);
                name.setSelected(false);
            }
        }

        if(source == bal){
            if(select == ItemEvent.SELECTED){
                cust.setSelected(false);
                name.setSelected(false);
            }
        }

        if(source == name){
            if(select == ItemEvent.SELECTED){
                cust.setSelected(false);
                bal.setSelected(false);
            }
        }                   

    }

}
Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
Mike Jones
  • 13
  • 2

2 Answers2

1

Here you can see a good example using comparator to sort the object.

Let us suppose: RowTest is a class that represent a single row of grid. orderAMT is a class variable/Column/JTextField of Row. Now the code below show how to sort the List of RowTest according to its attribute orderAMT.

 List<RowTest> sortedList = getAllRowsThatNeedToBeSorted();
        Comparator comparator = new OrderAMTComparator();
        Collections.sort(sortedList, comparator);





    public class OrderAMTComparator implements Comparator<RowTest> {

        @Override
        public int compare(RowTest o1, RowTest o2) {
//Here you can use If condition to check which checkbox is selected and sort the list 
//repace getOrderAMT with other fields.

            BigDecimal compareRes = o1.getOrderAMT().getBigdecimalValue().subtract(o2.getOrderAMT().getBigdecimalValue());

//You can just return compareRes.compareTo(new BigDecimal(0))
//But Here I want to show that you can check any condition and return -1,1,0 as your
//requirement      

            if (compareRes.compareTo(new BigDecimal(0)) == -1) {
                return -1;
            } else if (compareRes.compareTo(new BigDecimal(0)) == 1) {
                return 1;
            } else if (compareRes.compareTo(new BigDecimal(0)) == 0 ) {
                return 0;
            }
            return compareRes.intValue();
        }
    }

I hope you have understand this. If not I will elaborate. Thankyou.

Milan
  • 245
  • 3
  • 11
1

Is there anyway to do it with checkboxes?

Certainly:

  • Declare an Account class that stores the account number, name & balance.
  • Add each new Account to a List structure such as ArrayList.
  • Create a Comparator relevant to each of the 2 fields.
  • At time of sort, use Collections.sort(list,comparator).
  • Refresh the text area with the content of the sorted list.

Other tips

  • Since those check boxes are mutually exclusive, they should really be a ButtonGroup of JRadioButton instances.
  • Change setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); to setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); & setLocationRelativeTo(null) to setLocationByPlatform(true). See this answer for a demo.
  • Change setBounds(X_ORIGIN, Y_ORIGIN, WIDTH, HEIGHT); for pack() (& use layouts more effectively).
Community
  • 1
  • 1
Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433