3

I create a simple register form to add Name, Gender and city to the table, but i got some problem here. My table only will refresh when i click the maximize button on the left top of my form.

here is the code: http://pastebin.com/dFnix5NY

package test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.IOException;
import java.util.*;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Main extends JFrame{
    private Vector<String> columnNames = new Vector<String>();
    private Vector data = new Vector<>();
    private Vector<Vector> details = new Vector<Vector>();

    private DefaultTableModel dtm = new DefaultTableModel(details, columnNames);
    private JTable table = new JTable(dtm); 
    private JScrollPane spane = new JScrollPane(table);

    private JTextField field1 = new JTextField("Nama");
    private JTextField field2 = new JTextField("Gender");
    private JTextField field3 = new JTextField("City");
    private JButton ok = new JButton("Ok");

    JPanel panelForm = new JPanel(new GridLayout(1,4));

    Main(){
        columnNames.add("Nama");
        columnNames.add("city");
        columnNames.add("Gender");

        data.add("Dodi");
        data.add("Jakrta");
        data.add("Laki");
        details.add(data);

        panelForm.add(field1);
        panelForm.add(field2);
        panelForm.add(field3);
        panelForm.add(ok);


        ok.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                data = new Vector<>();
                data.add(field1.getText());
                data.add(field2.getText());
                data.add(field3.getText());

                details.add(data);
            }
        });

        dtm = new DefaultTableModel(details, columnNames);
        table = new JTable(dtm); 
        spane.setViewportView(table);
        add(panelForm, BorderLayout.SOUTH);
        add(spane, BorderLayout.CENTER);

        setTitle("Registration");
        setSize(300, 300);
        setLocationRelativeTo(null);
        setVisible(true);

    }

    public static void main(String[] args) {
        new Main();

    }

}
alex2410
  • 10,904
  • 3
  • 25
  • 41

2 Answers2

3

Add new rows to TableModel not to Vector, replace next line details.add(data); in actionPerformed() method to dtm.addRow(data);.

After adding row to TableModel, it fires events for refreshing.

alex2410
  • 10,904
  • 3
  • 25
  • 41
  • perfectly work thank you :). but why if I keep both the details.add(data) and dtm.addRow(data), it will add double data to my table? sorry if my question is bad – redo simatupang Dec 23 '14 at 08:12
  • Yeah, you get 2 new rows – alex2410 Dec 23 '14 at 08:14
  • sorry hehe, I did wrong write my question. the question should be: Why if I keep bothdetails.add(data) and dtm.addRow(data), its will double data to table? – redo simatupang Dec 23 '14 at 08:19
  • Because `TableModel` created with `details` parameter, and both lines add new values to `details`, but `addRow(...)` method fires events. – alex2410 Dec 23 '14 at 08:22
  • ohhh I got it :) so add to vector will add data to table but doesnt refresh the table. and when I call method add row, it will add data and refresh the table. Thanks for your explanation :) – redo simatupang Dec 23 '14 at 08:25
0

To add row you need to call dtm.addRow(data); And add row to your DefaultTableModel instead of list.

So the updated code will look like:

 ok.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            data = new Vector<>();
            data.add(field1.getText());
            data.add(field2.getText());
            data.add(field3.getText());


            dtm.addRow(data);
        }
    });
Kiki
  • 2,243
  • 5
  • 30
  • 43