【问题标题】:Displaying the values of an Arraylist with a JTable使用 JTable 显示 Arraylist 的值
【发布时间】:2014-09-15 23:09:51
【问题描述】:

我创建了一个名为 EmployeeGUI 的类,它能够创建任意数量的用户 Employee 对象并将它们添加到数组列表中。我遇到的问题是我的 GUI 底部有一个 JTable,我想显示我创建的所有对象,但在我的情况下,GUI 每次通过 for 循环时都会创建一个新的表对象对象的详细信息,但随着 for 循环的进行,新的详细信息会覆盖旧的详细信息,而不是添加到 jtable 的底部。谁能帮我调试我的错误?

这是我的代码

import java.awt.event.*;

public class EmployeeGUI extends JFrame implements ActionListener{

/**
 * @param args
 */
JFrame frame;
JButton button1, button2, button3, button4;
JTextField box1, box2, box3;
JLabel label1, label2, label3;
JTable table1;
int length = 0;
ArrayList<Employee> empArray = new ArrayList<Employee>();

public static void main(String[] args) {
    // TODO Auto-generated method stub
    EmployeeGUI empG = new EmployeeGUI();
    empG.frame.setVisible(true);
}

public EmployeeGUI()
{
    initialize();
}

public void initialize() {
    // TODO Auto-generated method stub
    frame = new JFrame("A Sample Window");
    frame.setBounds(50,50,680,400);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    label1 = new JLabel("F-Name:");
    label1.setBounds(30,33,54,25);
    frame.getContentPane().add(label1);

    box1 = new JTextField();
    box1.setBounds(94, 35, 128,20);
    frame.getContentPane().add(box1);

    label2 = new JLabel("S-Name:");
    label2.setBounds(250,33,54,25);
    frame.getContentPane().add(label2);

    box2 = new JTextField();
    box2.setBounds(305, 35, 128,20);
    frame.getContentPane().add(box2);

    label3 = new JLabel("Phone:");
    label3.setBounds(461,33,54,25);
    frame.getContentPane().add(label3);

    box3 = new JTextField();
    box3.setBounds(500, 35, 128,20);
    frame.getContentPane().add(box3);

    button1 = new JButton("Add Employee");
    button1.addActionListener(this);
    button1.setBounds(71,131,113,39);
    frame.getContentPane().add(button1);

    button2 = new JButton("Remove Employee");
    button2.addActionListener(this);
    button2.setBounds(194,131,128,39);
    frame.getContentPane().add(button2);

    button3 = new JButton("Display Employee");
    button3.addActionListener(this);
    button3.setBounds(332,131,128,39);
    frame.getContentPane().add(button3);

    button4 = new JButton("Quit Program");
    button4.addActionListener(this);
    button4.setBounds(475,131,113,39);
    frame.getContentPane().add(button4);

    table1 = new JTable();
    table1.setBounds(0,184,664,178);
    frame.getContentPane().add(table1);
}

@Override
public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    String action = ((JButton) e.getSource()).getActionCommand();
    if(action.equals("Add Employee"))
    {
        String fName = box1.getText();
        String lName = box2.getText();
        String pNo = box3.getText();

        int mobile = Integer.parseInt(pNo);

        Employee ee = new Employee(fName,lName,mobile);
        empArray.add(ee);
        length++;
        JOptionPane.showMessageDialog(null, "Employee Added");
    }
    if(action.equals("Remove Employee"))
    {
        String fName = box1.getText(), lName = box2.getText(); 
        int mobile = Integer.parseInt(box3.getText());
        Employee ee = new Employee(fName,lName,mobile);
        if(length>0)
        {
            for(int i=0; i<empArray.size(); i++)
            {
                if(empArray.get(i).getLName() == ee.getLName())
                {
                    empArray.remove(i);
                    JOptionPane.showMessageDialog(null, "Employee Removed");
                }
            }
        }
        else{       
            throw new ListEmptyException("List is Empty");
        }
    }
    if(action.equals("Display Employee"))
    {
        for(int i = 0; i <empArray.size(); i++)
        {
            table1.setModel(new DefaultTableModel(
                    new Object[][] {
                            {empArray.get(i).getFName(),empArray.get(i).getLName(),empArray.get(i).getMobile()}
                    },
                    new String[] {
                        "First Name", "Surname", "Phone Number"
                    }
                ));
        }
    }
    if(action.equals("Quit Program"))
    {
        System.exit(0);
    }
}
}

和员工类

public class Employee {
private String fName,lName;
private int mobile;

public Employee(String fName, String lName, int mobile)
{
    setFName(fName);
    setLName(lName);
    setMobile(mobile);
}

private void setMobile(int mobile) {
    // TODO Auto-generated method stub
    this.mobile = mobile;
}

public void setLName(String lName) {
    // TODO Auto-generated method stub
    this.lName = lName;
}

public void setFName(String fName) {
    // TODO Auto-generated method stub
    this.fName = fName;
}

public String getFName()
{
    return fName;
}

public String getLName()
{
    return lName;
}

public int getMobile()
{
    return mobile;
}

public String toString()
{
    return getFName()+" "+getLName()+" "+getMobile();
}

public void print()
{
    System.out.println(toString());
}
}

【问题讨论】:

  • 哎呀System.exit(0)...您每次都重置表模型。请改用自定义 MutableTableModelmodel.fireTableDataChanged()
  • 您在 for 循环的每次迭代中都创建了一个 new TableModel —— 所以您不应该对您的代码正在做它正在做的事情感到惊讶。解决方案:不要那样做。在for循环之前创建一个模型,并用for循环内部的项目填充它。这不是Java,这是常识。此外,您需要摆脱 setBounds 并使用布局管理器。

标签: java swing user-interface arraylist jtable


【解决方案1】:

仅评论,更长

  • 查看在循环for(int i = 0; i &lt;empArray.size(); i++)中创建的table1.setModel(new DefaultTableModel(的数量

  • new Object[][] {{empArray.get(i).getFName(), empArray.get(i).getLName(),empArray.get(i).getMobile()}},转换成DataVector,你输了,没有权限访问这个数组

  • (如果有理由在您的程序中保存两个相同的数组,那么)使用基于util.List in AbstractTableModel 的数组

【讨论】:

    【解决方案2】:

    新的细节会覆盖旧的细节,而不是被添加到 jtable 的底部。

    首先将所有记录添加到列表中,然后设置模型只设置一次,否则它将覆盖循环中的最后一条。

    示例代码:

    if (action.equals("Display Employee")) {
        List<Object[]> list = new ArrayList<Object[]>();
        for (int i = 0; i < empArray.size(); i++) {
            list.add(new Object[] { 
                                      empArray.get(i).getFName(), 
                                      empArray.get(i).getLName(),
                                      empArray.get(i).getMobile() 
                                  });
    
        }
        table1.setModel(new DefaultTableModel(list.toArray(new Object[][] {}), 
                            new String[] {"First Name", "Surname", "Phone Number"}));
    }
    

    【讨论】:

    • @Braj 你就像我的守护天使,这很完美,但我不得不更改“List list = new ArrayList();”到“ArrayList list = new ArrayList();”为了使代码正常工作,但老兄再次感谢您的输入:)
    • 总是尝试用接口编码。如果将来您想将其更改为List 接口的其他实现,该怎么办。
    【解决方案3】:

    你可以使用DefaultTableModeladdRow()方法,像这样:

    ((DefaultTableModel)table1.getModel()).addRow(new Object[] { 
         empArray.get(i).getFName(),
         empArray.get(i).getLName(),
         empArray.get(i).getMobile()
    });
    

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 2013-12-18
      • 2018-05-28
      • 2021-03-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      相关资源
      最近更新 更多