2013-02-23 207 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