2014-12-23 66 views
3

我创建了一个简单的注册表来添加名称,性别和城市到表中,但我在这里遇到了一些问题。 当我点击窗体左上角的最大化按钮时,我的表格才会刷新。我的Jtable不刷新

这里是代码: 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(); 

    } 

} 

回答

3

actionPerformed()方法TableModel加入新行不Vector,更换下一行details.add(data);dtm.addRow(data);

将行添加到TableModel之后,它会触发事件进行刷新。

+0

完美的工作谢谢你:)。 但为什么如果我保留details.add(data)和dtm.addRow(data),它会将双倍的数据添加到我的表中?对不起,如果我的问题是不好的 –

+0

是啊,你得到2个新的行 – alex2410

+0

对不起,呵呵, 我错了写我的问题。 问题应该是: 为什么如果我同时使用details.add(data)和dtm.addRow(data),它会将数据加倍到表? –

0

要添加您需要致电dtm.addRow(data);并添加一行到您的DefaultTableModel而不是列表行。

所以更新的代码如下:

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); 
     } 
    }); 
+0

完美的工作, 但为什么如果我保留details.add(data)和dtm.addRow(data),它会将双数据添加到我的表中? 对不起,如果我的问题不好 –

+0

然后给数据添加值并调用dtm.fireTableDataChanged(); – Kiki

+0

您只需从'TableModel'调用'fireXXX()'。 – alex2410