Java 最佳做法数据库访问-联系人列表
很长一段时间以来,我一直在想,在为这个问题创建一些愚蠢的解决方案的同时,应该如何正确地完成以下工作: 数据表: ID | givenname |姓氏|地址|数据 我想在一个列表框中显示所有givennames+lastnames,在选择一个项目时,我想检索相应数据集的其余部分,并在一些文本框中显示 所以我基本上是这样做的: 1) 查询:从数据表中选择ID、givenname、lastname 2) 创建和ArrayList的“Contact对象”(只是一个具有与DataTable中的列相同的成员的类),我迭代resultset,因此创建了几个ID为、givenname为和lastname为的对象 !!3) 我希望列表框显示givenname+“”+lastname,但在选择“John Doe”时,我希望程序知道这个“John Doe”是arraylist的哪个元素(如果有多个元素),从对象中删除ID并删除他的地址和“数据” 我经常做的事情是“列表框中的第三个约翰·多伊被选中了,让我们在arraylist中寻找第三个约翰·多伊,并向上帝祈祷这是正确的” 这对我来说是非常不必要的 在Java+Swing中有什么可用的解决方案 我希望我能弄清楚我需要什么^^ 问候Java 最佳做法数据库访问-联系人列表,java,database,swing,jtable,jlist,Java,Database,Swing,Jtable,Jlist,很长一段时间以来,我一直在想,在为这个问题创建一些愚蠢的解决方案的同时,应该如何正确地完成以下工作: 数据表: ID | givenname |姓氏|地址|数据 我想在一个列表框中显示所有givennames+lastnames,在选择一个项目时,我想检索相应数据集的其余部分,并在一些文本框中显示 所以我基本上是这样做的: 1) 查询:从数据表中选择ID、givenname、lastname 2) 创建和ArrayList的“Contact对象”(只是一个具有与DataTable中的列相同的成员
Billdoor我想你可以把你的
id
放在一旁。就像在HTML
中使用标签
,我会:
<option value="id">Jonh Doe</option>
johndoe
属性value
中的值将是数据库中的实际Id,文本将是givenname+“”+lastname
这样,我保留了与识别此人相关的信息,并显示了姓名。之后,当用户选择一个项目时,我将从
value
属性中根据id
检索信息库。我认为您可以将id
存储在一旁。就像在HTML
中使用标签
,我会:
<option value="id">Jonh Doe</option>
johndoe
属性value
中的值将是数据库中的实际Id,文本将是givenname+“”+lastname
这样,我保留了与识别此人相关的信息,并显示了姓名。之后,当用户选择一个项目时,我将从
value
属性中检索id
上的信息库。您应该创建一个表格模型来保存数据,并创建渲染器(如果需要)来正确呈现数据。有关详细信息,请参阅。然后在表的选择侦听器中,可以检索相关行。您可以使用TableModel.getValueAt()
或添加助手方法来检索所选数据。下面是一个简单的用户模型示例。应用程序打印所选用户,包括表中不可见的id。模型中有一个方便的方法getUser()
,用于获取特定行的用户。请注意,您也可以使用DefaultTableModel
来处理以下简单场景
import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.AbstractTableModel;
public class UserTableDemo {
public UserTableDemo() {
JFrame frame = new JFrame("UserTable");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final UserModel model = new UserModel();
final JTable table = new JTable();
table.setModel(model);
JScrollPane scrollPane = new JScrollPane(table);
JPanel content = new JPanel(new BorderLayout());
content.add(scrollPane, BorderLayout.CENTER);
final JTextArea output = new JTextArea(5, 30);
content.add(output, BorderLayout.SOUTH);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
UserEntry entry = model.getUser(table
.getSelectedRow());
if (entry != null) {
output.setText("Selected row:"
+ table.getSelectedRow() + " "
+ entry.toString());
} else {
output.setText("");
}
}
}
});
frame.add(content);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
public class UserModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private List<UserEntry> users = new ArrayList<UserEntry>();
public UserModel() {
//TODO - load users
users.add(new UserEntry(3, "John", "Doe"));
users.add(new UserEntry(2, "John", "Doe"));
users.add(new UserEntry(1, "John", "Doe"));
}
public UserEntry getUser(int row) {
if(row >= 0 && row < users.size())
return users.get(row);
return null;
}
@Override
public int getRowCount() {
return users.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
UserEntry entry = users.get(rowIndex);
switch (columnIndex) {
case 0:
return entry.getFirstName();
case 1:
return entry.getLastName();
}
return null;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "First Name";
case 1:
return "Last Name";
}
return null;
}
}
public class UserEntry {
private int id;
private String firstName;
private String lastName;
public UserEntry(int id, String firstName, String lastName) {
super();
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
public int getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
@Override
public String toString() {
return "UserEntry [id=" + id + ", firstName=" + firstName
+ ", lastName=" + lastName + "]";
}
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new UserTableDemo();
}
});
}
}
您应该创建一个表模型来保存数据,如果需要,还应该创建渲染器来正确显示数据。有关详细信息,请参阅。然后在表的选择侦听器中,可以检索相关行。您可以使用
TableModel.getValueAt()
或添加助手方法来检索所选数据。下面是一个简单的用户模型示例。应用程序打印所选用户,包括表中不可见的id。模型中有一个方便的方法getUser()
,用于获取特定行的用户。请注意,您也可以使用DefaultTableModel
来处理以下简单场景
import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.AbstractTableModel;
public class UserTableDemo {
public UserTableDemo() {
JFrame frame = new JFrame("UserTable");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final UserModel model = new UserModel();
final JTable table = new JTable();
table.setModel(model);
JScrollPane scrollPane = new JScrollPane(table);
JPanel content = new JPanel(new BorderLayout());
content.add(scrollPane, BorderLayout.CENTER);
final JTextArea output = new JTextArea(5, 30);
content.add(output, BorderLayout.SOUTH);
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
UserEntry entry = model.getUser(table
.getSelectedRow());
if (entry != null) {
output.setText("Selected row:"
+ table.getSelectedRow() + " "
+ entry.toString());
} else {
output.setText("");
}
}
}
});
frame.add(content);
frame.setLocationByPlatform(true);
frame.pack();
frame.setVisible(true);
}
public class UserModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private List<UserEntry> users = new ArrayList<UserEntry>();
public UserModel() {
//TODO - load users
users.add(new UserEntry(3, "John", "Doe"));
users.add(new UserEntry(2, "John", "Doe"));
users.add(new UserEntry(1, "John", "Doe"));
}
public UserEntry getUser(int row) {
if(row >= 0 && row < users.size())
return users.get(row);
return null;
}
@Override
public int getRowCount() {
return users.size();
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
UserEntry entry = users.get(rowIndex);
switch (columnIndex) {
case 0:
return entry.getFirstName();
case 1:
return entry.getLastName();
}
return null;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "First Name";
case 1:
return "Last Name";
}
return null;
}
}
public class UserEntry {
private int id;
private String firstName;
private String lastName;
public UserEntry(int id, String firstName, String lastName) {
super();
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
}
public int getId() {
return id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
@Override
public String toString() {
return "UserEntry [id=" + id + ", firstName=" + firstName
+ ", lastName=" + lastName + "]";
}
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new UserTableDemo();
}
});
}
}
要显示对象,Swing组件将使用放置在其中的对象的toString()方法。一种常见的方法是创建一个包含名称、ID等的数据类,实现toString()以显示所需内容,然后将这些对象的列表放入JList中。然后在选择时,获取所选项目,将其强制转换为数据类,然后调用getID()。要显示对象,Swing组件将使用toString()方法来显示放置在其中的对象。一种常见的方法是创建一个包含名称、ID等的数据类,实现toString()以显示所需内容,然后将这些对象的列表放入JList中。然后在选择时,获取所选项,将其强制转换到数据类,然后调用getID()