gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:23:26 25 4
gpt4 key购买 nike

我想在 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 会将客户添加到 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(), ...) 的问题。我得到的错误是这样的:

Error in addCustomer,Duplicate entry '0' for KEY PRIMARY

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

最佳答案

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

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

所以基本代码是:

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

另一种方法是在首次创建 GUI 时创建一个空表并将滚动 Pane 添加到 GUI。那么您需要的所有代码是:

table.setModel(...);

编辑:

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

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

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 方法来获取真实数据。这就是我所说的硬编码数据的意思。不需要动态查询数据库来演示在面板中显示表格的问题。

关于java - 使用 Java 在 Jtable 中显示客户的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27607304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com