1

ランダムアクセスファイルからデータを取得し、ユーザーが選択したチェックボックスに基づいて並べ替えるプログラムを作成しようとしています。データは、銀行口座番号、顧客名、または残高のいずれかで並べ替える必要があります (ユーザーがそのチェックボックスをクリックすると、テキスト領域のデータはそれに基づいて並べ替えられます)。データがソートされると、JTextArea に出力されます。また、チェック ボックスの下のテキスト フィールドにファイルからエントリの合計量を出力しようとしています。

ありがとう!

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);
            }
        }                   

    }

}
4

2 に答える 2

1

ここでは、コンパレーターを使用してオブジェクトをソートする良い例を見ることができます。

仮定してみましょう: RowTest は、グリッドの 1 行を表すクラスです。orderAMT は、Row のクラス変数/Column/JTextField です。以下のコードは、属性 orderAMT に従って RowTest の List をソートする方法を示しています。

 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();
        }
    }

これを理解していただければ幸いです。そうでない場合は、詳しく説明します。ありがとうございました。

于 2013-04-30T09:41:13.633 に答える
1

とにかくチェックボックスでそれを行うことはありますか?

そうです:

  • Account口座番号、名前、残高を格納するクラスを宣言します。
  • 次のような構造にそれぞれの新しいAccountを追加しますListArrayList.
  • Comparator2 つのフィールドのそれぞれに関連する を作成します。
  • ソート時には、 を使用しますCollections.sort(list,comparator)
  • ソートされたリストの内容でテキスト領域を更新します。

その他のヒント

  • これらのチェック ボックスは相互に排他的であるため、実際にButtonGroupJRadioButtonインスタンスの 1 つにする必要があります。
  • &に変更setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);します。デモについては、この回答を参照してください。setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);setLocationRelativeTo(null)setLocationByPlatform(true)
  • 変更(& レイアウトをより効果的に使用) setBounds(X_ORIGIN, Y_ORIGIN, WIDTH, HEIGHT);pack()
于 2013-04-30T09:41:48.600 に答える