2014-12-23 65 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