2013-02-23 202 views
-1

我有一個jtable,顯示一個文本文件包含在自己的。 文本文件中的每一行都是用戶記錄。 我添加一個編輯按鈕來編輯表格上的每個選定的行。 我用這個代碼,但我不知道如何做到這一點:編輯jtable的用戶信息

public class AllUser extends AbstractTableModel { 

UserInformation uiS = new UserInformation(); 
String[] col = {"ID", "Fname", "Lname", "Gender", "Date"}; 
List<UserInformation> Udata = new ArrayList<UserInformation>(); 

public AllUser() { 
BufferedReader br = null; 
    try { 
     FileReader fr = new FileReader("xxx.txt"); 
     br = new BufferedReader(fr); 
     String line; 
     while ((line = br.readLine()) != null) { 
      if (line.trim().length() == 0) { 
       continue; 
      } 
      Udata.add(initializeUserInfos(line)); 
     } 
    } catch (IOException e) { 
    } finally { 
     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException ioe) { 
      } 
     } 
    } 
} 

private UserInformation initializeUserInfos(String str) { 
    UserInformation Uinit = new UserInformation(); 
    String[] CellArray = str.split("  "); 
    Uinit.setID(CellArray[0]); 
    Uinit.setFname(CellArray[1]); 
    Uinit.setLname(CellArray[2]); 
    Uinit.setGender(CellArray[3]); 
    Uinit.setDate(CellArray[4]); 
    return Uinit; 
} 
@Override 
public String getColumnName(int colu) { 
    return col[colu]; 
} 

@Override 
public int getRowCount() { 
    return Udata.size(); 
} 

@Override 
public int getColumnCount() { 
    return col.length; 
} 

@Override 
public Object getValueAt(int rowIndex, int columnIndex) { 
    UserInformation uinfoS = Udata.get(rowIndex); 
    Object value = null; 
    switch (columnIndex) { 
     case 0: 
      value = uinfoS.getID(); 
      break; 
     case 1: 
      value = uinfoS.getFname(); 
      break; 
     case 2: 
      value = uinfoS.getLname(); 
      break; 
     case 3: 
      value = uinfoS.getGender(); 
      break; 
     case 4: 
      value = uinfoS.getDate(); 
      break; 
     default: 
      value = "..."; 
    } 
    return value; 
} 

@Override 
public void setValueAt(Object value, int rowIndex, int columnIndex) { 
    UserInformation userInfo = new UserInformation(); 

    switch (columnIndex) { 

     case 0: 
      userInfo.setID((String) value); 
      break; 
     case 1: 
      userInfo.setFname((String) value); 
      break; 
     case 2: 
      userInfo.setLname((String) value); 
      break; 
     case 3: 
      userInfo.setGender((String) value); 
      break; 
     case 4: 
      userInfo.setDate((String) value); 
      break; 
    } 

} 

public Object getSelectedMember(int row){ 
    UserInformation userInf=new UserInformation(); 

    Object fname=userInf.getFname(); 
    Object lname=userInf.getLname(); 
    Object gender=userInf.getGender(); 
    Object date=userInf.getDate(); 
    return // ? 

} 
} 

我補充這getSelectedMember(int row)方法要做到這一點,但不正確的!

public class UserPage extends JFrame implements ActionListener { 

private AllUser userModel; 
private JTable uTable; 
private JButton editButton; 

public UserPage() { 
    userModel = new AllUser(); 
    uTable = new JTable(userModel); 
    add(new JScrollPane(uTable), BorderLayout.CENTER); 
    add(buttonPanels(), BorderLayout.PAGE_START); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setSize(800, 600); 
} 
public final JPanel buttonPanels() { 
    JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
    editButton=new JButton("Edit"); 
    editButton.addActionListener(this); 
    buttonsPanel.add(editButton); 
    return buttonsPanel; 
} 
@Override 
public void actionPerformed(ActionEvent e) { 
     if(e.getSource()== editButton){ 
     int selectedRow=uTable.getSelectedRow(); 
     if(selectedRow>0){ 
      editUser(selectedRow); 
     } 
     else{ 
      JOptionPane.showMessageDialog(null, "Select a user"); 
     } 

    } 
} 
    public void editUser(int row){ 
    userModel.getSelectedMember(row); 
    new NewUserFrame_Edit().setVisible(true); 
} 
} 

UserInformation類別:

public class UserInformation { 

private String Fname; 
private String Lname; 
private String ID; 
private String Gender; 
private String Date; 

public String getFname() { 
    return Fname; 
} 

public void setFname(String fname) { 
    this.Fname = fname; 
} 

public String getLname() { 
    return Lname; 
} 

public void setLname(String lname) { 
    this.Lname = lname; 
} 

public String getID() { 
    return ID; 
} 

public void setID(String i_d) { 
    this.ID = i_d; 
} 

public String getGender() { 
    return Gender; 
} 

public void setGender(String gndr) { 
    this.Gender = gndr; 
} 

public String getDate() { 
    return Date; 
} 

public void setDate(String date) { 
    this.Date = date; 
} 

@Override 
public String toString() { 
    return ID + "  " + Fname + "  " 
      + Lname + "  " + Gender + "  " + Date + "\n"; 
} 
} 

對不起長碼。

+3

那麼,我們是否應該分析所有這些代碼以瞭解它應該做什麼以及它做了什麼?在你的問題中提供這些信息,並提出具體問題。不只是「如何做到」(無論它可能是什麼)。 – 2013-02-23 16:39:48

+0

我想從文本文件中檢索每一行,並更新它! – Sajad 2013-02-23 16:42:39

+0

它應該是這樣的:當用戶點擊jtable中的一行並單擊一個新頁面應該打開,然後每個舊數據應該插入自己的文本文件中 – Sajad 2013-02-23 16:43:54

回答

2

在表中創建一個額外的列並用Edit填充單元格值。然後使用合適的TableCellRenderer呈現Edit單元格。將表格添加MouseListener。獲取表格上單擊的單元格的rowcolumn號碼。如果單擊的單元格包含值Edit,則檢索該行每列的值,並將其顯示在包含JTextFields的面板中。使用JOptionpane或JDialog顯示該面板。以下是實現此任務的簡短代碼演示:

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.Component; 
import java.awt.Color; 
import java.awt.Point; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.Cursor; 
import javax.swing.BorderFactory; 
import javax.swing.border.BevelBorder; 
import javax.swing.JFrame; 
import javax.swing.JTable; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.JButton; 
import javax.swing.JScrollPane; 
import javax.swing.JOptionPane; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 
import javax.swing.event.TableModelListener; 
import javax.swing.event.TableModelEvent; 
import javax.swing.table.TableModel; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableColumn; 
import javax.swing.table.DefaultTableCellRenderer; 
class TableRowEdit extends JFrame 
{ 
    private JTable table; 
    private JScrollPane jsPane; 
    private TableModel myModel; 
    private JPanel dialogPanel; 
    private JTextField tf[]; 
    private JLabel  lbl[]; 
    public void prepareAndShowGUI() 
    { 
     myModel = new MyModel(); 
     table = new JTable(myModel); 
     jsPane = new JScrollPane(table); 
     table.getColumnModel().getColumn(2).setCellRenderer(new LabelCellRenderer()); 
     table.addMouseListener(new MyMouseAdapter()); 
     getContentPane().add(jsPane); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     prepareDialogPanel(); 
     pack(); 
     setVisible(true); 

    } 
    private void prepareDialogPanel() 
    { 
     dialogPanel = new JPanel(); 
     int col = table.getColumnCount() - 1; 
     dialogPanel.setLayout(new GridLayout(col,2)); 
     tf = new JTextField[col]; 
     lbl = new JLabel[col]; 
     for (int i = 0; i < col; i++) 
     { 
      lbl[i] = new JLabel(table.getColumnName(i)); 
      tf[i] = new JTextField(10); 
      dialogPanel.add(lbl[i]); 
      dialogPanel.add(tf[i]); 
     } 
    } 
    private void populateTextField(String[] s) 
    { 
     for (int i = 0 ; i < s.length ; i++) 
     { 
      tf[i].setText(s[i]); 
     } 
    } 
    public class LabelCellRenderer extends DefaultTableCellRenderer 
    { 
     public Component getTableCellRendererComponent(JTable table,Object oValue, boolean isSelected, boolean hasFocus, int row, int column) 
     { 
      Component c = super.getTableCellRendererComponent(table, oValue,isSelected, hasFocus,row, column); 
      String value = (String)oValue; 
      JLabel label =(JLabel)c; 
      label.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED)); 
      label.setBackground(Color.lightGray); 
      label.setHorizontalTextPosition(SwingUtilities.CENTER); 
      label.setHorizontalAlignment(SwingUtilities.CENTER); 
      label.setText(value); 
      return label; 
     } 
    } 

    private class MyMouseAdapter extends MouseAdapter 
    { 
     @Override 
     public void mousePressed(MouseEvent evt) 
     { 
      int x = evt.getX(); 
      int y = evt.getY(); 
      int row = table.rowAtPoint(new Point(x,y)); 
      int col = table.columnAtPoint(new Point(x,y)); 
      if (col == 2) 
      { 
       String arr[] = new String[table.getColumnCount() - 1]; 
       for (int i = 0 ; i < arr.length ; i++) 
       { 
        arr[i] = (String)table.getValueAt(row,i); 
       } 
       populateTextField(arr); 
       JOptionPane.showMessageDialog(TableRowEdit.this,dialogPanel,"Information",JOptionPane.INFORMATION_MESSAGE); 
       //Write here the code to save changed values to file and update to JTable also. 
      } 
     } 
    } 
    private class MyModel extends AbstractTableModel 
    { 
     String[] columns = { 
          "Roll No.", 
          "Name", 
          "Action" 
          }; 
     String[][] inData = { 
           {"1","Huge Jackman","Edit"}, 
           {"2","Thomas Andrews","Edit"}, 
           {"3","Shiney","Edit"} 
          }; 
     @Override 
     public void setValueAt(Object value, int row, int col) 
     { 
      inData[row][col] = (String)value; 
     } 
     @Override 
     public Object getValueAt(int row, int col) 
     { 
      return inData[row][col]; 
     } 
     @Override 
     public int getColumnCount() 
     { 
      return columns.length; 
     } 
     @Override 
     public int getRowCount() 
     { 
      return inData.length; 
     } 
     @Override 
     public String getColumnName(int col) 
     { 
      return columns[col]; 
     } 
    } 
    public static void main(String st[]) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       TableRowEdit td = new TableRowEdit(); 
       td.prepareAndShowGUI(); 
      } 
     }); 
    } 
} 
3

它前人的精力是這樣的:當用戶點擊JTable中的一行,並點擊一個新頁面應該打開,然後將每個舊的數據應該在自己的textfiled

  1. 插入的MouseListener添加到表。

  2. 雙擊創建一個包含編輯數據所需的文本字段的JDialog。

  3. 然後,您使用getValueAt(...)方法從表中獲取數據。

  4. 然後用戶在文本字段中編輯數據。

  5. 當用戶單擊對話框上的「保存」按鈕時,將從每個文本字段獲取數據並使用setValueAt(...)方法更新表。

  6. 如果要將數據保存在文本文件中,則需要通過寫出表中的所有數據來重新創建enitre文件。

+0

如何從getValueAt(...)方法獲取數據到我的JDialog文本字段中? – Sajad 2013-02-23 17:53:31

+0

@ Sajjad-HiFriend首先從表中提取數據並將其傳遞給對話框 – MadProgrammer 2013-02-23 20:19:58