如何使用Combobox + Listener

时间:2013-11-25 22:27:40

标签: java swing jtable jcombobox itemlistener

我是Java的法国人和新手.. 关于“voilier”(船)的“regates”(种族),我有一个项目要做。 有一个regate的组合,这必须是一个Jtable的船,我们可以增加他们的比赛结束的时间。 我的问题是,当我们点击组合中的一个项目但我不知道该怎么做时,我想制作这个Jtable。

我的代码:

package eole;

import java.awt.event.ItemEvent;

public class ArrivéesVoiliers extends JFrame implements ItemListener {

    private JPanel contentPane;
    private JTable tableArrivées;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ArrivéesVoiliers frame = new ArrivéesVoiliers();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public ArrivéesVoiliers() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JComboBox combRegate = new JComboBox();
        combRegate.setBounds(30, 25, 90, 20);
        contentPane.add(combRegate);
        ArrayList<Regate> lesReg = Application.getRegates();

        for (Regate laReg : lesReg) {
            combRegate.addItem(laReg.getNomReg());
        }

        combRegate.addItemListener(this);

        String nom = (String) combRegate.getSelectedItem();
        Regate regSelec = Application.getRegate(nom);

        JLabel lblDateDep = new JLabel(regSelec.getDate());
        lblDateDep.setBounds(130, 31, 60, 14);
        contentPane.add(lblDateDep);

        JLabel lblHeuredepart = new JLabel(regSelec.getTime());
        lblHeuredepart.setBounds(200, 31, 60, 14);
        contentPane.add(lblHeuredepart);

        ArrayList<Voilier> voiliersPart = Application.getVoiliers(regSelec);

        String[] entetes = { "Voiliers participants", " Classe", "Rating",
                "Heure arrivée", "en seconde", "Abandon", "Stop Chrono",
                "Ajout" };

        DefaultTableModel voilPart = new DefaultTableModel();
        voilPart.setColumnCount(8);
        for (Voilier unVoil : voiliersPart) {
            voilPart.addRow(new Object[] { unVoil.getNom(), unVoil.getNum(),
                    unVoil.getRating(), "Heure arrivée", "en seconde",
                    new Boolean(false), new Boolean(false), "Ajouter" });
        }

        new AbstractTableModel() {
            public int getColumnCount() {
                return 0;
            }

            public int getRowCount() {
                return 0;
            }

            public Object getValueAt(int rowIndex, int columnIndex) {
                return null;
            }

            public boolean isCellEditable(int row, int col) {
                if (col == 4) {
                    return true;
                } else {
                    return false;
                }
            }
        };

        tableArrivées = new JTable(voilPart);
        tableArrivées.setBounds(50, 228, 312, -125);
        contentPane.add(tableArrivées);

    }

    @Override
    public void itemStateChanged(ItemEvent e) {
    }
}

2 个答案:

答案 0 :(得分:2)

您应该使用EventListener

,而不是使用ChangeListener

答案 1 :(得分:1)

以下一种方式更改itemStateChanged(ItemEvent e)方法:

@Override
public void itemStateChanged(ItemEvent e) {
    if(e.getStateChange() == ItemEvent.SELECTED){
        voilPart.addRow(new Object[] {  "col1",  "col2",
                 "col3", "col4", "col5",
                new Boolean(false), new Boolean(false), "col8" });
    }
}

我还建议您:

1)使用setLayout(null);setBounds()方法代替,尝试使用LayoutManager,尝试从FlowLayoutBorderLayout开始,这非常简单。

2)设置JFrame使用方法pack()的尺寸;

3)我认为entetes它的列名创建了你的TableModel,就像下一个

DefaultTableModel voilPart = new DefaultTableModel(new Object[][]{},entetes);

4)将voilPart设置为实例变量,以便在itemStateChanged()方法中使用它来添加新行。

5)这不是重要的代码,你可以删除它,因为它是从未使用的局部变量:

new AbstractTableModel() {
    public int getColumnCount() {
        return 0;
    }

    public int getRowCount() {
        return 0;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        return null;
    }

    public boolean isCellEditable(int row, int col) {
        if (col == 4) {
            return true;
        } else {
            return false;
        }
    }
};

6)将您的表格添加到JScrollPane以进行滚动。

有用的人:

How to use Scroll Pane

JTable tutorial

Variables in Java