Как использовать Jcombo + Слушатель

Я француз и новичок в Java. У меня есть проект, касающийся "regates" (гонок) "voilier" (корабля). Есть комбо регейта и это должно сделать 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) {
    }
}

person Feyrisa    schedule 25.11.2013    source источник
comment
Это действительно важно, поэтому, если кто-то может мне помочь..   -  person Feyrisa    schedule 26.11.2013


Ответы (2)


Измените свой метод 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, попробуйте начать с FlowLayout и BorderLayout это очень просто.

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 для прокрутки.

Полезные лайки:

Как использовать панель прокрутки

учебник по JTable

Переменные в Java

person alex2410    schedule 26.11.2013

Вместо использования EventListener следует использовать < a href="http://docs.oracle.com/javase/7/docs/api/javax/swing/event/ChangeListener.html" rel="nofollow">ChangeListener.

person Kale    schedule 25.11.2013