Wyświetlanie zawartości listy na JTable.

0

Cześć,
mam problem z wyświetlaniem elementów z listy na JTable.

Oto mój kod:
(...)

@SuppressWarnings("serial")

public class GUI extends JFrame implements ActionListener {

    private JTabbedPane tabbedPane;
    private JPanel panel1, panel2, panel3;
    private JButton next, generate, back, save;
    private JTextField nameField, surnameField, idField;
    @SuppressWarnings("rawtypes")
    private JComboBox semestrBox, degreeBox, departmentBox;
(...)
    public static String[] kolumnyTab = {"Imie", "Nazwisko", "Nr indeksu", "Wydział", "Semestr"};
    public String imie, nazwisko, wydzial, semestr, stopien;
    public int nrIndeksu;
    private List<Student> s = new ArrayList<Student>();

    public GUI (){
        setTitle ("Obsługa sprawy");
        setSize(400, 500);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel topPanel = new JPanel();
        topPanel.setLayout( new BorderLayout() );
        getContentPane().add( topPanel );

        page1();
        page2();
        page3();

        tabbedPane = new JTabbedPane();
        tabbedPane.addTab( "Załóż sprawę", panel1 );
        tabbedPane.addTab( "Wypełnianie", panel2 );
        tabbedPane.addTab( "Lista spraw", panel3 );
        topPanel.add( tabbedPane, BorderLayout.CENTER );
    }

(...)

    private void page3() {
        panel3 = new JPanel();
        panel3.setLayout( null );

        (...)

        JTable table = new JTable(s.toArray(new Object [][]{}), kolumnyTab);
        JScrollPane scPane = new JScrollPane (table);
        scPane.setBounds(10, 100, 360, 240);
        panel3.add(scPane, BorderLayout.CENTER);

        (...)
}

    public void actionPerformed(ActionEvent e) {
        (...)
        if (e.getSource() == generate){
            imie = nameField.getText();
            nazwisko = surnameField.getText();
            nrIndeksu = Integer.parseInt(idField.getText());
            s.add(new Student (imie, nazwisko, nrIndeksu, wydzial, semestr));
            panel3.repaint();
(...)

    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GUI grafika = new GUI ();
                    grafika.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

    }
}

Próbowałem tak:

TableModel tableModel = new DefaultTableModel(s.toArray(new Object[][] {}), kolumnyTab);
JTable table = new JTable(tableModel);

I tak:

JTable table = new JTable(s.toArray(new Object [][]{}), kolumnyTab);

I nie działa, tzn. elementy dodają się do listy poprawnie (wyświetlam je po dodaniu za pomocą metody toString()), ale nie dodają się one do JTable.

Bardzo proszę o pomoc.
Z góry dziękuję i pozdrawiam.

0

Zmieniłem trochę koncepcję, bo poczytałem, że dodawanie ArrayListy to JTable jest dość problematyczne więc zdecydowałem się użyć klasę Vector.

Oto mój kod:

(...)

@SuppressWarnings("serial")
public class GUI extends JFrame implements ActionListener {

(...)
    public Vector<String> wiersz = new Vector<String>();
    public String imie, nazwisko, wydzial, semestr, stopien, sprawa;
    private Vector<Istopien> sI = new Vector<Istopien>();
    private Vector<IIstopien> sII = new Vector<IIstopien>();
    DefaultTableModel tbm = new DefaultTableModel();

    public GUI (){
        setTitle ("Obsługa sprawy");
        setSize(400, 500);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel topPanel = new JPanel();
        topPanel.setLayout( new BorderLayout() );
        getContentPane().add( topPanel );

        page1();
        page2();
        page3();

        tabbedPane = new JTabbedPane();
        tabbedPane.addTab( "Załóż sprawę", panel1 );
        tabbedPane.addTab( "Wypełnianie", panel2 );
        tabbedPane.addTab( "Lista spraw", panel3 );
        topPanel.add( tabbedPane, BorderLayout.CENTER );
    }

(...)

    private void page3() {
        panel3 = new JPanel();
        panel3.setLayout( null );

        JLabel title = new JLabel( "Lista kolejkowa spraw" );
        title.setFont(font1);
        title.setBounds( 50, 15, 300, 100 );
        panel3.add( title );

        tbm.addColumn("Imie"); tbm.addColumn("Nazwisko"); tbm.addColumn("Nr indeksu"); tbm.addColumn( "Wydział"); tbm.addColumn("Semestr"); tbm.addColumn("Stopien"); tbm.addColumn("Sprawa");
        table = new JTable(tbm);
        JScrollPane scPane = new JScrollPane (table);
        scPane.setBounds(10, 100, 360, 240);
        panel3.add(scPane, BorderLayout.CENTER);

        save = new JButton ("Zapisz do pliku");
        save.setBounds(220 , 360, 120, 20);
        panel3.add(save);
        save.addActionListener (this);

(...)
        if (e.getSource() == generate){
            imie = nameField.getText();
            nazwisko = surnameField.getText();
            nrIndeksu = Integer.parseInt(idField.getText());

            if (stopien.equals("I stopień")){
                wiersz.add(new Istopien (imie, nazwisko, nrIndeksu, wydzial, semestr)+" "+sprawa);
                tbm.addRow(wiersz);
            }

            else {
                wiersz.add(new IIstopien (imie, nazwisko, nrIndeksu, wydzial, semestr)+" "+sprawa);
            }
        }
(...)

Mój problem jest taki, że jak dodaję w ten sposób:

if (stopien.equals("I stopień")){
                wiersz.add(new Istopien (imie, nazwisko, nrIndeksu, wydzial, semestr)+" "+sprawa);
                tbm.addRow(wiersz);
            }

to dodają mi się wszystkie dane do pojedynczej komórki, a ja chciałbym dodawać każdy wyraz do osobnej komórki. Wydaje mi się, że powinienem użyć pętli, która "przeleci" przez wszystkie pola owego vectora, ale nie jestem tego pewien. Czy mógłby mi ktoś pomóc w implementacji tego i powiedzieć, czy ogólny sposób zapisywania danych jest dobry?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0