1

ArrayListコレクションに保持されている顧客オブジェクトのリストを表示するJTableがあります。このJTableから、特定の顧客を強調表示できるようにしたいので、[顧客の削除]ボタンをクリックします。これにより、選択したテーブル行からID列の値が抽出され、イテレーターを使用してArrayListを検索し、一致するものを見つけます。顧客、およびコレクションからそれを削除します。スイングコンポーネントとイベントリスナーに関する私の専門知識には、まだまだ多くの要望があります。これまでに5つの異なる組み合わせを試しましたが、どこにも行き着きませんでした。どうすればこれを行うことができますか?これまでの私のコードの関連部分は次のとおりです。

class CustomerFrame extends JFrame{
    public CustomerFrame(travelagent agent){

        CustomerPanel cp = new CustomerPanel(agent, this);
        setSize(800,500);
        setLocationRelativeTo(null);
        setTitle("Actions for customer");


        add(cp);

    }
}

class CustomerPanel extends JPanel implements ActionListener, ListSelectionListener{
    private travelagent agent;
    private JButton addCust;
    private JButton deleteCust;
    private JButton editCust;
    private JButton bookFlight;
    private JButton exit;
    private CustomerFrame frame;
    private Object selectedID;
    private JTable ref;

    public CustomerPanel(travelagent agent, CustomerFrame frame){
        ListCustPanel lp = new ListCustPanel(agent);
        setLayout(new GridLayout(2,1,5,5));

        ref = lp.getTable();
        ListSelectionModel sel = ref.getSelectionModel();
        sel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        sel.addListSelectionListener(this);

        this.agent = agent;
        this.frame = frame;
        JLabel options = new JLabel("Options:");
        addCust = new JButton("Add customer");
        deleteCust = new JButton("Delete customer");
        editCust = new JButton("Edit Customer");
        bookFlight = new JButton("Book a flight");
        exit = new JButton("Back to main menu");

        options.setHorizontalAlignment(SwingConstants.CENTER);
        JPanel b = new JPanel(new GridLayout(3,2,5,5));

        b.add(options);
        b.add(addCust);
        b.add(deleteCust);
        b.add(editCust);
        b.add(bookFlight);
        b.add(exit);

        add(lp);
        add(b);

        addCust.addActionListener(this);
        deleteCust.addActionListener(this);
        editCust.addActionListener(this);
        bookFlight.addActionListener(this);
        exit.addActionListener(this);
    }


    public void valueChanged(ListSelectionEvent l){
        if(!l.getValueIsAdjusting()){
            int index = ref.getSelectedRow();
            selectedID = ref.getValueAt(index, 0);
        }
    }

    public void actionPerformed(ActionEvent e){
        if(e.getSource() == addCust){
            NewCustFrame cf = new NewCustFrame(agent, frame);
            cf.setVisible(true);
            cf.setDefaultCloseOperation(NewCustFrame.DISPOSE_ON_CLOSE);

        if(e.getSource() == deleteCust){
            DeleteCustFrame df = new DeleteCustFrame(agent, selectedID);
            df.setVisible(true);
            df.setDefaultCloseOperation(DeleteCustFrame.DISPOSE_ON_CLOSE);
        }
        if(e.getSource() == editCust){

        }
        if(e.getSource() == bookFlight){

        }
        if(e.getSource() == exit){
            frame.dispose();
        }

    }
    }



}





/*
 * this displays the list of customers:
 */
class ListCustPanel extends JPanel{

    private static final long serialVersionUID = 1L;
    private JTable table;
    public ListCustPanel(travelagent agent){

        String[] colNames = {"ID", "First Name", "Last Name"};

        int size = agent.getCust().size(); //get the size of the arraylist in order to define an object array to contain information in
        Object[][] data = new Object[size][3]; // create the array

        int i = 0;
        Iterator<customer> iter = agent.getCust().iterator(); //create an iterator to progress thought the arraylist
        while(iter.hasNext()){
            customer temp = iter.next(); //assign the current customer to a variable

            //extract its attributes and feed into object array
            data[i][0] = temp.getID(); 
            data[i][1] = temp.getFname();
            data[i++][2] = temp.getLname();

        }
        setLayout(new GridLayout(1,1,5,5));


        // convert the object array into a JTable
        table = new JTable(data, colNames);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        // create a sorter to sort table rows
        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(table.getModel());
        table.setRowSorter(sorter);
        ArrayList<SortKey> sortKeys = new ArrayList<RowSorter.SortKey>();
        sortKeys.add(new RowSorter.SortKey(2, SortOrder.ASCENDING));
        sorter.setSortKeys(sortKeys);


        JScrollPane scrollPane = new JScrollPane(table);
        table.setFillsViewportHeight(true);
        add(scrollPane);


    }

    public JTable getTable(){
        return table;
    }
}


/*
 * delete the customer using this
 */
class DeleteCustFrame extends JFrame{
    public DeleteCustFrame(travelagent agent, Object ID){
        DeleteCustPanel dcp = new DeleteCustPanel(agent, this, ID);
        add(dcp);

        setSize(300,200);
        setTitle("Delete Customer");
        setLocationRelativeTo(null);

    }

}

class DeleteCustPanel extends JPanel implements ActionListener{
    private travelagent agent;
    private JButton delete;
    private JButton cancel;
    private JTextField id;
    private DeleteCustFrame frame;
    public int ID;

    public DeleteCustPanel(travelagent agent, DeleteCustFrame frame, Object ID){
        this.ID = (int)ID;
        this.agent = agent;
        setLayout(new GridLayout(3,1,5,5));

        String fname = null;
        String lname = null;
        boolean hasFlight = false;
        Iterator<customer> iter = agent.getCust().iterator();
        while(iter.hasNext()){
            customer temp = iter.next();
            if(temp.getID() == this.ID){
                 fname = temp.getFname();
                 lname = temp.getLname();
            }
            if(temp.getNumFlight() > 0){
                hasFlight = true;
            }
        }

        JLabel desc = new JLabel("Customer: " + ID + " " + fname + " " + lname);;
        desc.setHorizontalAlignment(SwingConstants.CENTER);
        JLabel yesFlight;
        if(hasFlight){
             yesFlight = new JLabel("This customer has flights booked!");
        }else{
            yesFlight = new JLabel("No flights are booked for this customer");
        }

        yesFlight.setHorizontalAlignment(SwingConstants.CENTER);

        JPanel buttonPanel = new JPanel();

        buttonPanel.setLayout(new GridLayout(1,2,5,5));
        buttonPanel.add(delete);
        buttonPanel.add(cancel);

        add(desc);
        add(yesFlight);
        add(buttonPanel);

        delete.addActionListener(this);
        cancel.addActionListener(this);

    }


    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == delete){
            Iterator<customer> iter = agent.getCust().iterator();
            while(iter.hasNext()){
                customer temp = iter.next();
                if(temp.getID() == ID){
                    agent.deleteCust(temp);
                }
            }
            JOptionPane.showMessageDialog(null, "Customer deleted!", null, JOptionPane.PLAIN_MESSAGE);
            frame.dispose();
        }
        if(e.getSource() == cancel){
            frame.dispose();
        }

    }
}

これまでのところ、顧客を強調表示して[顧客の削除]をクリックすると、アクションは実行されません。私が知っている長いお尻の質問ですが、それが役立つ場合は、ListSelectionListenerを使用しようとしている場所の周りで問題が発生していると思われます。

4

1 に答える 1

4

JTableDefaultTableModelこれをはるかに簡単にするを提供します。の代わりに使用してくださいArrayList

メソッドにremoveRow(int)は、int(行)がどこから来たのかが含まれJTable.getSelectedRow()ます。

于 2012-10-08T11:26:16.163 に答える