使用Java在Jtable中显示客户的数据

时间:2014-12-22 17:13:09

标签: java mysql swing jtable

我希望在JTable中显示来自MySQL数据库的客户详细信息,但是当我点击“显示”按钮时,我在面板中看不到任何结果。

这是将表添加到JScrollPane的方法:

    void addTable()
    {
        for(int i=0 ; i<myTableModel.getColumnCount();i++)
        {
            myTableModel.getColumnName(i);
        }
       showCustomers();
       table.setModel(myTableModel);//mytablemodel is a object from MyTableModel Class
       scrollPane.add(table); //was on another part of program but i edit it for helping to answers                 
       panel_show.add(scrollPane);
    }

这里是MyTableClass,使用新方法addCustomer实现TableModel。 addCustomer会将Customer添加到CustomerList。我第一次尝试使用ArrayList来显示客户数据,但它不起作用。

此外,columnName将使用数据库中的列名创建表头。

public class MyTableModel implements TableModel
{
    private ArrayList<Customer> customerList;
    private String[] columnName =          
     {"id", "name", "family", "idc", "age", "sex", "balance", "tel", "haveFamily", "population"};
@Override
public int getRowCount()
{
    //return customerList.size();
      return 1;
}

@Override
public int getColumnCount()
{
    return 10;
}

@Override
public String getColumnName(int columnIndex)
{
    return columnName[columnIndex];
}

@Override
public Class<?> getColumnClass(int columnIndex)
{
    if(columnIndex == 0)
        return Integer.class;
    return String.class;
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex)
{
    return false;
}

@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
    if(columnIndex == 0)
        return customerList.get(rowIndex).getId();
    else if(columnIndex == 1)
        return customerList.get(rowIndex).getName();
    else if(columnIndex == 2)
        return customerList.get(rowIndex).getFamily();
    else if(columnIndex == 3)
        return customerList.get(rowIndex).getIdc();
    else if(columnIndex == 4)
        return customerList.get(rowIndex).getDate();
    else if(columnIndex == 5)
        return customerList.get(rowIndex).getSex();
    else if(columnIndex == 6)
        return customerList.get(rowIndex).getBalance();
    else if(columnIndex == 7)
        return customerList.get(rowIndex).getTel();
    else if(columnIndex == 8)
        return customerList.get(rowIndex).isHaveFamily();
    else if(columnIndex == 9)
        return customerList.get(rowIndex).getPopulation();
    else
        return null;
}

public void addCustomer(Customer customer)
{
    CustomerManager customerManager = new CustomerManager();
    customerManager.addCustomer(customer);
    customerList.add(customer);
}

showCustomer方法将打开一个数据库连接并创建一个包含客户的TableModel,然后将其用于我面板上的表。

    public void showCustomers()
    {
    Connection conn = null;
    try
    {
        //String user = "root";
        // String pass = null;
        //String url = "jdbc:mysql://localhost/estate";
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        conn = DriverManager.getConnection("jdbc:mysql://localhost/estate", "root", null);
        Statement st = conn.createStatement();
        ResultSet rs = st.executeQuery("SELECT * from customer");
        //int columnCount = rsmd.getColumnCount();
        while (rs.next())
        {
            myTableModel.addCustomer(new Customer(1,"david","schmidt","0025674433","31","Male","200000","4545552132","true","2");               
     }//Original Form --> Customer({"id","name","family","idc","age",
      // "sex","balance","tel","haveFamily","population"});
    }

MyTableModel中,我创建了一个addCustomer方法,并使用ResultSet填充客户数据。需要吗?

我的问题:如何使用JTable向我的客户展示?

经过一番摆弄后,我现在也遇到了myTableModel.addCustomer(rs.getInt(), ...)的问题。我得到的错误是:

  

addCustomer出错,KEY PRIMARY的重复项'0'

但是,我没有ID为0的客户。

1 个答案:

答案 0 :(得分:2)

  1. 显示JTable时,首先将表格添加到滚动窗格,然后将滚动窗格添加到面板。

  2. 将组件添加到可见GUI时,您需要确保已调用布局管理器,以便组件具有大小和位置。

  3. 所以基本代码是:

    table.setModel(...);
    JScrollPane scrollPane = new JScrollPane( table );
    panel.add( scrollPane );
    panel.revalidate();
    panel.repaint();
    

    另一种方法是创建一个空表,并在首次创建GUI时将滚动窗格添加到GUI。然后你需要的所有代码是:

    table.setModel(...);
    

    编辑:

    您的问题是关于在单击按钮时在面板中显示表格。这就是SSCCE应该做的所有事情。数据来源无关紧要,因此发布处理数据库的代码是完全没必要的,因为我们无法执行代码。自定义TableModel与真实问题无关。

    这是一个简单的SSCCE,它使用我的第二个建议,用新模型更新现有表。每次单击该按钮时,列数都会发生变化。这个simulates从某个地方获取新数据。

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class RefreshSSCCE extends JPanel
    {
        private JTable table = new JTable();
        private int columns = 3;
    
        public RefreshSSCCE()
        {
            setLayout( new BorderLayout() );
    
            JButton refresh = new JButton( "Refresh Data" );
            add(refresh, BorderLayout.NORTH);
    
            refresh.addActionListener( new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    refreshData();
                }
            });
    
            add(new JScrollPane(table), BorderLayout.CENTER);
        }
    
        private void refreshData()
        {
            DefaultTableModel model = new DefaultTableModel(5, columns++);
            table.setModel( model );
        }
    
        private static void createAndShowGUI()
        {
            JFrame frame = new JFrame("Refresh SSCCE");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add( new RefreshSSCCE() );
            frame.setLocationByPlatform( true );
            frame.pack();
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowGUI();
                }
            });
        }
    }
    

    了解代码是多么容易理解?代码完整且在一个类中。它可以轻松复制和粘贴,以便其他人可以测试代码。

    当您简化问题时,解决方案通常会更容易。这就是你花时间创建SSCCE的原因。即使SSCCE没有按照您想要的方式工作,我们也只需要几行代码来了解您正在尝试做什么。没有必要使用SQL代码使问题复杂化。

    获得简单代码后,您可以修改refreshData方法以获取实际数据。这就是硬编码数据的意思。无需动态查询数据库即可演示在面板中显示表格的问题。